AWS Identity and Access Management
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

IAM JSON 策略元素: NotPrincipal

使用 NotPrincipal 元素可指定委托人列表中的例外情况。例如,您可以拒绝对 NotPrincipal 元素中指定的委托人之外的所有委托人的访问。指定 NotPrincipal 的语法与指定的 IAM JSON 策略元素: Principal 语法相同。

重要

极少有需要使用 NotPrincipal 的情况,我们建议在决定使用 NotPrincipal 前了解其他授权选项。

NotPrincipal 替换为 Allow

我们强烈建议不要在与 "Effect": "Allow" 相同的策略语句中使用 NotPrincipal。这样做会允许除了NotPrincipal 元素中指定的委托人之外的所有委托人。我们建议不要这样做,因为在策略语句中指定的权限将授予除了所指定委托人之外的所有委托人。执行此操作后,您可能会将访问权限授予匿名(未经身份验证的)用户。

NotPrincipal 替换为 Deny

当在与 "Effect": "Deny" 相同的策略语句中使用 NotPrincipal 时,策略语句中指定的操作将被明确拒绝授予 指定的委托人之外的所有委托人。您可以使用这种方法实施某种形式的白名单。当您将 NotPrincipalDeny 一起使用时,还必须指定未拒绝委托人的账户 ARN。否则,策略可能会拒绝对包含委托人的整个账户的访问。根据您的策略中包括的服务,AWS 可能会先验证账户,然后验证用户。如果评估一个代入角色的用户(使用角色的某个人),AWS 会相继验证账户、角色,最后才是代入角色的用户。代入角色的用户由用户在代入角色时指定的角色会话名称进行标识。因此,我们强烈建议您明确包括用户账户的 ARN,或者包括角色的 ARN 以及包含角色的账户的 ARN。

注意

作为最佳实践,您应在策略中包括账户的 ARN。一些服务需要账户 ARN,虽然这并非在所有情况下均必需。没有必需 ARN 的任意现有策略将继续工作,但包括这些服务的新策略必须满足此要求。IAM 不会跟踪这些服务,因此建议您始终包括账户 ARN。

以下示例演示了在同一策略语句中有效使用 NotPrincipal"Effect": "Deny" 的方法。

例 1:相同或不同账户中的 IAM 用户

在下面的示例中, AWS 账户 444455556666 中名为 Bob 的用户外,所有其他委托人均被显式拒绝访问某个资源。请注意,作为最佳实践,NotPrincipal 元素包含用户 Bob 的 ARN 以及 Bob 所属的 AWS 账户 (arn:aws-cn: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/*" ] }] }

例 2:相同或不同账户中的 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/*" ] }] }