Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
为什么我无法访问 Amazon S3 桶中的特定文件夹或文件?
我无法访问我的 Amazon Simple Storage Service(Amazon S3)桶中的特定前缀或对象,但我可以访问该桶中的其他数据。
简短描述
请检查任何拒绝您访问该前缀或对象的设置中的以下权限:
- 前缀或对象的所有权
- 桶策略中的限制
- 您的 AWS Identity and Access Management(IAM)用户策略中的限制
- 对 AWS Key Management Service(AWS KMS)加密的对象的权限
此外,还请注意以下访问条件:
- 如果使用 AWS KMS 密钥加密对象,则只有加密该对象的 AWS 账户才能读取该对象。
- 如果定义了权限边界和会话策略,则可能会影响请求者的最大权限。因此,也可能会影响对象访问。
- 限制可能会在其他策略中指定,例如 VPC 端点策略和服务控制策略(SCP)。因此,请检查这些策略并相应进行更新。
- 您还可以使用 Amazon S3 对象所有权控制上传对象的所有权。如果将对象所有权设为 BucketOwnerPreferred,则具有 bucket-owner-full-control 预装 ACL 的账户写入的对象可以转移至桶拥有者。
解决方法
前缀或对象的所有权
默认情况下,S3 对象归上传此对象的 AWS 账户所有。即使桶由另一个账户拥有,也是如此。如果其他账户向您的桶上传对象,请执行以下步骤以获取您无法访问的对象或前缀的权限:
-
运行此 AWS 命令行界面(AWS CLI)命令以获取您账户的 Amazon S3 规范 ID:
aws s3api list-buckets --query Owner.ID
-
运行此命令以获取您无法访问的对象所属账户的 Amazon S3 规范 ID:
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
-
如果规范 ID 不匹配,则您(桶拥有者)不拥有该对象。对于单个对象,对象拥有者可以运行 put-object-acl 命令,授予您完全控制权限:
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
对于前缀中的对象,对象拥有者必须在操作过程中重新复制前缀,并授予您对相关对象的完全控制权限。例如,对象拥有者可以使用 --acl bucket-owner-full-control 参数运行此 cp 命令:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/abc/ s3://DOC-EXAMPLE-BUCKET/abc/ --acl bucket-owner-full-control --recursive --storage-class STANDARD
提示: 您可以使用桶策略,要求其他账户向您授予对他们上传到您的桶的对象的所有权。
桶策略中的限制
-
打开 Amazon S3 控制台。
-
从桶列表中打开您要审查其策略的桶。
-
选择权限选项卡。
-
选择桶策略。
-
搜索带有 "Effect": "Deny" 的语句。然后审查提及您无法访问的前缀或对象的语句。例如,下面的桶策略将拒绝所有人访问 DOC-EXAMPLE-BUCKET 中的 abc/* 前缀:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "StatementPrefixDeny", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "s3:*", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/abc/*" } ] }
-
修改桶策略以编辑或删除任何错误拒绝您访问该前缀或对象的任何 "Effect": "Deny" 语句。
您的 IAM 用户策略中的限制
-
打开 IAM 控制台。
-
在控制台中,打开您用来访问该前缀或对象的 IAM 用户或角色。
-
在 IAM 用户或角色的权限选项卡中,展开每个策略查看其 JSON 策略文档。
-
在 JSON 策略文档中,搜索与 Amazon S3 访问相关的策略。然后,在这些策略中搜索任何阻止您访问该前缀或对象的 "Effect": "Deny" 语句。
例如,以下 IAM 策略含有一个 "Effect": "Deny" 语句,它会阻止该 IAM 身份访问 DOC-EXAMPLE-BUCKET 中的前缀 abc/*。此外,该策略还含有一个 "Effect": "Allow" 语句,它会授予对 DOC-EXAMPLE-BUCKET 的访问权限。尽管该 allow 语句适用于整个桶,但显式拒绝语句阻止了该 IAM 身份访问前缀 abc/*:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "StatementPrefixDeny", "Effect": "Deny", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/abc/*" ] }, { "Sid": "StatementFullPermissionS3", "Effect": "Allow", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }
-
修改策略以编辑或删除错误拒绝您访问该前缀或对象的任何 "Effect": "Deny" 语句。
对 AWS KMS 加密的对象的权限
如果某个对象使用了 AWS KMS 密钥进行加密,则您同时需要该对象和该密钥的权限。检查您无法访问该对象的原因是否是因为您需要 AWS KMS 密钥的权限:
-
使用 Amazon S3 控制台查看您无法访问的某个对象的属性。查看对象的加密属性。
-
如果对象使用自定义 AWS KMS 密钥进行加密,请查看密钥政策。确认密钥政策允许您的 IAM 身份执行以下操作:
"Action": ["kms:Decrypt"]
-
如果您的 IAM 身份缺少以下任何操作的权限,请修改密钥政策以授予缺失的权限。
**重要事项:**如果您的 IAM 身份和 AWS KMS 密钥属于不同的账户,请进行检查以确保您拥有适当的权限。您的 IAM 和密钥政策都必须向您授予所需 AWS KMS 操作的权限。
相关信息
为何我无法访问由其他 AWS 账户上传到我的 Amazon S3 桶的对象?
