为什么跨账户用户在尝试访问通过自定义 AWS KMS 密钥加密的 S3 对象时会收到 Access Denied(访问被拒)错误?

2 分钟阅读
0

我的 Amazon Simple Storage Service (Amazon S3) 存储桶由自定义 AWS Key Management Service (AWS KMS) 密钥加密。当来自另一个 AWS 账户的用户尝试访问我存储桶中的对象时,他们收到“访问被拒”错误。如何解决此问题?

简短描述

要授权账户 B 中的用户访问账户 A 中的 AWS KMS 加密存储桶,您必须拥有以下权限:

  • 账户 A 的存储桶策略必须授予账户 B 的访问权。
  • 账户 A 的 AWS KMS 密钥策略必须授予账户 B 中的用户访问权。
  • 账户 B 的 AWS Identity and Access Management (IAM) 策略必须同时授予用户访问账户 A 中的存储桶和 AWS KMS 密钥的权限。

要对访问被拒绝错误进行问题排查,请验证这些权限均已正确设置。

**警告:**AWS 托管 AWS KMS 密钥策略无法修改,因为它们是只读的。但是,您始终可以查看 AWS 托管 KMS 密钥策略和客户管理的 KMS 密钥策略。由于 AWS 托管 KMS 密钥策略无法更新,因此也无法向这些密钥策略赋予跨账户权限。此外,其他 AWS 账户也无法访问使用 AWS 托管 KMS 密钥进行加密的对象。对于客户管理的 KMS 密钥策略,您只能在创建该策略的 AWS 账户中更改密钥策略

如果指定自己的 AWS KMS 密钥(客户托管的 KMS 密钥),则必须使用完全合格的 AWS KMS 密钥 ARN 进行存储桶加密设置。使用 AWS KMS 密钥别名时,AWS KMS 将仅在存储桶拥有者账户(账户 A)中解析密钥。

请使用:

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

不要使用:

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”: “允许使用密钥”,则切换到使用控制台默认视图查看密钥策略。然后,将账户 B 的账户 ID 添加为有权访问密钥的外部账户。

账户 B 中的 IAM 用户策略必须同时授予用户访问账户 A 中存储桶和 AWS KMS 密钥的权利

从账户 B 中,执行以下步骤:

1.    打开 IAM console(IAM 控制台)。

2.    在账户 B 中打开与该用户关联的 IAM 用户或角色。

3.    查看应用于 IAM 用户或角色的权限策略列表。

4.    确认应用了同时向存储桶和 AWS KMS 密钥授予访问权的策略。

**注意:**如果账户 B 中的 IAM 用户或角色已经具有管理员访问权限,则您不需要授予对密钥的访问权。

以下示例策略向账户 B 中的 IAM 用户授予对对象和 AWS 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"
    }
  ]
}

注意:

  • 账户 A 的存储桶策略必须授予账户 B 的访问权。
  • 账户 A 中的 AWS KMS 密钥必须与账户 A 中的存储桶位于同一区域中。
  • 账户 A 的 AWS KMS 密钥策略必须授予账户 B 中的用户访问权。
  • 账户 B 中的 IAM policy 必须同时授予用户访问账户 A 中存储桶和 AWS KMS 密钥的权限。

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


相关信息

AWS Policy Generator

相关视频

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