在线客服

AWS S3存储桶策略导致跨账号访问权限被拒绝的排查思路

⏱️2026-05-23 09:00 👁️4

AWS S3跨账号访问被拒?🤔别慌,咱们来排查!

遇到 S3 跨账号访问权限问题,是不是感觉头大?🤯 别担心,跟着我一步步来,把问题揪出来!

第一步:检查存储桶策略(Bucket Policy)🔒

存储桶策略是控制访问权限的关键!

  1. 确认策略是否存在: 登录到拥有 S3 存储桶的 AWS 账号,打开 S3 控制台,找到你的存储桶,查看“权限”选项卡下的“存储桶策略”。
  2. 策略内容是否正确: 仔细检查策略的内容。你需要确保策略允许来自其他账号的访问。下面是一个示例,允许账号 123456789012 读取存储桶中的所有对象:
                    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::123456789012:root"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::your-bucket-name/*"
            }
        ]
    }
                    
                
    • Effect: 必须是 Allow
    • Principal: 指定允许访问的 AWS 账号。可以使用账号 ID 的 ARN(如上例)或者 IAM 角色 ARN。
      • 如果是允许整个账号访问,使用 arn:aws:iam::123456789012:root
      • 如果是允许特定 IAM 角色访问,使用 arn:aws:iam::123456789012:role/YourRoleName
    • Action: 指定允许的操作。例如:
      • s3:GetObject:允许读取对象。
      • s3:PutObject:允许上传对象。
      • s3:ListBucket:允许列出存储桶内容。
      • s3:*:允许所有 S3 操作(谨慎使用!)。
    • Resource: 指定策略应用的资源。
      • arn:aws:s3:::your-bucket-name/*:应用于存储桶中的所有对象。
      • arn:aws:s3:::your-bucket-name:应用于存储桶本身。
  3. 检查是否有显式拒绝(Deny)语句: 存储桶策略中如果有显式拒绝语句,可能会覆盖允许语句。确保没有拒绝来自目标账号的访问。
                    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Deny",
                "Principal": {
                    "AWS": "arn:aws:iam::123456789012:root"
                },
                "Action": "s3:*",
                "Resource": "arn:aws:s3:::your-bucket-name/*"
            }
        ]
    }
                    
                

    这个例子明确拒绝了账号 123456789012 访问存储桶中的任何对象。

第二步:检查 IAM 角色/用户的权限策略 🤔

在访问 S3 存储桶的 AWS 账号中,检查发起请求的 IAM 角色或用户的权限策略。

  1. 确认 IAM 角色/用户拥有访问 S3 的权限: 权限策略需要允许访问目标存储桶。
                    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::your-bucket-name/*"
            }
        ]
    }
                    
                
    • 同样要关注 EffectActionResource
    • Action 必须包含你需要的操作,例如 s3:GetObject
    • Resource 必须匹配你要访问的 S3 资源。
  2. 检查是否有显式拒绝语句: 类似存储桶策略,IAM 权限策略中也可能存在拒绝语句,需要仔细检查。

第三步:检查对象所有权 🔑

S3 对象所有权可能会影响跨账号访问。

  1. 对象所有者: 默认情况下,上传对象的账号是对象的所有者。即使存储桶策略允许其他账号访问,如果对象的所有者不是存储桶所有者,也可能导致访问被拒绝。
  2. ACL(访问控制列表): 检查对象的 ACL。确保目标账号或 IAM 角色拥有读取对象的权限。 可以使用S3控制台查看对象ACL。
                     S3 ACL Example
                
  3. 存储桶所有者强制执行: 启用“存储桶所有者强制执行”可以简化权限管理。 启用后,所有对象都归存储桶所有者所有,访问权限仅由存储桶策略控制。 在S3控制台,选择存储桶,然后选择“权限”选项卡,在“对象所有权”下找到“存储桶所有者强制执行”设置。
                     Bucket Owner Enforced
                

第四步:检查 IAM 角色/用户 Session Policies 🎭

如果IAM用户/角色在AssumeRole时使用了Session Policies,会进一步限制权限。

  1. 确认Session Policies没有限制S3访问: 检查AssumeRole时的Session Policies是否意外地拒绝了对S3存储桶的访问。Session Policies是可选的,但如果使用,会与IAM角色的权限进行合并(取交集),从而限制最终的权限。
  2. 查看CloudTrail日志: CloudTrail通常会记录权限拒绝事件,可以帮助你确认是Session Policies导致的。

第五步:使用 AWS Policy Simulator 🛠️

AWS Policy Simulator 是一个强大的工具,可以帮助你模拟 IAM 策略和存储桶策略的效果。

  1. 模拟访问: 在 Policy Simulator 中,选择你的 IAM 角色/用户,指定 S3 存储桶和操作(例如 s3:GetObject),然后模拟访问。
  2. 分析结果: Policy Simulator 会告诉你访问是否被允许,以及哪个策略导致了允许或拒绝。

Policy Simulator链接: https://policysim.aws.amazon.com/

第六步:检查 CloudTrail 日志 🪵

CloudTrail 记录了 AWS 账号中的所有 API 调用,包括 S3 访问。

  1. 查找错误事件: 在 CloudTrail 日志中,查找与 S3 访问相关的错误事件。
  2. 分析错误信息: 错误信息通常会告诉你访问被拒绝的原因。例如,可能会显示 AccessDenied 错误,并指出哪个策略导致了拒绝。

第七步:网络配置问题 🌐

有时,网络配置也可能导致 S3 访问问题。

  1. VPC Endpoint: 如果你的 EC2 实例或其他服务位于 VPC 中,并且你使用 VPC Endpoint 访问 S3,确保 VPC Endpoint 策略允许来自目标账号的访问。
  2. 防火墙和安全组: 检查防火墙和安全组规则,确保允许流量流向 S3。

第八步:其他常见问题 🐞

  • 凭证问题: 确保你使用的 AWS 凭证是有效的,并且与正确的 AWS 账号关联。
  • 区域问题: 确保你访问的 S3 存储桶和你的 AWS 资源位于同一区域。
  • 临时凭证过期: 如果你使用临时凭证(例如通过 STS 获取的凭证),确保凭证没有过期。

希望这些步骤能帮助你解决 S3 跨账号访问权限问题! 🤞 如果还是不行,别忘了查阅 AWS 官方文档或寻求 AWS 支持的帮助。 Good luck! 🎉

鲨鱼云自助平台

鲨鱼云自助平台是一站式国际云服务解决方案平台,支持阿里云国际、腾讯云国际、亚马逊AWS、谷歌云GCP等主流云厂商账号的开通、充值与管理。

热门文章
更多>