AWS S3配置非指定角色拒绝删除策略后仍报Access Denied排查
S3对象删除权限被拒问题排查与修正
你的配置存在3个关键问题,是导致访问报错的核心原因:
- 条件键使用错误(核心原因):你在条件中使用
aws:PrincipalArn匹配IAM角色的原始ARN,但当你通过AssumeRole获取角色临时凭证发起请求时,请求上下文中的aws:PrincipalArn实际是STS临时身份的ARN,格式为arn:aws:sts::000000000:assumed-role/<角色名>/<会话名称>,和你配置的arn:aws:iam::*:role/*格式的角色ARN完全不匹配,会直接触发Deny逻辑,哪怕你确实用了指定角色发请求也会被拦截。 - 资源配置冗余:
s3:DeleteObject是对象级操作,仅对arn:aws:s3:::abc-bucket/*格式的对象ARN生效,你配置的桶根ARNarn:aws:s3:::abc-bucket对这个操作无意义,虽然不会直接导致报错,但属于无效配置。 - 缺少显式放行逻辑(可选但建议补充):IAM权限默认是隐式拒绝,你当前的策略只有Deny语句,如果指定的两个IAM角色本身的身份策略没有配置
s3:DeleteObject权限,就算Deny逻辑不命中,请求也会被默认拒绝。
修正后的桶策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:DeleteObject", "Resource": "arn:aws:s3:::abc-bucket/*", "Condition": { "StringEquals": { "aws:IAMRoleArn": [ "arn:aws:iam::000000000:role/EC2", "arn:aws:iam::000000000:role/Eventbridge" ] } } }, { "Effect": "Deny", "Principal": "*", "Action": "s3:DeleteObject", "Resource": "arn:aws:s3:::abc-bucket/*", "Condition": { "StringNotEquals": { "aws:IAMRoleArn": [ "arn:aws:iam::000000000:role/EC2", "arn:aws:iam::000000000:role/Eventbridge" ] } } } ] }
说明:这里把条件键换成了
aws:IAMRoleArn,这个全局条件键会直接匹配请求发起者所使用的IAM角色原始ARN,不受角色会话名、STS临时身份格式的影响,匹配准确率更高。
测试注意事项
- 你当前执行CLI命令用的是本地默认配置的凭证,如果是IAM用户、根用户的凭证,被拒绝是符合预期的,这类身份本来就在拦截范围内。
- 测试指定角色权限时,需要先通过
aws sts assume-role获取对应角色的临时访问密钥、会话Token,配置到CLI的profile中再执行删除命令,不要直接用长期身份凭证测试。 - 如果是EventBridge触发的删除操作,要确认EventBridge规则关联的执行角色就是你配置在列表里的角色,不要把服务主体(比如
events.amazonaws.com)和执行角色混淆。
内容的提问来源于stack exchange,提问作者Beckham rodeo
相关产品推荐
相关产品推荐

