

# 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` を使用すると、複数のポリシータイプの影響をトラブルシューティングすることが難しい場合があります。代わりに ARN 条件演算子で `aws:PrincipalArn` コンテキストキーを使用することをおすすめします。

## 重要ポイント
<a name="notprincipal-key-points"></a>
+ `NotPrincipal` 要素は、VPC エンドポイントを含む一部の AWS サービスのリソースベースのポリシーでサポートされています。リソースベースのポリシーは、リソースに直接埋め込むポリシーです。IAM のアイデンティティベースのポリシーでも IAM ロールの信頼ポリシーでも `NotPrincipal` 要素は使用できません。
+ アクセス許可の境界ポリシーがアタッチされている IAM ユーザーまたはロールに対する `Deny` 効果を持つ `NotPrincipal` ポリシー要素を含むリソースベースのポリシーステートメントは使用しないでください。`Deny` 効果のある `NotPrincipal` 要素は、`NotPrincipal` 要素で指定されている値に関係なく、アクセス許可の境界ポリシーがアタッチされている IAM プリンシパルを常に拒否します。これにより、本来であればリソースにアクセスできたはずの IAM ユーザーまたはロールの一部がアクセスを失うことになります。リソースベースのポリシーステートメントを変更して、`NotPrincipal` 要素ではなく [`aws:PrincipalArn`](reference_policies_condition-keys.md#condition-keys-principalarn) コンテキストキーで条件演算子 [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN) を使用してアクセスを制限することをおすすめします。アクセス許可の境界の詳細については、「[IAM エンティティのアクセス許可境界](access_policies_boundaries.md)」を参照してください。
+ `NotPrincipal` を使用する場合は、拒否されていないプリンシパルのアカウントの ARN も設定する必要があります。それ以外の場合、ポリシーでは、そのプリンシパルを含むアカウント全体へのアクセスが拒否されます。ポリシーに含めるサービスに応じて、AWS は最初にアカウントを確認し、次にユーザーを確認する場合があります。引き受けたロールのユーザー (ロールを使用しているユーザー) を評価する場合、AWS は最初にアカウントを確認し、次にロール、最後にロールを引き受けたユーザーを確認する場合があります。ロールを引き受けたユーザーは、ユーザーがロールを引き受けたときに指定されたロールセッション名で識別されます。したがって、ユーザーのアカウントの ARN、またはロールの ARN とそのロールを含むアカウントの ARN の両方を、明示的に含めることを強くお勧めします。
+ `NotPrincipal` 要素は、サービスコントロールポリシー (SCP) およびリソースコントロールポリシー (RCP) ではサポートされていません。

## `NotPrincipal` 要素の代替方法
<a name="notprincipal-alternatives"></a>

AWS でアクセスコントロールを管理する場合、指定した 1 つまたは複数のプリンシパルは例外とし、リソースへのすべてのプリンシパルアクセスを明示的に拒否する必要があるシナリオがあります。AWS では、より正確な制御とトラブルシューティングを容易にするために、グローバル条件コンテキストキーを持つ Deny ステートメントを使用することをお勧めします。次の例は、 `StringNotEquals` や `ArnNotEquals` などの条件演算子を使用して、Condition 要素で指定されたものを除くすべてのプリンシパルへのアクセスを拒否する代替アプローチを示しています。

## IAM ロールを使用したシナリオ例
<a name="notprincipal-alternative-role"></a>

Deny ステートメントを含むリソースベースのポリシーを使用すると、すべての IAM ロール (Condition 要素で指定されたロールを除く) がリソースにアクセスしたり操作したりすることを防ぐことができます。このアプローチは、明示的な拒否が常に許可ステートメントよりも優先されるという AWS セキュリティ原則に従い、AWS インフラストラクチャ全体で最小特権の原則を維持するのに役立ちます。

`NotPrincipal` を使用する代わりに、グローバル条件コンテキストキーと [`ArnNotEquals`](reference_policies_elements_condition_operators.md#Conditions_ARN) のような条件演算子を含む Deny ステートメントを使用して、IAMロールがリソースにアクセスできるように明示的に許可することをお勧めします。次の例では、[aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn) を使用して、ロール `Bucket_Account_Audit` が `read-only-role` フォルダ内の 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` 要素で指定されたものを除くすべてのサービスプリンシパルがリソースにアクセスまたは操作できないようにすることができます。このアプローチは、きめ細かなアクセスコントロールを実装する必要がある場合や、AWS 環境内のさまざまなサービスとアプリケーション間のセキュリティ境界を確立する必要がある場合に特に役立ちます。

`NotPrincipal` を使用する代わりに、グローバル条件コンテキストキーと条件演算子 [`StringNotEquals`](reference_policies_elements_condition_operators.md#Conditions_String) を含む Deny ステートメントを使用して、サービスプリンシパルにリソースへのアクセスを明示的に許可することをお勧めします。次の例では、`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"
        }
      }
    }
  ]
}
```

------