

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS JSON 政策元素： NotPrincipal
<a name="reference_policies_elements_notprincipal"></a>

`NotPrincipal` 元素使用 `"Effect":"Deny"` 來拒絕存取所有主體，但 `NotPrincipal` 元素中指定的主體***除外***。委託人可以是 IAM 使用者、 AWS STS 聯合身分使用者委託人、IAM 角色、擔任的角色工作階段 AWS 帳戶、 AWS 服務或其他委託人類型。如需有關主體的資訊，請參閱 [AWS JSON 政策元素： Principal](reference_policies_elements_principal.md)。

`NotPrincipal` 必須與 `"Effect":"Deny"` 搭配使用。不支援將其與 `"Effect":"Allow"` 搭配使用。

**重要**  
不建議將 `NotPrincipal` 用於新的資源型政策，作為安全和授權策略的一部分。使用 `NotPrincipal` 時，會難以疑難排解多個政策類型的影響。我們建議改為將 `aws:PrincipalArn` 內容索引鍵與 ARN 條件運算子搭配使用。

## 重點
<a name="notprincipal-key-points"></a>
+ 某些 AWS 服務 (包括 VPC 端點) 的資源型政策支援 `NotPrincipal` 元素。資源型政策是您直接內嵌在資源中的政策。您無法在以 IAM 身分為基礎的政策或 IAM 角色信任政策中使用 `NotPrincipal` 元素。
+ 對於已附加許可界限政策的 IAM 使用者或角色，請勿使用所含 `NotPrincipal` 政策元素具有 `Deny` 效果的資源型政策陳述式。無論在 `NotPrincipal` 元素中指定何值，具有 `Deny` 效果的 `NotPrincipal` 元素將始終拒絕任何已附加許可界限政策的 IAM 主體。這會造成部分本可存取資源的 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。否則，政策可能會拒絕存取包含主體的整個帳戶。根據您包含在政策中的服務， AWS 可能先驗證帳戶，再來才是使用者。如果正在評估擔任角色的使用者 （使用角色的使用者）， AWS 則 可能會先驗證帳戶，然後驗證角色，然後驗證擔任角色使用者。擔任角色的使用者由該使用者擔任角色時指定的角色工作階段名稱來進行識別。因此，我們強烈建議您明確包含使用者帳戶的 ARN，或同時包含角色 ARN 和包含該角色的帳戶的 ARN。
+ 服務控制政策 (SCP) 和資源控制政策 (RCP) 不支援 `NotPrincipal` 元素。

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

在 中管理存取控制時 AWS，在某些情況下，您可能需要明確拒絕所有委託人存取資源，但您指定的一或多個委託人除外。 AWS 建議使用具有全域條件內容索引鍵的拒絕陳述式，以便更精確地控制和更輕鬆地進行故障診斷。下列範例展示了使用條件運算子 (例如 `StringNotEquals` 或 `ArnNotEquals`) 來拒絕存取所有主體 (Condition 元素中指定的主體除外) 的替代方法。

## 使用 IAM 角色的案例範例
<a name="notprincipal-alternative-role"></a>

您可以將資源型政策與拒絕陳述式搭配使用，來防止所有 IAM 角色 (Condition 元素中指定的角色除外) 存取或操作資源。此方法遵循 AWS 安全原則，明確拒絕一律優先於任何允許陳述式，並有助於維護整個 AWS 基礎設施的最低權限原則。

建議使用帶有全域條件內容索引鍵和條件運算子 (例如 [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN)) 的拒絕陳述式，而不是使用 `NotPrincipal`，來明確允許 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>

您可以使用拒絕陳述式來防止所有服務主體 (`Condition` 元素中指定的主體除外) 存取或操作資源。當您需要實作精細存取控制或在 AWS 環境中的不同服務和應用程式之間建立安全邊界時，此方法特別有用。

建議使用帶有全域條件內容索引鍵和條件運算子 (例如 [`StringNotEquals`](reference_policies_elements_condition_operators.md#Conditions_String)) 的拒絕陳述式，而不是使用 `NotPrincipal`，來明確允許服務主體存取資源。下列範例使用了 `aws:PrincipalServiceName` 來明確允許 AWS 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"
        }
      }
    }
  ]
}
```

------