You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS SCP含NotAction的Deny策略为何拒绝所有操作?

AWS SCP中Deny+NotAction策略为何拒绝所有操作?

问题描述

我正在使用两个AWS Service Control Policy(SCP):

  1. OU根节点的标准FullAWSAccess策略(允许所有操作)
  2. 自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:55:56