AWS Identity and Access Management
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

IAM JSON 策略元素: NotPrincipal

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

请注意,您还可以使用 NotPrincipal 允许 NotPrincipal 元素中指定的委托人之外的所有委托人;但是,我们不建议这样做。

警告

当在与 "Effect": "Allow" 相同的策略语句中使用 NotPrincipal 时,该策略语句中指定的权限将授给除指定的委托人之外的所有 委托人,包括匿名 (未经身份验证的) 用户。我们强烈建议不要在与 "Effect": "Allow" 相同的策略语句中使用 NotPrincipal

当在与 "Effect": "Deny" 相同的策略语句中使用 NotPrincipal 时,策略语句中指定的权限将被显式拒绝授给 指定的委托人之外的所有委托人。这使您能够实施某种形式的“whitelisting”。当您显式拒绝对 AWS 账户的访问时,您便拒绝了对该账户中包含的所有用户的访问。

请注意,如果基于资源的策略将 "Effect": "Deny" 与在 AWS 账户中仅指定一个委托人的 NotPrincipal 元素相结合,则该策略可能拒绝对包含该委托人的账户的访问,从而导致指定的委托人无法访问该资源。要了解具体情况,请参阅下节中的示例。

重要

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

在与 "Effect": "Deny" 相同的策略语句中指定 NotPrincipal

可使用用于在 IAM JSON 策略元素: Principal 元素中指定委托人的相同语法在 NotPrincipal 元素中指定委托人。但是,要达到预期的效果可能很难,尤其是在以下情况下:在同一策略语句中将 NotPrincipal"Effect": "Deny" 组合,并且您跨 AWS 账户边界工作。

重要

结合 DenyNotPrincipal 是 AWS 评估委托人时唯一一次顺序会产生影响的情况。AWS 在内部“从上往下”验证委托人,这表示 AWS 会先检查账户,然后再检查用户。如果 AWS 正在评估一个担任角色的用户 (使用角色而非 IAM 用户的某个人),它会相继检查账户、角色,最后才是担任角色的用户。担任角色的用户由该用户担任角色时指定的角色会话名称来进行标识。

通常,此顺序不对策略评估结果产生任何影响。但是,如果您同时使用 DenyNotPrincipal,评估顺序需要您明确包含与指定委托人相关的实体的 ARN。例如,要指定用户,您必须明确包含用户账户的 ARN。要指定担当角色的用户,您还必须包含该角色的 ARN 以及包含该角色的账户的 ARN。

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

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

在下面的示例中, AWS 账户 444455556666 中名为 Bob 的用户外,所有其他委托人均被显式拒绝访问某个资源。请注意,为了达到预期的效果,NotPrincipal 元素包含用户 Bob 以及 Bob 所属的 AWS 账户的 ARN (arn:aws-cn:iam::444455556666:root)。如果 NotPrincipal 元素仅包含 Bob 的 ARN,策略的效果将是显式拒绝对包含用户 Bob 的 AWS 账户的访问。用户不能拥有比其父账户更多的权限,因此,如果 Bob 的账户被显式拒绝访问,则 Bob 也无法访问该资源。

若本示例是基于资源的策略 (附加到相同或不同 AWS 账户 (非 444455556666) 中的资源) 中的策略语句的一部分,则它可以正常工作。本示例本身不会向 Bob 授予访问权限,而只会将 Bob 从被显式拒绝的委托人的列表中省略。要向 Bob 授予对资源的访问权限,另一个策略语句必须使用 "Effect": "Allow" 显式允许访问。

"Effect": "Deny", "NotPrincipal": { "AWS": [ "arn:aws-cn:iam::444455556666:user/Bob", "arn:aws-cn:iam::444455556666:root" ] }

例 2:相同或不同账户中的 IAM 角色

在下面的示例中, AWS 账户 444455556666 中名为 cross-account-audit-app 的担任了角色的用户之外,所有其他委托人均被显式拒绝访问资源。请注意,为了达到预期的效果,NotPrincipal 元素包含担任了角色的用户 (cross-account-audit-app)、角色 (cross-account-read-only-role) 和角色所属的 AWS 账户的 ARN (444455556666)。如果 NotPrincipal 元素缺少角色的 ARN,策略的效果将是显式拒绝对角色的访问。同样,如果 NotPrincipal 元素缺少角色所属的 AWS 账户的 ARN,策略的效果将是显示拒绝对 AWS 账户以及该账户中所有实体的访问。担任了角色的用户不能拥有比其父角色更多的权限,而且角色不能拥有比其父 AWS 账户更多的权限,因此,当角色或账户被明确拒绝访问时,担任了角色的用户将无法访问资源。

当本示例是基于资源的策略 (附加到不同的 AWS 账户 (非 444455556666) 中的资源) 中的策略语句的一部分时,它可以正常工作。本示例本身不会向担任了角色的用户 cross-account-audit-app 授予访问权限,而只会将 cross-account-audit-app 从被显式拒绝的委托人的列表中省略。要向 cross-account-audit-app 授予对资源的访问权限,另一个策略语句必须使用 "Effect": "Allow" 显式允许访问。

"Effect": "Deny", "NotPrincipal": { "AWS": [ "arn:aws-cn:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app", "arn:aws-cn:iam::444455556666:role/cross-account-read-only-role", "arn:aws-cn:iam::444455556666:root" ] }