

# Amazon JSON 策略元素：NotPrincipal
<a name="reference_policies_elements_notprincipal"></a>

`NotPrincipal` 元素使用 `"Effect":"Deny"` 拒绝所有主体的访问权限（`NotPrincipal` 元素中指定的主体***除外***）。主体可以是 IAM 用户、Amazon STS 联合用户主体、IAM 角色、所担任的角色会话、Amazon Web Services 账户、Amazon 服务或其他主体类型。有关主体的更多信息，请参阅 [Amazon JSON 策略元素：Principal](reference_policies_elements_principal.md)。

`NotPrincipal` 必须与 `"Effect":"Deny"` 一起使用。不支持将其与 `"Effect":"Allow"` 一起使用。

**重要**  
我们不建议在基于资源的新策略中使用 `NotPrincipal` 作为安全和授权策略的一部分。如果您使用 `NotPrincipal`，则可能难以排查多策略类型的影响。我们建议改用带 ARN 条件运算符的 `aws:PrincipalArn` 上下文键。

## 关键点
<a name="notprincipal-key-points"></a>
+ 对于部分 Amazon 服务（包括 VPC 端点），基于资源的策略也支持 `NotPrincipal` 元素。基于资源的策略是直接嵌入资源中的策略。您不能在基于 IAM 身份的策略或 IAM 角色信任策略中使用 `NotPrincipal` 元素。
+ 如果基于资源的策略语句包含对附加了权限边界策略的 IAM 用户或角色具有 `Deny` 效果的 `NotPrincipal` 策略元素，则不要使用这种策略语句。具有 `Deny` 效果的 `NotPrincipal` 元素将始终拒绝任何附加了权限边界策略的 IAM 主体，无论 `NotPrincipal` 元素中指定的值为何。这会导致本来可以访问该资源的某些 IAM 用户或角色失去访问权限。我们建议更改基于资源的策略语句，以将 [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN) 条件运算符和 [`aws:PrincipalArn`](reference_policies_condition-keys.md#condition-keys-principalarn) 上下文键结合使用来限制访问权限，而不是使用 `NotPrincipal` 元素。有关权限边界的信息，请参阅 [IAM 实体的权限边界](access_policies_boundaries.md)。
+ 当您使用 `NotPrincipal` 时，还必须指定未被拒绝主体的账户 ARN。否则，策略可能会拒绝对包含主体的整个账户的访问。根据您的策略中包括的服务，Amazon 可能会先验证账户，然后验证用户。如果评估一个担任角色的用户（使用角色的某个人），Amazon 会相继验证账户、角色，最后才是担任角色的用户。担任角色的用户是由他们担任角色时指定的角色会话名称标识的。因此，我们强烈建议您明确包括用户账户的 ARN，或者包括角色的 ARN 以及包含角色的账户的 ARN。
+ 服务控制策略（SCP）和资源控制策略（RCP）不支持 `NotPrincipal` 元素。

## `NotPrincipal` 元素的替代方案
<a name="notprincipal-alternatives"></a>

在 Amazon 中管理访问控制时，可能会遇到需要显式拒绝所有主体对某个资源的访问权限的情况，但您指定的一个或多个主体除外。Amazon 建议使用带有全局条件上下文键的 Deny 语句，以实现更精确的控制和更轻松的故障排除。以下示例显示了使用条件运算符（如 `StringNotEquals` 或 `ArnNotEquals`）拒绝所有主体的访问权限（条件元素中指定的主体除外）的其他方法。

## 使用 IAM 角色的示例场景
<a name="notprincipal-alternative-role"></a>

您可以使用带有 Deny 语句的基于资源的策略来防止所有 IAM 角色（条件元素中指定的角色除外）访问或操作您的资源。这种方法遵循 Amazon 安全原则，即显式拒绝始终优先于任何 allow 语句，并且有助于在整个 Amazon 基础设施中维护最低权限原则。

我们建议不要使用 `NotPrincipal`，而是使用带有全局条件上下文键和条件运算符（如 [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN)）的 Deny 语句，来显式允许 IAM 角色访问您的资源。以下示例使用 [aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn) 显式允许 `read-only-role` 角色访问 `Bucket_Account_Audit` 文件夹中的 Amazon S3 存储桶。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyCrossAuditAccess",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::Bucket_Account_Audit",
        "arn:aws:s3:::Bucket_Account_Audit/*"
      ],
      "Condition": {
        "ArnNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::444455556666:role/read-only-role"
        }
      }
    }
  ]
}
```

------

## 使用服务主体的示例场景
<a name="notprincipal-alternative-service-principal"></a>

您可以使用 Deny 语句来防止所有服务主体（`Condition` 元素中指定的主体除外）访问或操作您的资源。当您需要在 Amazon 环境中实施精细访问控制或在不同服务和应用程序之间建立安全边界时，这种方法特别有用。

我们建议不要使用 `NotPrincipal`，而是使用带有全局条件上下文键和条件运算符（如 [`StringNotEquals`](reference_policies_elements_condition_operators.md#Conditions_String)）的 Deny 语句，来显式允许服务主体访问您的资源。以下示例使用 `aws:PrincipalServiceName` 显式允许 Amazon CodeBuild 服务主体访问 `BUCKETNAME` 文件夹中的 Amazon S3 存储桶。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyNotCodeBuildAccess",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::BUCKETNAME",
        "arn:aws:s3:::BUCKETNAME/*"
      ],
      "Condition": {
        "StringNotEqualsIfExists": {
          "aws:PrincipalServiceName": "codebuild.amazonaws.com"
        }
      }
    }
  ]
}
```

------