通过Amazon S3访问点为角色授权时出现AccessDenied问题求助
问题根因
这是AWS IAM权限评估逻辑的正常表现,当通过S3访问点发起操作请求时,需要同时通过4层权限校验:
- 调用者身份策略(角色策略)的权限校验
- 访问点策略的权限校验
- 桶策略的权限校验
- 对象ACL(如果配置的话)的权限校验
你当前的配置只有全局拒绝规则,没有配置桶侧的权限委托,也没有在角色策略中授予底层S3桶/对象的访问权限,因此默认的隐式拒绝规则会生效。你观察到的现象完全符合该逻辑:当你在角色策略中同时添加访问点ARN和底层桶ARN时,角色策略同时满足了「访问点资源操作允许」和「底层S3资源操作允许」两个要求,结合已配置的拒绝规则会过滤掉非指定访问点、非指定角色的请求,因此访问正常。如果移除任意一端的ARN配置,就会触发对应层的隐式拒绝,返回AccessDenied。
可选解决方案
方案1:保持现有角色策略补充桶ARN的配置(推荐,配置简单安全)
不需要修改现有桶策略和访问点策略,直接保留角色策略中同时存在访问点ARN、底层桶ARN的配置即可,符合AWS默认的权限最小化要求,所有访问依然会被限制为仅指定角色通过指定访问点操作。
方案2:配置桶权限委托,避免在角色策略中配置桶ARN
在现有桶策略中新增一条允许语句,将对应操作的权限判断委托给访问点,配置如下:
{ "Sid": "DelegatePermissionsToAccessPoint", "Effect": "Allow", "Principal": "*", "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::XXX-YYY-ZZZ", "arn:aws:s3:::XXX-YYY-ZZZ/*" ], "Condition": { "StringEquals": { "s3:DataAccessPointArn": "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ" } } }
添加后即可删除角色策略中的底层桶ARN配置,仅保留访问点ARN即可正常访问。
额外优化建议
你当前访问点策略仅配置了拒绝规则,可以补充一条显式允许指定角色操作的语句,避免依赖其他层的权限传递,配置逻辑更清晰:
{ "Sid": "AllowSpecifiedRoleOperateThroughAccessPoint", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXX-YYY-ZZZ:role/XXX-YYY-ZZZ" }, "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ", "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ/object/*" ] }
内容的提问来源于stack exchange,提问作者Vladimir Avdoshka
相关产品推荐
相关产品推荐

