AWS Identity and Access Management
ユーザーガイド

IAM JSON ポリシーの要素:Condition

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

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

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

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

"Condition" : { "StringEquals" : { "aws:username" : "johndoe" }}

次の条件では、StringEqualsIgnoreCase 演算子を使用して、johndoe または JohnDoe という名前のユーザーに一致させます。

"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "johndoe" }}

一部の条件キーでは、キー名の一部を指定することができるキーと値のペアをサポートしています。この例には、aws:RequestTag/tag-key グローバル条件キー、AWS KMS kms:EncryptionContext:encryption_context_key、および複数のサービスでサポートされている ResourceTag/tag-key 条件キーが含まれます。Amazon EC2 などのサービスに ResourceTag/tag-key 条件キーを使用する場合は、tag-key のキー名を指定する必要があります。キー名では大文字と小文字が区別されません。 つまり、ポリシーの条件要素で "ec2:ResourceTag:TagKey1": "Value1" を指定した場合、条件は TagKey1 または tagkey1 のいずれかの名前のリソースタグキーに一致しますが、その両方には一致しません。これらの属性をサポートする AWS サービスでは、大文字と小文字のみが異なる複数のキー名を作成できます。たとえば、foo=bar1 および Foo=bar2を使用して Amazon EC2 インスタンスにタグ付けします。"ec2:ResourceTag:Foo": "bar1" などの条件を使用して、そのリソースへのアクセスを許可すると、キー名は両方のタグと一致しますが、1 つの値のみが一致します。これにより、予期しない障害が発生することがあります。

重要

ベストプラクティスとして、キーと値のペア属性に名前を付けるときは、アカウントのメンバーが一貫した命名規則に従うようにします。例としては、AWS KMS タグや暗号化コンテキストなどがあります。これを強制するには、タグ付けに aws:TagKeys 条件キーを使用するか、AWS KMS 暗号化コンテキストに kms:EncryptionContextKeys を使用します。

リクエストのコンテキスト

プリンシパルが AWS にリクエストを行うと、AWS はリクエスト情報をリクエストコンテキストに収集します。この情報は、リクエストの評価と承認に使用されます。JSON ポリシーの Condition 要素を使用して、リクエストコンテキストに対して特定の条件をテストできます。たとえば、aws:CurrentTime 条件キーを使用するポリシーを作成して、営業時間中にのみ特定のアクションの実行をユーザーに許可できます

リクエストが送信されると、AWS はポリシーの各条件キーを評価し、truefalsenot present、場合によっては null (空のデータ文字列)の値を返します。リクエストに存在しないキーは、不一致と見なされません。たとえば、次のポリシーでは、過去 1 時間(3,600 秒)に MFA を使用してサインインした場合に限り、独自の多要素認証 (MFA) デバイスの削除を許可します。

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

リクエストコンテキストは次の値を返すことができます。

  • True – リクエスタが過去 1 時間以内に MFA を使用してサインインした場合、条件は true を返します。

  • False – リクエスタが MFA を使用して 1 時間以上前にサインインした場合、条件は false を返します。

  • Not present – リクエスタが AWS CLI または AWS API の IAM ユーザーアクセスキーを使用してリクエストを行った場合、キーは存在しません。この場合、キーは存在せず、一致しません。

  • Null – リクエストでタグを渡すなど、ユーザーが定義した条件キーの場合、空の文字列を含めることができます。この場合、リクエストコンテキストの値はnullです。null 値は、場合によっては true を返すことがあります。たとえば、aws:TagKeys 条件キーで複数値 ForAllValues 条件演算子を使用する場合、リクエストコンテキストが nullを返すと、予期しない結果が発生する可能性があります。詳細については、「aws:TagKeys」および「複数のキーと値の使用」を参照してください。

条件ブロック

以下の例は、Conditionエレメントの基本フォーマットを示します。

"Condition": { "DateGreaterThan" : { "aws:CurrentTime" : "2013-12-15T12:00:00Z" } }

リクエストからの値は、キーによって表現されます。この場合は aws:CurrentTime です。キー値は、後で説明するとおり、リテラル値 (2013-08-16T12:00:00Z) またはポリシー変数として指定した値と比較されます。比較の種類は、条件演算子によって指定されます (ここでは DateGreaterThan)。等号、大なり記号、小なり記号といった一般的なブール演算子を使用して、文字列、日付、数値などを比較する条件を作成できます。

一部の環境では、キーに複数の値が含まれる可能性があります。たとえば、Amazon DynamoDB へのリクエストによって、テーブルの複数の属性を返すまたは更新することが要求される場合があります。DynamoDB テーブルへのアクセスのポリシーには、リクエスト内のすべての属性を含む dynamodb:Attributes キーを追加できます。Condition エレメントで設定演算子を使用することで、リクエスト内のすべての属性を、ポリシー内の許可された属性のリストと照合できます。詳細については、「複数のキーまたは値による条件の作成」を参照してください。

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

条件内の複数の値

Condition エレメントは複数の条件を含むことができ、各条件は複数のキー値ペアを含むことができます。以下の図が解説したものです。

詳細については、「複数のキーまたは値による条件の作成」を参照してください。