为什么跨账户用户在尝试访问通过自定义 AWS KMS 密钥加密的 S3 对象时会收到“访问被拒”错误?
上次更新时间:2021 年 8 月 27 日
我的 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 托管 AWS KMS 密钥(KMS 密钥)策略无法修改,因为它们是只读的。但是,您始终可以查看 AWS 托管 KMS 密钥策略和客户管理的 KMS 密钥策略。由于 AWS 托管 KMS 密钥策略无法更新,因此也无法向这些密钥策略赋予跨账户权限。此外,其他 AWS 账户也无法访问使用 AWS 托管 KMS 密钥进行加密的对象。对于客户管理的 KMS 密钥策略,您只能在创建该策略的 AWS 账户中更改密钥策略。
解决方法
账户 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 中存储桶和密钥的权限
从账户 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"
}
]
}
注意:
- 账户 A 的存储桶策略必须授予账户 B 的访问权。
- 账户 A 中的 AWS KMS 密钥必须与账户 A 中的存储桶位于同一区域中。
- 账户 A 的 AWS KMS 密钥策略必须授予账户 B 中的用户访问权。
- 账户 B 中的 IAM 策略必须同时授予用户访问账户 A 中存储桶和密钥的权限。
有关如何添加或更正 IAM 用户权限的更多信息,请参阅更改 IAM 用户的权限。