AWS SCP含NotAction的Deny策略为何拒绝所有操作?
问题描述
我正在使用两个AWS Service Control Policy(SCP):
- OU根节点的标准
FullAWSAccess策略(允许所有操作) - 自定义SCP,内容如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSTS", "Effect": "Deny", "NotAction": [ "sts:*", "s3:*", "iam:*" ], "Resource": "*" } ] }
我的目标是仅允许STS(assumeRole)、S3和IAM操作,但将该策略应用到包含SafeManagement账号的OU后,所有操作均被直接拒绝,即使尝试查看或创建S3存储桶也会报错。当我将策略的Effect改为Allow,并将NotAction改为Action后,所有操作均可正常执行。请问为何该Deny+NotAction策略会拒绝所有操作,而非仅允许指定的STS、S3和IAM操作?
原因分析
1. SCP核心评估规则
SCP是AWS组织的权限边界,核心规则如下:
- Deny语句优先级最高:任何匹配请求的Deny语句都会直接拒绝请求,无视所有Allow语句。
- 权限交集生效:账号的有效权限是所有应用的SCP的交集——请求必须被所有SCP允许(不被任何SCP拒绝)。
- SCP不直接授予权限:SCP仅限制账号内IAM实体能执行的操作,IAM实体还需要账号内的IAM策略明确授予对应权限。
2. 你的Deny+NotAction策略的实际作用
你写的自定义SCP语句实际含义是:拒绝所有不属于sts:*、s3:*、iam:*的操作,但允许这三类操作(因为这条Deny语句不匹配它们)。理论上这三类操作应该能正常执行,但你遇到全量拒绝的情况,大概率是以下原因:
(1)IAM实体缺少对应权限
SCP只是权限边界,它允许的操作还需要账号内的IAM策略(比如用户/角色的权限策略)明确授予。如果你的IAM实体(比如测试用的用户/角色)没有被授予S3、IAM或STS的权限,即使SCP允许,执行操作时也会触发AccessDenied错误,看起来像是被SCP拒绝。
(2)控制台操作依赖其他被拒绝的服务
AWS控制台执行操作时,会后台调用多个服务的API(比如CloudWatch、Config、SSO等)。这些辅助API不在你的NotAction列表中,会被自定义SCP拒绝,导致控制台无法正常加载或执行操作,让你误以为S3/IAM/STS操作本身被拒绝。建议用AWS CLI直接测试单个操作(比如aws s3 mb s3://test-bucket),排除控制台的干扰。
(3)策略逻辑的误解
你可能误以为Deny+NotAction是“仅允许指定操作”,但实际上它只是“拒绝非指定操作”,而FullAWSAccess策略已经允许所有操作。两者组合后,有效权限确实是允许sts:*、s3:*、iam:*,但如果存在其他限制(比如IAM策略缺失),就会出现全量拒绝的假象。
3. 为何Allow+Action策略能正常工作
当你将策略改为Allow+Action后,SCP的组合变成:
FullAWSAccess允许所有操作- 自定义策略允许
sts:*、s3:*、iam:*
此时SCP的有效权限是允许所有操作(因为FullAWSAccess的范围更大),只要你的IAM实体有基础权限(比如FullAccess),所有操作自然能正常执行,这和你的预期目标(仅允许三类操作)其实不符。
正确的SCP写法
如果你想实现“仅允许STS、S3、IAM操作,拒绝所有其他操作”,正确的SCP写法有两种:
写法1:明确Allow指定操作 + Deny所有其他操作
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:*", "s3:*", "iam:*"], "Resource": "*" }, { "Effect": "Deny", "Action": "*", "Resource": "*" } ] }
写法2:单条Deny+NotAction语句(和你的原策略一致,但需配合正确的IAM策略)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "NotAction": ["sts:*", "s3:*", "iam:*"], "Resource": "*" } ] }
使用这种写法时,必须确保账号内的IAM实体被明确授予sts:*、s3:*、iam:*的权限,否则会出现AccessDenied错误。
内容的提问来源于stack exchange,提问作者explainthegarlic

