S3 Bucket访问被拒:如何调整IAM权限及桶策略恢复管理权限?
问题解决:恢复管理员对S3 Bucket的操作权限
问题原因
你当前的桶策略中,DenyAllOtherRequests 语句使用了 Principal: "*",这会拒绝所有主体的所有S3操作。由于AWS权限评估逻辑里,Deny 策略优先级高于任何 Allow 策略(包括IAM管理员权限),所以即便你拥有管理员角色,也会被这个Deny策略阻止操作该桶。
解决方案
核心思路是让Deny策略仅拒绝Role1和你的管理员身份之外的请求,具体有两种实现方式:
方式1:用NotPrincipal修改Deny语句
将原有的Deny语句替换为以下内容,通过NotPrincipal明确排除允许的EC2角色和你的管理员身份:
{ "Version": "2012-10-17", "Id": "MyBucketPolicy", "Statement": [ { "Sid": "AllowEC2Instances", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::AWS-ID:role/Role1" ] }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] }, { "Sid": "DenyAllOtherRequests", "Effect": "Deny", "NotPrincipal": { "AWS": [ "arn:aws:iam::AWS-ID:role/Role1", "arn:aws:iam::AWS-ID:user/你的管理员用户名" // 替换为你的管理员用户ARN // 如果是管理员角色,替换为:"arn:aws:iam::AWS-ID:role/你的管理员角色名" ] }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] }
方式2:添加管理员专属Allow语句(配合方式1使用)
在Deny语句前添加单独的管理员访问许可,但必须配合方式1的NotPrincipal修改,否则Deny策略依然会覆盖Allow权限:
{ "Version": "2012-10-17", "Id": "MyBucketPolicy", "Statement": [ { "Sid": "AllowEC2Instances", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::AWS-ID:role/Role1" ] }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] }, { "Sid": "AllowAdminAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AWS-ID:user/你的管理员用户名" // 替换为你的管理员身份ARN }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] }, { "Sid": "DenyAllOtherRequests", "Effect": "Deny", "NotPrincipal": { "AWS": [ "arn:aws:iam::AWS-ID:role/Role1", "arn:aws:iam::AWS-ID:user/你的管理员用户名" ] }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] }
操作步骤
- 确认你的管理员身份ARN:
- IAM用户ARN格式:
arn:aws:iam::你的AWS账号ID:user/用户名 - IAM角色ARN格式:
arn:aws:iam::你的AWS账号ID:role/角色名
- IAM用户ARN格式:
- 替换示例中的占位符(AWS-ID、bucket-name、管理员ARN)
- 将修改后的策略应用到目标S3 Bucket
内容的提问来源于stack exchange,提问作者DrTheiss
相关产品推荐
相关产品推荐

