

# IAM JSON ポリシー要素Condition
<a name="reference_policies_elements_condition"></a>

`Condition` 要素 (または`Condition` *block*) は、ポリシーを実行するタイミングの条件を指定することができます。`Condition` 要素はオプションです。`Condition` 要素に、[条件演算子](reference_policies_elements_condition_operators.md) (等しい、より小さい、など) を使用して、ポリシーのコンテキストキーバリューをリクエストコンテキストのキーバリューに一致させる式を構築します。リクエストコンテキストの詳細については、「[リクエストのコンポーネント](intro-structure.md#intro-structure-request)」を参照してください。

```
"Condition" : { "{{{condition-operator}}}" : { "{{{condition-key}}}" : "{{{condition-value}}}" }}
```

ポリシー条件で指定できるコンテキストキーは、[グローバル条件コンテキストキー](reference_policies_condition-keys.md)またはサービス固有のコンテキストキーです。グローバル条件コンテキストキーには、`aws:` というプレフィックスが付いています。サービス固有のコンテキストキーには、サービスのプレフィックスがあります。例えば Amazon EC2 では、`ec2:InstanceType` コンテキストキーを使用して、そのサービスに固有の条件を記述できます。`iam:` プレフィックスが付いたサービス固有の IAM コンテキストキーを表示するには、「[IAM および AWS STS の条件コンテキストキー](reference_policies_iam-condition-keys.md)」を参照してください。

コンテキストキーでは、名前の大文字と小文字が区別されません。例えば、`aws:SourceIP` コンテキストキーを含めることは、`AWS:SourceIp` をテストすることと同じです。コンテキストキーの値の大文字と小文字の区別は、使用する[条件演算子](reference_policies_elements_condition_operators.md)によって異なります。例えば、次の条件には、`john` によって行われたリクエストのみが一致するようにする `StringEquals` 演算子が含まれています。`John` という名前のユーザーはアクセスを拒否されます。

```
"Condition" : { "StringEquals" : { "aws:username" : "john" }}
```

次の条件では、[`StringEqualsIgnoreCase`](reference_policies_elements_condition_operators.md#Conditions_String) 演算子を使用して、`john` または `John` という名前のユーザーに一致させます。

```
"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "john" }}
```

一部のコンテキストキーでは、キー名の一部を指定することができるキーバリューのペアをサポートしています。この例には、[`aws:RequestTag/{{tag-key}}`](reference_policies_condition-keys.md#condition-keys-requesttag) コンテキストキー、AWS KMS [https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context)、および複数のサービスでサポートされている [`ResourceTag/{{tag-key}}`](reference_policies_condition-keys.md#condition-keys-resourcetag) コンテキストキーが含まれます。
+ [Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policy-structure.html#amazon-ec2-keys) などのサービスに `ResourceTag/{{tag-key}}` コンテキストキーを使用する場合は、`tag-key` のキー名を指定する必要があります。
+ **キー名では大文字と小文字が区別されません。**つまり、ポリシーの条件要素で `"aws:ResourceTag/TagKey1": "Value1"` で指定した場合、その条件は `TagKey1` または `tagkey1` という名前のリソースタグキーに一致しますが、その両方には一致しません。
+ これらの属性をサポートする AWS サービスでは、大文字と小文字だけが異なる複数のキー名を作成することができる場合があります。例えば、`ec2=test1` および `EC2=test2` を使用して Amazon EC2 インスタンスにタグ付けします。`"aws:ResourceTag/EC2": "test1"` などの条件を使用して、そのリソースへのアクセスを許可すると、キー名は両方のタグと一致しますが、1 つの値のみが一致します。これにより、予期しない障害が発生することがあります。

**重要**  
ベストプラクティスとして、キーバリューのペア属性に名前を付けるときは、アカウントのメンバーが一貫した命名規則に従うようにします。例としては、AWS KMS タグや暗号化コンテキストなどがあります。これを強制するには、タグ付けに [`aws:TagKeys`](reference_policies_condition-keys.md#condition-keys-tagkeys) コンテキストキーを使用するか、AWS KMS 暗号化コンテキストに [https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-encryption-context-keys) を使用します。
+ 条件演算子の一覧と演算子の動作の説明については、「[条件演算子](reference_policies_elements_condition_operators.md)」を参照してください。
+ 他に特定のない限り、すべてのコンテキストキーには複数の値を含むことができます。複数の値を持つコンテキストキーを処理する方法の説明については、「[複数値のコンテキストキーの演算子を設定する](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)」を参照してください。
+ グローバルに利用できるコンテキストキーのすべてのリストについては、[AWS グローバル条件コンテキストキー](reference_policies_condition-keys.md) を参照してください。
+ 各サービスで定義されるコンテキストキーについては、「[AWS のサービスのアクション、リソース、および条件キー](reference_policies_actions-resources-contextkeys.html)」を参照してください。

## リクエストのコンテキスト
<a name="AccessPolicyLanguage_RequestContext"></a>

[プリンシパル](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#principal)が AWS に[リクエスト](intro-structure.md#intro-structure-request)を行うと、AWS はリクエスト情報をリクエストコンテキストに収集します。リクエストコンテキストには、プリンシパル、リソース、アクション、およびその他の環境プロパティに関する情報が含まれます。ポリシー評価は、ポリシーのプロパティを、AWS で実行できるアクションを評価および承認するためにリクエストで送信されたプロパティと照合します。

JSON ポリシーの `Condition` 要素を使用して、リクエストコンテキストに対して特定のコンテキストキーをテストできます。例えば、[aws:CurrentTime](reference_policies_condition-keys.md#condition-keys-currenttime) コンテキストキーを使用するポリシーを作成して、[特定の日付範囲内でのみアクションの実行をユーザーに許可できます](reference_policies_examples_aws-dates.md)。

以下の例は、Martha Rivera が MFA デバイスを非アクティブ化するリクエストを送信したときのリクエストコンテキストを示しています。

```
Principal: AROA123456789EXAMPLE
Action: iam:DeactivateMFADevice
Resource: arn:aws:iam::user/martha
Context:
  – aws:UserId=AROA123456789EXAMPLE:martha
  – aws:PrincipalAccount=1123456789012
  – aws:PrincipalOrgId=o-example
  – aws:PrincipalARN=arn:aws:iam::1123456789012:assumed-role/TestAR
  – aws:MultiFactorAuthPresent=true
  – aws:MultiFactorAuthAge={{2800}}
  – aws:CurrentTime=...
  – aws:EpochTime=...
  – aws:SourceIp=...
```

リクエストコンテキストは、過去 1 時間 (3,600 秒) に MFA を使用してサインインした場合にのみ、ユーザーが自分の多要素認証 (MFA) デバイスを削除することを許可するポリシーに対して照合されます。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "AllowRemoveMfaOnlyIfRecentMfa",
        "Effect": "Allow",
        "Action": [
            "iam:DeactivateMFADevice"
        ],
        "Resource": "arn:aws:iam::*:user/${aws:username}",
        "Condition": {
            "NumericLessThanEquals": {"aws:MultiFactorAuthAge": "{{3600}}"}
        }
    }
}
```

------

この例では、ポリシーはリクエストコンテキストに一致します。アクションは同じで、リソースは「\*」ワイルドカードに一致し、`aws:MultiFactorAuthAge` の値は 3600 未満の 2800 であるため、ポリシーはこの認可リクエストを許可します。

AWS はポリシー内の各コンテキストキーを評価し、*true* または *false* の値を返します。リクエストに存在しないコンテキストキーは、不一致と見なされます。

リクエストコンテキストは次の値を返すことができます。
+ **True** – リクエスタが過去 1 時間以内に MFA を使用してサインインした場合、条件は *true* を返します。
+ **False** – リクエスタが MFA を使用して 1 時間以上前にサインインした場合、条件は *false* を返します。
  + **Not present** – AWS CLI リクエスタがまたは AWS API の IAM ユーザーアクセスキーを使用してリクエストを行った場合、キーは存在しません。この場合、キーは存在せず、一致しません。

**注記**  
場合によっては、条件キー値が存在しないときでも true が返されることがあります。例えば、`ForAllValues` 修飾子を追加すると、コンテキストキーがリクエストに存在しない場合、リクエストは true を返します。欠落しているコンテキストキーや空の値を持つコンテキストキーが True と評価されないようにするには、コンテキストキーが存在し、その値が null でないかどうかをチェックするために `false` 値を使用する [Null 条件演算子](reference_policies_elements_condition_operators.md#Conditions_Null) をポリシーに含めることができます。

## 条件ブロック
<a name="AccessPolicyLanguage_ConditionBlock"></a>

以下の例は、`Condition`要素の基本フォーマットを示します。

```
"Condition": {"StringLike": {"s3:prefix": ["jane/*"]}}
```

リクエストからの値は、コンテキストキーによって表現されます。この場合は `s3:prefix` です。コンテキストキーバリューは、`jane/*` などのリテラル値として指定した値と比較されます。比較の種類は、[条件演算子](reference_policies_elements_condition_operators.md)によって指定されます (ここでは `StringLike`)。等号、大なり記号、小なり記号といった一般的なブール演算子を使用して、文字列、日付、数値などを比較する条件を作成できます。[文字列演算子](reference_policies_elements_condition_operators.md#Conditions_String)または [ARN 演算子](reference_policies_elements_condition_operators.md#Conditions_ARN)を使用する場合は、コンテキストキーの値に[ポリシー変数](reference_policies_variables.md)を使用することもできます。次の例では、`aws:username` 変数が含まれています。

```
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
```

一部の環境では、コンテキストキーに複数の値が含まれる可能性があります。たとえば、Amazon DynamoDB へのリクエストによって、テーブルの複数の属性を返すまたは更新することが要求される場合があります。DynamoDB テーブルへのアクセスのポリシーには、リクエスト内のすべての属性を含む `dynamodb:Attributes` コンテキストキーを追加できます。`Condition` 要素で設定演算子を使用することで、リクエスト内のすべての属性を、ポリシー内の許可された属性のリストと照合できます。詳細については、「[複数値のコンテキストキーの演算子を設定する](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)」を参照してください。

リクエスト中にポリシーが評価される際、AWS はキーをリクエストからの対応する値に置き換えます。（この例では、AWS はリクエストの日時を使用します。) 条件が評価された上で「true（真）」または「false（偽）」が返され、それを考慮に入れてポリシー全体がリクエストを許可または拒否します。

### 条件内の複数の値
<a name="Condition-multiple-conditions"></a>

`Condition` 要素は複数の条件演算子を含むことができ、各条件演算子は複数のキーと値のペアを含むことができます。以下の図が解説したものです。

![2 つの条件演算子のブロック図。最初のブロックには 2 つのコンテキストキープレースホルダーが含まれていて、それぞれに複数の値があります。2 番目の条件ブロックには、複数の値を持つ 1 つのコンテキストキーが含まれます。](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/images/AccessPolicyLanguage_Condition_Block.diagram.png)


詳細については、「[複数値のコンテキストキーの演算子を設定する](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)」を参照してください。