AWS跨账户S3 PutObject加密使用AWS托管密钥时出现访问被拒绝问题

4

我想把Lambda中的一个文本文件从B账户放到A账户的S3存储桶。S3存储桶(test-bucket)使用aws/s3托管密钥进行AWS-KMS加密。 1. 我在A账户的S3存储桶(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. Added below inline policy to my Lambda execution role in Account B:
    {"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托管密钥进行加密,因此我无法编辑KMS策略,对于客户托管密钥的情况,我们该怎么做呢?请有经验的人士指导一下,我漏掉了什么吗?

我怀疑Lambda-B使用的IAM角色没有权限使用与Bucket-A关联的KMS密钥。您展示的Lambda角色(#2)位于Account-B中,但Account-B无法授予对Account-A资源的权限。我想知道是否可以向KMS密钥本身添加权限,以允许Account-B中的IAM角色使用它? - John Rotenstein
@JohnRotenstein 是的,我们可以向KMS密钥本身添加权限,但这只适用于客户管理的密钥。在我的情况下,S3存储桶是使用AWS托管密钥(aws/s3)进行KMS加密的,没有编辑选项。 - AWS_Developer
@JohnRotenstein 有什么建议吗? - AWS_Developer
坦率地说,我认为这是不可能的,因为需要密钥访问,但只能授予相同账户中的实体。 Account-B中的Lambda函数有可能需要假定Account-A中的IAM角色,以便被授权使用KMS访问该存储桶。 - John Rotenstein
3个回答

1

我自己已经调试了几个小时。

我认为在使用SSE-KMS时,使用默认的“AWS托管密钥”是不可能实现的。相反,您必须创建一个CMK,并授予跨帐户用户访问此密钥的权限。

希望这有所帮助。


1
尝试授予您的Lambda函数操作权限。因此,您的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/*"
    }
  ]
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接