为什么我的S3存储桶策略会拒绝跨AWS账号的访问请求?
问题原因
- IAM策略评估优先级规则:AWS IAM的权限评估逻辑中,显式Deny(拒绝)的优先级高于所有Allow(允许)规则,你在桶策略中给账号B EC2角色的Allow规则,只要触发了后续的Deny条件,就会被直接拦截。
- Deny语句的条件逻辑问题:AWS IAM策略中,同一个Condition块下的多个条件默认为**逻辑与(AND)**关系,当前你的Deny规则触发条件为:同时满足「请求来源不是你指定的账号A下的VPC」+「请求来源IP不在你指定的公网IP列表」,两个条件都满足时就会拒绝所有访问。
你账号B下的EC2实例天然不在账号A的指定VPC范围内,只要该EC2的出口公网IP也不在你设置的两个允许IP列表中,就会同时命中两个Deny触发条件,直接被拦截,哪怕之前的ACL授权、角色权限配置正确也无法访问。
修复方案
你可以在Deny语句的Condition中添加账号B EC2角色的豁免规则,修改后的Deny语句示例如下:
{ "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::s3_bucket_name", "arn:aws:s3:::s3_bucket_name/*" ], "Condition": { "StringNotLike": { "aws:SourceVpc": "vpc_id" }, "NotIpAddress": { "aws:SourceIp": [ "67.100.20.15/32", "79.190.30.2/32" ] }, "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:iam::Account_B_Number:role/EC2_Role" } } }
修改后,只要请求主体是账号B的EC2角色,就算不满足VPC和IP的要求,也不会触发Deny规则,之前配置的Allow规则就会正常生效。
如果业务允许,你也可以将账号B EC2的出口公网IP加到允许IP列表,或者将EC2所在的VPC加到允许VPC列表,也可以解决访问被拒的问题。
内容的提问来源于stack exchange,提问作者Dani Wol.
相关产品推荐
相关产品推荐

