S3跨账号上传/下载时出现访问拒绝问题求助
解决方案:S3前缀跨账号共享权限修复
问题核心
当前桶策略已允许外部账号列出指定前缀内容,但上传/下载对象时触发Access Denied,主要源于两个常见问题:外部用户自身IAM策略未授权、桶策略配置存在范围限制。
具体修复步骤
1. 给外部账号用户添加IAM授权
外部账号的管理员必须为该用户配置如下IAM策略(替换占位符):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::<bucket-name>", "arn:aws:s3:::<bucket-name>/<prefix>/*" ] } ] }
这是关键步骤:桶策略仅开放了桶侧的访问权限,用户自身的IAM策略必须明确授予对应操作权限,否则会被默认拒绝。
2. 优化桶策略的列表权限范围(可选)
如果需要允许用户直接查看<prefix>根目录(而非仅其子对象),调整桶策略中ListBucket的条件,添加前缀本身的匹配规则:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Test List Bucket", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::外部账号ID:user/外部用户名"}, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::<bucket-name>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>", "<prefix>/*" ] } } }, { "Sid": "Test Upload Objects", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::外部账号ID:user/外部用户名"}, "Action": ["s3:PutObject", "s3:GetObject"], "Resource": "arn:aws:s3:::<bucket-name>/<prefix>/*" } ] }
建议将Principal指定到具体用户(而非仅账号ID),缩小权限范围,提升安全性。
3. 检查桶的Block Public Access设置
确认桶的Block Public Access未启用影响跨账号访问的选项:
- 不要勾选"Block public access to buckets and objects granted through any access control lists (ACLs)"
- 不要勾选"Block public access to buckets and objects granted through new access control lists (ACLs)"
仅针对指定账号共享时,这些选项通常不会干扰,但需确认避免意外限制。
4. 验证权限有效性
让外部用户执行以下命令测试(替换占位符):
- 列出对象:
aws s3 ls s3://<bucket-name>/<prefix>/ - 上传文件:
aws s3 cp local-file.txt s3://<bucket-name>/<prefix>/ - 下载文件:
aws s3 cp s3://<bucket-name>/<prefix>/test-file.txt ./
若仍报错,可通过AWS CloudTrail查看拒绝事件的errorCode和errorMessage,定位具体缺失的权限。
内容的提问来源于stack exchange,提问作者Marley
相关产品推荐
相关产品推荐

