如何解决来自其他 AWS 账户的 IAM 用户尝试访问我的 Amazon S3 存储桶时出现的“Access Denied”(访问被拒绝)错误?
我的 Amazon Simple Storage Service (Amazon S3) 存储桶策略可授予对其他 AWS 账户的完全访问权限。但是,当来自该账户的 AWS Identity and Access Management (IAM) 用户尝试访问我的存储桶时,他们收到“Access Denied”(访问被拒绝)错误。
简短描述
如果您的存储桶策略已授予对其他账户的访问权限,则跨账户用户可能会因以下原因收到 Access Denied(访问被拒绝)错误:
- 用户的 IAM 策略未授予对存储桶的访问权限。
- 您已使用 AWS Key Management Service (AWS KMS) 加密对象,用户无权访问 AWS KMS 密钥。
- 存储桶策略或 IAM 策略中的拒绝语句会阻止用户的访问。
- Amazon Virtual Private Cloud (Amazon VPC) 端点策略会阻止对存储桶的访问。
- AWS Organizations 服务控制策略 (SCP) 会阻止对存储桶的访问。
- 对象不属于拥有存储桶的账户。
- 您对 Amazon S3 存储桶已启用 Requester Pays。
- 您传递的一项会话策略已阻止对存储桶的访问。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
用户的 IAM 策略未授予对存储桶的访问权限
对于跨账户访问,请确保在用户账户的 IAM 策略和您账户的存储桶策略中授予存储桶访问权限。
要向用户账户中的 IAM 策略添加存储桶权限,请完成以下步骤:
- 打开 IAM 控制台。
- 在导航窗格中,选择无法访问存储桶的 IAM 用户或角色。
- 在 Permissions policies(权限策略)中,展开每个策略以查看其 JSON 策略文档。
- 在包含存储桶名称的 JSON 策略文档中,确认策略允许对存储桶执行正确的 S3 操作。
- 如果 IAM 用户或角色未授予对存储桶的访问权限,请添加策略来授予正确的权限。
以下示例 IAM 策略向用户授予从 DOC-EXAMPLE-BUCKET 的 GetObject 请求中下载对象的访问权限:{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt", "Action": "s3:GetObject", "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }
**注意:**如果您使用实例配置文件或代入角色,请确保您的策略具有正确的权限。
您已使用 AWS KMS 加密对象
如果 IAM 策略和存储桶策略都授予跨账户访问权限,请检查存储桶是否使用 AWS KMS 进行默认加密。或者,检查对象的属性是否使用了 AWS KMS 加密。如果您已使用 KMS 密钥加密对象,则用户还必须拥有使用该密钥的权限。
要授予 IAM 用户下载和上传到存储桶以及使用 AWS KMS 密钥的权限,请完成以下步骤:
-
编辑 KMS 密钥策略以添加以下语句:
{ "Sid": "ExampleStmt", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/Jane" }, "Resource": "*" }
**注意:**将示例 ARN 替换为您的主体的 ARN。
-
如果 AWS KMS 密钥属于 IAM 用户账户,则无需更新密钥策略。如果 AWS KMS 密钥属于您的账户,则您必须更新 IAM 用户的权限才能添加以下 IAM 策略语句:
{ "Sid": "KMSAccess", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Effect": "Allow", "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd" }
**注意:**将示例 KMS 密钥的 ARN 替换为您的 KMS 密钥的 ARN。
有关详细信息,请参阅为什么跨账户用户在尝试访问我使用 AWS KMS 客户自主管理型密钥加密的 S3 对象时会收到 Access Denied(访问被拒绝)错误?
策略中的 Deny 语句会阻止用户的访问
检查存储桶策略和用户的 IAM 策略,查看是否有任何显式拒绝用户访问存储桶的语句。
要检查存储桶策略,请完成以下步骤:
- 打开 Amazon S3 控制台。
- 从存储桶列表中选择您要检查其策略的存储桶。
- 选择 Permissions(权限)选项卡。
- 在 Bucket policy(存储桶策略)中,检查是否存在带有 "Effect": "Deny" 的语句。
- 修改存储桶策略以删除任何拒绝用户访问存储桶的任何 "Effect": "Deny" 语句。
要检查用户的 IAM 策略,请完成以下步骤:
- 打开 IAM 控制台。
- 在导航窗格中,选择无法访问存储桶的 IAM 用户或角色。
- 在 Permissions policies(权限策略)中,展开每个策略以查看 JSON 策略文档。
- 在与 S3 存储桶相关的 JSON 策略文档中,检查是否有包含 "Effect": "Deny" 的语句。
- 修改用户的 IAM 权限策略以删除拒绝用户访问存储桶的 "Effect": "Deny" 语句。
VPC 端点策略阻止对存储桶的访问权限
如果用户使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例通过 VPC 端点访问存储桶,请检查 VPC 端点策略。确认 VPC 端点策略包含访问 S3 存储桶的正确权限。
以下 VPC 端点策略示例允许访问 DOC-EXAMPLE-BUCKET:
{ "Id": "Policy1234567890123", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234567890123", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Principal": "*" } ] }
**警告:**元素 "Principal": "*" 授予使用 VPC 端点的每个人对存储桶的访问权限。确保根据您的用例限制 Principal(主体)值的范围。
Organizations SCP 阻止对存储桶的访问权限
如果用户账户使用 Organizations,请检查 SCP 中是否有阻止访问存储桶的 Deny 语句。
以下示例策略明确拒绝访问 Amazon S3:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:*", "Resource": "*" } ] }
对象不属于拥有存储桶的账户
默认情况下,上传对象的账户拥有该对象,即使另一个账户拥有该存储桶也是如此。存储桶的权限不会自动应用于其他账户拥有的对象。
要解决来自 S3 对象所有权的 Access Denied(访问被拒绝)错误,请遵循以下最佳实践:
- 对 S3 对象所有权应用存储桶所有者强制设置以关闭存储桶的访问控制列表 (ACL)。
- 如果您不想关闭 ACL 以强制实施新对象的对象所有权,请应用存储桶所有者首选设置。确保更新存储桶策略,要求对您的存储桶的所有 PUT 请求使用存储桶所有者完全控制标准 ACL。对象所有者可以运行以下 put-object-acl 来向存储桶所有者授予访问权限:
**注意:**要访问对象,对象所有者必须向存储桶所有者显式授予访问权限。使用对象所有者账户运行前面的命令。aws s3api put-object-acl --bucket examplebucket --key keyname --acl bucket-owner-full-control
您已开启 Requester Pays
如果您为存储桶开启了 Requester Pays,则来自其他账户的用户必须指定 x-amz-request-payer 参数。
用户必须执行以下操作:
- 对于 DELETE、GET、HEAD、POST 和 PUT 请求,在标头中包含 x-amz-request-payer : requester。
- 对于签名 URL,在请求中包含 x-amz-request-payer=requester。
- 对于 AWS CLI 命令,包含 --request-payer 参数:
aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester
会话策略已阻止对存储桶的访问
确保您传递的会话策略不会阻止对 S3 存储桶的访问。
相关信息

相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前