解决访问 Amazon S3 对象时遇到的“访问被拒绝”错误

存储
Amazon Simple Storage Service (S3)
Amazon EC2
Amazon VPC
生成式人工智能
0
1
作为 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 的用户,在尝试访问 S3 存储桶中的对象时,您可能会遇到“访问被拒绝”错误。这些错误表示请求缺少执行所请求操作的有效凭证或权限策略。 在本博文中,我将介绍各种故障排除步骤和配置检查,以解决访问 S3 对象时遇到的“访问被拒绝”错误。 ### 使用 Amazon Systems Manager 自动化文档 亚马逊云科技提供了两个 Systems Manager 自动化文档,可以帮助诊断您的 S3 存储桶的访问问题: **[AmazonSupport-TroubleshootS3PublicRead](https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/automation-awssupport-troubleshoots3publicread.html?trk=cndc-detail)** - 使用此文档检查您的S3存储桶的公有读访问问题。 **[AmazonSupport-TroubleshootS3AccessSameAccount](https://repost.aws/knowledge-center/s3-troubleshoot-403-resource-same-account/?trk=cndc-detail)** - 使用此文档诊断从您自己的S3存储桶访问被拒绝的错误。 这些文档根据您的存储桶配置自动运行诊断并提供推荐解决方案。我强烈建议将它们用作首要的故障排除步骤。 要运行这些文档: 1. 打开 [Amazon Systems Manager 控制台](https://console.aws.amazon.com/systems-manager/?trk=cndc-detail),进入[自动化部分](https://console.aws.amazon.com/systems-manager/automation/automations?trk=cndc-detail)。 2. 搜索文档名称。 3. 点击“执行自动化”。 4. 指定所需的参数,如 S3 存储桶名称。 5. 查看结果并实施建议。 自动化文档将检查存储桶策略、对象所有权、用户凭据等方面以识别根本原因。这可以为您节省数小时的手动故障排除时间。 ### 检查存储桶和对象的所有权 如果正在访问的对象与存储桶具有不同的所有者,可能会发生“访问被拒绝”错误。默认情况下,即使上传者将对象上传到您的存储桶,上传者也拥有该对象。 按照以下步骤检查对象所有权: 1. 使用 [Amazon CLI](https://aws.amazon.com/cli/?trk=cndc-detail) 获取您的账户的规范 ID: ``` aws s3api list-buckets --query "Owner.ID" ``` 2. 获取对象所有者的规范 ID: ``` aws s3api list-objects --bucket mybucket --prefix myobject ``` 3. 如果ID不匹配,对象所有者必须授予您完全控制的 ACL: ``` aws s3api put-object-acl --bucket mybucket --key myobject --acl bucket-owner-full-control ``` 4. 通过将对象复制给自己来更新对象所有权: ``` aws s3 cp s3://mybucket/myobject s3://mybucket/myobject ``` 为了防止未来发生此问题,要求在对象上传上设置 bucket-owner-full-control ACL,并启用 [S3 对象所有权](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/about-object-ownership.html?trk=cndc-detail)。 ### 检查存储桶策略和 IAM 策略 仔细检查存储桶策略和 [IAM 用户策略](https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies.html?trk=cndc-detail),查看是否存在可能无意中拒绝访问的语句。 要注意: - 包含[多重认证](https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_mfa.html?trk=cndc-detail)、IP 地址、[VPC](https://aws.amazon.com/cn/vpc/?trk=cndc-detail) 等条件的拒绝语句 - 缺少诸如 s3:GetObject 或 s3:PutObjectAcl 之类的操作 - [ARN](https://docs.aws.amazon.com/zh_cn/general/latest/gr/aws-arns-and-namespaces.html?trk=cndc-detail) 中存在额外的空格或拼写错误 - 过于限制性的主体元素 例如,此存储桶策略基于 VPC 拒绝访问: ``` { "Id": "Policy1234567890123", "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*", "Principal": "*" }, { "Sid": "Statement2", "Action": [ "s3:GetObject" ], "Effect": "Deny", "Resource": "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "StringNotEquals": { "aws:SourceVpce": "vpce-1a2b3c4d" } }, "Principal": "*" } ] } ``` 在上述策略中,Statement1 允许获取对象。 但如果请求不是来自 VPC 端点 vpce-1a2b3c4d,则 Statement2 拒绝相同的 GET 访问。 因此,在该 VPC 端点之外的用户将收到“访问被拒绝”错误。 而此策略缺少关键的 s3:PutObjectAcl 操作: ``` { "Id": "Policy1234567890123", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234567890123", "Action": [ "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*", "Principal": { "AWS": [ "arn:aws-cn:iam::111122223333:user/Dave" ] } } ] } ``` 上述策略仅允许 s3:PutObject 操作。 如果用户尝试使用 s3:PutObjectAcl 修改对象的 ACL,由于未许可该操作,他们将收到“访问被拒绝”错误。 理想情况下,运行[亚马逊云科技策略生成器](https://awspolicygen.s3.amazonaws.com/policygen.html?trk=cndc-detail) 工具来验证策略没有问题。 如果在标识上设置了 [IAM 权限边界](https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_boundaries.html?trk=cndc-detail),也要检查它们。 ### 检查 S3 公开访问阻止设置 如果在公开对象请求上获得访问被拒绝,请查看账户和存储桶级别的 [S3 公开访问阻止](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/access-control-block-public-access.html?trk=cndc-detail)设置。这些设置可以覆盖允许公开访问的权限。 使用 S3 控制台检查您的账户和存储桶上的这些设置。 ### 审查用户凭证 确保访问存储桶的 IAM 用户或角色已配置了适当的凭证: - 对于 [CLI](https://aws.amazon.com/cn/cli/?trk=cndc-detail),检查配置的凭证: ``` aws configure list ``` - 对于 [EC2](https://aws.amazon.com/cn/ec2/?trk=cndc-detail),检查实例所附加的角色: ``` aws sts get-caller-identity ``` - 对于通过 [STS](https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_temp.html?trk=cndc-detail) 获取的临时凭证,检查与所承担角色相关联的会话策略中的S3权限。 ### 检查 VPC 端点策略 如果通过 [VPC 端点](https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/vpc-endpoints.html?trk=cndc-detail) 访问 S3,请确保端点策略授予所需的权限。该策略控制可以通过该端点访问的存储桶/对象。 例如: ``` { "Id": "Policy1234567890123", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234567890123", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET", "arn:aws-cn:s3:::DOC-EXAMPLE-BUCKET/*" ], "Principal": "*" } ] } ``` 上述 VPC 端点策略: - 允许在 DOC-EXAMPLE-BUCKET 存储桶中获取、放置和列出对象 - 使用通配符允许访问该存储桶中的任何对象 - 应用于通过 VPC 端点访问的所有委托人 - 但仅允许访问 DOC-EXAMPLE-BUCKET 存储桶 ### 检查 S3 访问点策略 如果使用 [S3 访问点](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-points.html?trk=cndc-detail),访问点策略必须允许访问底层存储桶。 所以要检查访问点策略和存储桶策略。 ### 检查缺失的对象 如果正在访问的对象在存储桶中不存在,S3 会返回“访问被拒绝”错误,而不是 404。检查对象是否实际存在: ``` aws s3api head-object --bucket mybucket --key myobject ``` 如果它不存在,请解决实际的对象问题。 ### 确认 KMS 加密密钥访问 如果使用 [Amazon KMS (SSE-KMS) 加密](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/UsingKMSEncryption.html?trk=cndc-detail)的 S3 对象无法被拥有有效权限的用户访问,请确保: - [KMS 密钥策略](https://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/key-policies.html?trk=cndc-detail) 授予所需的权限(例如 kms:Decrypt) - 如果 IAM 用户与 KMS 密钥不在同一账户中,IAM 策略也包含KMS权限 ### 指定请求方支付参数 如果启用了存储桶的[请求方支付](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/RequesterPaysBuckets.html),跨账户用户必须传递 `--request-payer` 参数: ``` aws s3 cp s3://mybucket/myobject . --request-payer requester ``` ### 检查 Amazon Organizations 策略 验证 [Amazon Organizations](https://aws.amazon.com/cn/organizations/) 服务控制策略允许您的账户访问 S3。 明确的拒绝策略将覆盖任何允许策略。 这涵盖了在 S3 对象上排查“访问被拒绝”错误时需要检查的主要方面。 一些要点: - 使用 Systems Manager 自动化文档自动诊断 - 审查存储桶策略、对象所有权和访问点策略 - 检查 IAM 权限以及 VPC 端点策略等资源策略 - 如果使用临时令牌,验证凭证和会话策略 - 检查对象是否存在及特殊字符 针对您的配置解决这些问题,您就可以访问 S3 对象而不会遇到任何“访问被拒绝”错误。如果您有任何其他故障排除提示,请在评论中让我知道! ## 参考文献 [1] [排查 Amazon S3 访问被拒错误](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/troubleshooting.html#troubleshooting-access-denied-errors?trk=cndc-detail) [2] [Amazon S3 请求者支付](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/RequesterPaysBuckets.html?trk=cndc-detail) [3] [Amazon S3 对象所有权](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/about-object-ownership.html?trk=cndc-detail) [4] [使用存储桶策略和用户策略](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/using-iam-policies.html?trk=cndc-detail) [5] [Amazon KMS 密钥策略](https://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/key-policies.html?trk=cndc-detail)
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
1
目录
关闭