作为 Amazon S3 的用户,在尝试访问 S3 存储桶中的对象时,您可能会遇到“访问被拒绝”错误。这些错误表示请求缺少执行所请求操作的有效凭证或权限策略。
在本博文中,我将介绍各种故障排除步骤和配置检查,以解决访问 S3 对象时遇到的“访问被拒绝”错误。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库! |
使用 Amazon Systems Manager 自动化文档
亚马逊云科技提供了两个 Systems Manager 自动化文档,可以帮助诊断您的 S3 存储桶的访问问题:
AmazonSupport-TroubleshootS3PublicRead - 使用此文档检查您的S3存储桶的公有读访问问题。
AmazonSupport-TroubleshootS3AccessSameAccount - 使用此文档诊断从您自己的S3存储桶访问被拒绝的错误。
这些文档根据您的存储桶配置自动运行诊断并提供推荐解决方案。我强烈建议将它们用作首要的故障排除步骤。
要运行这些文档:
-
搜索文档名称。
-
点击“执行自动化”。
-
指定所需的参数,如 S3 存储桶名称。
-
查看结果并实施建议。
自动化文档将检查存储桶策略、对象所有权、用户凭据等方面以识别根本原因。这可以为您节省数小时的手动故障排除时间。
检查存储桶和对象的所有权
如果正在访问的对象与存储桶具有不同的所有者,可能会发生“访问被拒绝”错误。默认情况下,即使上传者将对象上传到您的存储桶,上传者也拥有该对象。
按照以下步骤检查对象所有权:
- 使用 Amazon CLI 获取您的账户的规范 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 对象所有权。
检查存储桶策略和 IAM 策略
仔细检查存储桶策略和 IAM 用户策略,查看是否存在可能无意中拒绝访问的语句。
要注意:
例如,此存储桶策略基于 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,由于未许可该操作,他们将收到“访问被拒绝”错误。
理想情况下,运行亚马逊云科技策略生成器 工具来验证策略没有问题。
如果在标识上设置了 IAM 权限边界,也要检查它们。
检查 S3 公开访问阻止设置
如果在公开对象请求上获得访问被拒绝,请查看账户和存储桶级别的 S3 公开访问阻止设置。这些设置可以覆盖允许公开访问的权限。
使用 S3 控制台检查您的账户和存储桶上的这些设置。
审查用户凭证
确保访问存储桶的 IAM 用户或角色已配置了适当的凭证:
- 对于 CLI,检查配置的凭证:
aws configure list
- 对于 EC2,检查实例所附加的角色:
aws sts get-caller-identity
- 对于通过 STS 获取的临时凭证,检查与所承担角色相关联的会话策略中的S3权限。
检查 VPC 端点策略
如果通过 VPC 端点 访问 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 访问点,访问点策略必须允许访问底层存储桶。 所以要检查访问点策略和存储桶策略。
检查缺失的对象
如果正在访问的对象在存储桶中不存在,S3 会返回“访问被拒绝”错误,而不是 404。检查对象是否实际存在:
aws s3api head-object --bucket mybucket --key myobject
如果它不存在,请解决实际的对象问题。
确认 KMS 加密密钥访问
如果使用 Amazon KMS (SSE-KMS) 加密的 S3 对象无法被拥有有效权限的用户访问,请确保:
- KMS 密钥策略 授予所需的权限(例如 kms:Decrypt)
- 如果 IAM 用户与 KMS 密钥不在同一账户中,IAM 策略也包含KMS权限
指定请求方支付参数
如果启用了存储桶的请求方支付,跨账户用户必须传递 --request-payer
参数:
aws s3 cp s3://mybucket/myobject . --request-payer requester
检查 Amazon Organizations 策略
验证 Amazon Organizations 服务控制策略允许您的账户访问 S3。 明确的拒绝策略将覆盖任何允许策略。
这涵盖了在 S3 对象上排查“访问被拒绝”错误时需要检查的主要方面。 一些要点:
- 使用 Systems Manager 自动化文档自动诊断
- 审查存储桶策略、对象所有权和访问点策略
- 检查 IAM 权限以及 VPC 端点策略等资源策略
- 如果使用临时令牌,验证凭证和会话策略
- 检查对象是否存在及特殊字符
针对您的配置解决这些问题,您就可以访问 S3 对象而不会遇到任何“访问被拒绝”错误。如果您有任何其他故障排除提示,请在评论中让我知道!
参考文献
[2] Amazon S3 请求者支付
[3] Amazon S3 对象所有权
[4] 使用存储桶策略和用户策略
[5] Amazon KMS 密钥策略