AWS JSON 策略元素:NotPrincipal
您可以使用 NotPrincipal
元素,拒绝向所有主体授予访问权限,NotPrincipal
元素指定的 IAM 用户、联合用户或 IAM 角色、AWS 账户、AWS 服务或其他主体除外。
对于某些 AWS 服务(包括 VPC 端点),您可以将其用于基于资源的策略。基于资源的策略是直接嵌入资源中的策略。您不能在基于 IAM 身份的策略或 IAM 角色信任策略中使用 NotPrincipal
元素。
NotPrincipal
必须与 "Effect":"Deny"
一起使用。不支持将其与 "Effect":"Allow"
一起使用。
重要
需要使用 NotPrincipal
的情况极少。我们建议首先尝试其他授权选项,然后再决定使用 NotPrincipal
。如果您使用 NotPrincipal
,则可能难以排查多策略类型的影响。我们建议改用带 ARN 条件运算符的 aws:PrincipalArn
上下文键。有关更多信息,请参阅 所有主体。
使用将 NotPrincipal
与 Deny
一起使用
当您将 NotPrincipal
与 Deny
一起使用时,还必须指定未拒绝主体的账户 ARN。否则,策略可能会拒绝对包含主体的整个账户的访问。根据您的策略中包括的服务,AWS 可能会先验证账户,然后验证用户。如果评估一个担任角色的用户(使用角色的某个人),AWS 会相继验证账户、角色,最后才是担任角色的用户。担任角色的用户是由他们担任角色时指定的角色会话名称标识的。因此,我们强烈建议您明确包括用户账户的 ARN,或者包括角色的 ARN 以及包含角色的账户的 ARN。
重要
如果基于资源的策略语句包含对附加了权限边界策略的 IAM 用户或角色具有 Deny
效果的 NotPrincipal
策略元素,则不要使用这种策略语句。具有 Deny
效果的 NotPrincipal
元素将始终拒绝任何附加了权限边界策略的 IAM 主体,无论 NotPrincipal
元素中指定的值为何。这会导致本来可以访问该资源的某些 IAM 用户或角色失去访问权限。我们建议更改基于资源的策略语句,以将 ArnNotEquals 条件运算符和 aws:PrincipalArn 上下文键结合使用来限制访问权限,而不是使用 NotPrincipal
元素。有关权限边界的信息,请参阅 IAM 实体的权限边界。
注意
作为最佳实践,您应在策略中包括账户的 ARN。一些服务需要账户 ARN,虽然这并非在所有情况下均必需。没有必需 ARN 的任意现有策略将继续工作,但包括这些服务的新策略必须满足此要求。IAM 不会跟踪这些服务,因此建议您始终包括账户 ARN。
以下示例说明了在同一策略语句中有效使用 NotPrincipal
和 "Effect":
"Deny"
的方法。
例 相同或不同账户中的示例 IAM 用户
在下面的示例中,除 AWS 账户 444455556666 中名为 Bob 的用户外,所有其他主体均被显式拒绝访问资源。请注意,作为最佳实践,NotPrincipal
元素包含用户 Bob 的 ARN 以及 Bob 所属的 AWS 账户 (arn:aws:iam::444455556666:root
) 的 ARN。如果 NotPrincipal
元素仅包含 Bob 的 ARN,策略的效果可能是显式拒绝对包含用户 Bob 的 AWS 账户 的访问。在某些情况下,用户不能拥有比其父账户更多的权限,因此,如果 Bob 的账户被明确拒绝访问,则 Bob 可能无法访问该资源。
当本示例是基于资源的策略 [附加到相同或不同 AWS 账户(非 444455556666)中的资源] 中的策略语句的一部分时,则可以正常工作。本示例本身不会向 Bob 授予访问权限,而只会将 Bob 从被显式拒绝的主体的列表中省略。要允许 Bob 访问资源,另一个策略语句必须使用 "Effect":
"Allow"
明确允许访问。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "NotPrincipal": {"AWS": [ "arn:aws:iam::444455556666:user/Bob", "arn:aws:iam::444455556666:root" ]}, "Action": "s3:*", "Resource": [ "arn:aws:s3:::BUCKETNAME", "arn:aws:s3:::BUCKETNAME/*" ] }] }
例 相同或不同账户中的示例 IAM 角色
在下面的示例中,除 AWS 账户 444455556666 中名为 cross-account-audit-app 的代入了角色的用户之外,所有其他主体均被显式拒绝访问资源。作为最佳实践,NotPrincipal
元素包含代入角色的用户 (cross-account-audit-app)、角色 (cross-account-read-only-role) 和角色所属的 AWS 账户(444455556666)的 ARN。如果 NotPrincipal
元素缺少角色的 ARN,策略的效果可能是明确拒绝对角色的访问。同样,如果 NotPrincipal
元素缺少角色所属的 AWS 账户 的 ARN,策略的效果可能是显式拒绝对 AWS 账户 以及该账户中所有实体的访问。在一些情况下,代入角色的用户拥有的权限不能比其父角色更多,而且角色拥有的权限不能比其父 AWS 账户 更多,因此,当角色或账户被显式拒绝访问时,代入角色的用户可能无法访问资源。
当本示例是基于资源的策略 [附加到 AWS 账户(非 444455556666)中的资源] 中的策略语句的一部分时,则可以正常工作。本示例本身不允许担任角色的用户 cross-account-audit-app 访问,而是仅在被明确拒绝的主体的列表中忽略 cross-account-audit-app。要向 cross-account-audit-app 授予对资源的访问权限,另一个策略语句必须使用 "Effect":
"Allow"
显式允许访问。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "NotPrincipal": {"AWS": [ "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app", "arn:aws:iam::444455556666:role/cross-account-read-only-role", "arn:aws:iam::444455556666:root" ]}, "Action": "s3:*", "Resource": [ "arn:aws:s3:::Bucket_AccountAudit", "arn:aws:s3:::Bucket_AccountAudit/*" ] }] }
当您在 NotPrincipal
元素中指定代入角色会话时,不能使用通配符 (*) 表示“所有会话”。主体必须始终指明特定会话。