微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 org.apache.hadoop.fs.s3a.S3AFileSystem API 使用 KMS 访问 AWS S3

如何解决如何从 org.apache.hadoop.fs.s3a.S3AFileSystem API 使用 KMS 访问 AWS S3

我配置了 EC2

  <property>
     <name>fs.s3a.aws.credentials.provider</name>
    <value>com.amazonaws.auth.InstanceProfileCredentialsProvider</value>
  </property>
 <property>
    <name>fs.s3a.server-side-encryption-algorithm</name>
    <value>SSE-KMS</value>
  </property>
 <property>
    <name>fs.s3a.server-side-encryption.key</name>
    <value>arn:aws:kms:zz-jjbbcc-1:123432:key/AABBCC</value>
  </property>

使用 core-site.xml 中的此配置,我可以轻松地在 S3 中放置文件创建文件夹(通过 aws cli),而无需提供任何身份验证详细信息,因为我已经在 core-site 中进行了配置.xml

现在我想使用 S3AFileSystem 访问 S3 存储桶并创建文件夹,但是当我调用

S3AFileSystem fs  
fs.mkdirs(somepath); // this will create folder in S3. 
Its throwing Accessdenied 403 Exception. 


java.nio.file.AccessDeniedException: s3a://xxx-xxx/xxx/.FolderIwantToCreate: innerMkdirs on s3a://xxx-xxx/xxx/.FolderIwantToCreate: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXX; S3 Extended Request ID: xxxxxxxxxxxxx=),S3 Extended Request ID: /XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
    at org.apache.hadoop.fs.s3a.S3AUtils.translateException(S3AUtils.java:174) ~[hadoop-aws-2.9.2.jar:?]
    at org.apache.hadoop.fs.s3a.S3AUtils.translateException(S3AUtils.java:117) ~[hadoop-aws-2.9.2.jar:?]
    at org.apache.hadoop.fs.s3a.S3AFileSystem.mkdirs(S3AFileSystem.java:1683) ~[hadoop-aws-2.9.2.jar:?]
    at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:2216) ~[hadoop-common-2.9.2.jar:?]

但是在调试时,我尝试了

((S3AFileSystem) fs).delete(path,true)  

其中路径有 s3://MyBUCKET/SOMEFOLDER/ 令人惊讶的是 SOMEFOLDER 被删除

我错过了任何配置吗? S3(使用 KMS 启用)并且没有任何存储桶策略,IAM 在 S3 上拥有完全访问权限。

EC2 具有 IAM 角色,该角色具有以下策略:
S3 访问:

{
    "Version": "2012-10-17","Statement": [
        {
            "Effect": "Allow","Action": "s3:*","Resource": "*"
        }
    ]
}  

知识管理系统政策:

{
    "Version": "2012-10-17","Action": [
                "kms:Createalias","kms:CreateKey","kms:Deletealias","kms:Describe*","kms:Generaterandom","kms:Get*","kms:List*","kms:TagResource","kms:UntagResource","iam:ListGroups","iam:ListRoles","iam:ListUsers"
            ],"Resource": "*"
        }
    ]
}  

S3 Bucket 没有任何策略。

S3 Permission

解决方法

我会查看您的 KMS 密钥策略。我看到了两件事:

  1. 关键政策是“王道”。当涉及到该特定密钥时,它们甚至会覆盖 IAM 策略。此密钥策略无法使用 IAM 委派/授予 KMS 对此密钥的权限。使用此策略,即使 IAM 策略授予使用此特定 KMS 密钥的权限,它们也会被忽略,尽管 IAM 服务不会表明这一点。有关详细信息,请参阅此处“默认密钥策略”下的示例:https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html

  2. 如果您将密钥存储在 S3 中,我认为您需要 kms:GenerateDataKey,可能还需要 kms:decrypt 权限,具体取决于服务将如何验证它成功写入文件的方式。有时,在设置此基础服务后,它会快速写入和读取您从未见过的临时文件,以确保权限到位。请参阅此处的相关链接,了解在为 CMK 使用该服务时 KMS 需要哪些 S3 权限:https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-access-default-encryption/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。