【问题标题】:How to access AWS S3 with KMS from org.apache.hadoop.fs.s3a.S3AFileSystem API如何从 org.apache.hadoop.fs.s3a.S3AFileSystem API 使用 KMS 访问 AWS S3
【发布时间】:2021-06-17 06:48:31
【问题描述】:

我已经配置了 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": "*"
        }
    ]
}  

KMS 政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "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 存储桶没有任何策略。

【问题讨论】:

  • 您的 EC2 实例是否附加了角色?它是否有权访问 S3?不确定 S3AFileSystem 本身,但您应该确保它能够自动收集凭据(例如,像 s3 客户端一样)或手动传递凭据...
  • @StefanN 是的 EC2 具有 S3Full 和 KMS 完全访问权限
  • 您能否也发布您的相关 IAM 和 S3 政策?另外,您如何将凭据传递给您的 S3 客户端?
  • @StefanN 更新了问题,我没有将凭据传递给您的 S3 客户端,我希望它会自动获取(就像 cli 一样)
  • 请正确格式化代码sn-ps!很难阅读,但我在您的 IAM 政策中看到了一个错误。指定操作的正确方法是"Action": "s3:*"(您的策略缺少“*”)

标签: amazon-web-services amazon-s3 amazon-ec2 aws-java-sdk amazon-kms


【解决方案1】:

我会查看您的 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/

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 2021-09-15
    • 2016-02-09
    • 2018-04-04
    • 2016-06-15
    • 2022-07-07
    • 2019-09-12
    • 2016-11-23
    • 2019-11-10
    相关资源
    最近更新 更多