AWS账号权限委托是否仅在Allow语句中生效?
回答:账号权限委托仅适用于Allow语句,Deny+NotPrincipal无法实现账号级委托
Great question — let's break this down clearly:
核心结论
是的,账号级权限委托仅适用于Allow语句。在Deny语句的NotPrincipal中使用账号Root ARN时,无法实现让整个账号下的身份绕过拒绝规则的效果,必须指定具体的IAM用户/角色/组ARN才能排除对应的主体。
背后的逻辑原因
AWS的权限评估体系对Allow和Deny语句的Principal/NotPrincipal处理逻辑有本质区别:
- Allow语句中的账号Root ARN:这是AWS设计的跨账号权限委托机制。当你把账号Root ARN设为Allow的Principal时,相当于把资源的访问控制权委托给了目标账号的管理员——该账号内的IAM策略可以自由管控下属用户/角色对该资源的访问,不需要在资源策略里逐个指定身份。
- Deny语句中的NotPrincipal:
NotPrincipal的作用是“拒绝所有主体,除了明确列出的身份”。这里的关键是:账号Root ARN仅指代账号的根用户本身,并不代表“该账号下的所有IAM身份”。所以当你用arn:aws:iam::1234567890:root作为NotPrincipal时,只有根用户能绕过Deny,账号内的其他IAM用户/角色都会被拒绝,自然无法通过账号内的IAM策略控制访问。
结合你的示例分析
1. Allow语句的账号委托(生效)
这个策略是有效的跨账号委托:
{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1234567890:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::abhiawsbucket-accessdemo", "arn:aws:s3:::abhiawsbucket-accessdemo/*" ] }
它授予了1234567890账号的管理员权限,让他们可以通过IAM策略给自己账号内的用户/角色分配该S3桶的访问权限。
2. Deny+NotPrincipal的账号委托(不生效)
这个策略仅排除了目标账号的根用户,其他身份仍会被拒绝:
{ "Effect": "Deny", "NotPrincipal": { "AWS": "arn:aws:iam::1234567890:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::abhiawsbucket-accessdemo", "arn:aws:s3:::abhiawsbucket-accessdemo/*" ] }
如果想让整个账号下的身份都绕过这个Deny,你需要明确列出该账号下的所有IAM身份,或者用通配符匹配身份类型,比如:
{ "Effect": "Deny", "NotPrincipal": { "AWS": [ "arn:aws:iam::1234567890:user/*", "arn:aws:iam::1234567890:role/*", "arn:aws:iam::1234567890:group/*" ] }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::abhiawsbucket-accessdemo", "arn:aws:s3:::abhiawsbucket-accessdemo/*" ] }
但注意:这种方式也不是“账号级委托”,只是批量匹配了账号内的身份类型,和Allow语句中委托给账号Root的机制完全不同。
总结
账号级权限委托是Allow语句特有的设计,用于跨账号交付资源控制权。而Deny+NotPrincipal的组合只能针对具体身份做排除,无法通过账号Root ARN实现批量排除整个账号的身份。
内容的提问来源于stack exchange,提问作者Abhishek Palakkal Kaliyath
相关产品推荐
相关产品推荐

