为什么跨账户用户在尝试访问我使用 AWS KMS 客户管理密钥加密的 S3 对象时会收到“访问被拒绝”错误?

2 分钟阅读
0

我的 Amazon Simple Storage Service(Amazon S3)存储桶是使用 AWS Key Management Service(AWS KMS)客户管理的密钥加密的。当来自另一个 AWS 账户的用户尝试访问我的存储桶中的对象时,他们会收到“访问被拒绝”错误。

简短描述

要向账户 B 中的用户授予对账户 A 中的 AWS KMS 加密的存储桶的访问权限,请应用以下权限:

  • 账户 A 中的 Amazon S3 存储桶策略必须授予对账户 B 的访问权限。
  • 账户 A 中的 AWS 托管式密钥必须与账户 A 中的 S3 存储桶位于同一 AWS 区域。
  • 账户 A 中的 AWS KMS 密钥政策必须向账户 B 中的用户授予访问权限。
  • 账户 B 中的 AWS Identity and Access Management(IAM)策略必须授予用户对账户 A 中的存储桶和密钥的访问权限。

要解决访问被拒绝错误,请验证这些权限配置是否正确。

**重要事项:**对于客户管理的密钥策略,您只能从创建该策略的账户中更改密钥政策

您必须使用完全合格的 KMS 密钥 ARN 进行存储桶加密设置。如果您使用 KMS 密钥别名,则 AWS KMS 仅在拥有该存储桶的账户(账户 A)中解析密钥。

以下是您用于存储桶加密的完全合格的 AWS KMS 密钥 ARN 的示例:

"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"

以下是您不用于存储桶加密的 AWS KMS 密钥别名的示例:

arn:aws:kms:us-west-2:111122223333:alias/alias-name

解决方法

账户 A 中的存储桶策略必须向账户 B 中的用户授予访问权限

在账户 A 中,查看存储桶策略,确认有一份允许从账户 B 的账户 ID 进行访问的声明。

例如,以下存储桶策略允许 s3:getObject 访问账户 ID 111122223333

{
  "Id": "ExamplePolicy1",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": {
        "AWS": [
          "111122223333"
        ]
      }
    }
  ]
}

账户 A 中的 AWS KMS 密钥政策必须向账户 B 中的用户授予访问权限

AWS KMS 密钥政策必须向账户 B 中的用户授予 kms:Decrypt 操作的权限。例如,要仅向一个 IAM 用户或角色授予密钥访问权限,请使用与以下类似的密钥政策:

{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
            "arn:aws:iam::111122223333:role/role_name"
        ]
    },
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": "*"
}

在账户 A 中,使用 AWS 管理控制台策略视图来查看密钥政策在密钥政策中,找到 “Sid”: “允许使用密钥”。然后,确认账户 B 中的用户在该声明中被列为主体。

如果您没有看到**“Sid”声明: “允许使用密钥”**,然后使用 AWS 管理控制台的默认视图来查看密钥政策。然后,将账户 B 的账户 ID 添加为可以访问密钥的外部账户。

账户 B 中的 IAM 用户策略必须授予用户访问账户 A 中的存储桶和密钥的权限

在账户 B 中,完成以下步骤:

  1. 打开 IAM 控制台
  2. 在账户 B 中打开与该用户关联的 IAM 用户或角色。
  3. 查看适用于 IAM 用户或角色的权限策略列表。
  4. 验证是否应用了授予访问存储桶和密钥的权限的策略。
    **注意:**如果账户 B 中的 IAM 用户或角色已经拥有管理员访问权限,则您无需授予密钥访问权限。以下示例策略授予账户 B 中的 IAM 用户访问对象的权限和使用 KMS 密钥解密存储桶中对象的权限:
    {
        "Version": "2012-10-17",
        "Statement": [{
                "Sid": "ExampleStmt1",
                "Action": [
                    "s3:GetObject"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            },
            {
                "Sid": "ExampleStmt2",
                "Action": [
                    "kms:Decrypt"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:kms:us-west-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            }
        ]
    }

有关如何添加或更正 IAM 用户权限的更多信息,请参阅更改 IAM 用户的权限

相关信息

AWS 策略生成器

AWS 官方
AWS 官方已更新 1 年前