首页 > 解决方案 > 由 AWS Managed Key 加密的 AWS Cross Account S3 PutObject 中的访问被拒绝问题

问题描述

我正在尝试将来自账户 B 中的 Lambda 的文本文件放入账户 A 中的 S3 存储桶中。S3 存储桶(测试存储桶)正在启用 AWS-KMS 加密并启用了 aws/s3 托管密钥。1.我在Account A-S3 bucket(test-bucket)中添加了以下权限:

   ```
    {"Version": "2012-10-17",
         "Id": "ExamplePolicy",
         "Statement": [
             {
                 "Sid": "ExampleStmt",
                 "Effect": "Allow",
                 "Principal": {
                     "AWS": "arn:aws:iam::AccountB:role/Lambda-Role"
                 },
                 "Action": "s3:*",
                 "Resource": "arn:aws:s3:::test-bucket/*"
             }
         ]
        }
  1. 在账户 B 中为我的 Lambda 执行角色添加了以下内联策略:
    {"Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "kms:Decrypt",
                    "kms:Encrypt",
                    "kms:GenerateDataKey",
                    "kms:DescribeKey",
                    "kms:ReEncrypt*"
                ],
                "Resource": [
                    "arn:aws:kms:us-west-2:AccountA:key/AWS-KMS-ID"
                ]
            }
        ]
    }
    

这是我的 Lambda 代码:

    res = s3.put_object(
                    Body=message,
                    Key=file_name,
                    Bucket='test-bucket',
                    ACL='bucket-owner-full-control'
                )
    

从账户 B Lambda 运行此代码时出现以下错误:

    An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

由于 S3 存储桶是由 AWS Managed Key 加密的,所以我无法编辑 KMS 策略,我们在使用 Customer Managed Key 的情况下会做什么。

有人请指导我我错过了什么。

标签: python-3.xamazon-web-servicesamazon-s3aws-lambdaamazon-iam

解决方案


尝试授予您的 lambda 函数s3:PutObject操作权限。所以你的 lambda 角色的内联策略应该是这样的

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey",
        "kms:ReEncrypt*"
      ],
      "Resource": [
        "arn:aws:kms:us-west-2:AccountA:key/AWS-KMS-ID"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::test-bucket/*"
    }
  ]
}

推荐阅读