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

IAM JSON ポリシーの要素:Condition

Condition 要素 (またはCondition block) は、ポリシーを実行するタイミングの条件を指定することができます。Conditionエレメントはオプションです。Condition 要素 に、ポリシーの条件とリクエスの値との一致を調べる条件演算子 (等しい、未満など) を使用する演算式を構築します。たとえば、条件値にリクエスタの日付または IP アドレスを使用できます。一部のサービスでは、条件に追加の値を指定できます。たとえば Amazon EC2 では、そのサービスに固有の ec2:InstanceType キーを使用して条件を記述できます。

条件キーの名前は大文字小文字を区別しません。たとえば、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 サービスでは、大文字と小文字のみが異なる複数のキー名を作成できます。たとえば、Amazon EC2 インスタンスに foo=bar1Foo=bar2 のタグを付けるなどです。"ec2:ResourceTag:Foo": "bar1" などの条件を使用して、そのリソースへのアクセスを許可すると、キー名は両方のタグと一致しますが、1 つの値のみが一致します。これにより、予期しない障害が発生することがあります。

重要

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

条件ブロック

以下の例は、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 エレメントは複数の条件を含むことができ、各条件は複数のキー値ペアを含むことができます。以下の図が解説したものです。他に特定のない限り、すべてのキーには複数の値を含むことができます。

数値 foo が A または B と等しく、かつもう 1 つの数値 bar が C と等しいときに限り、リソースの使用を John に許可するとします。この場合、以下の図のような条件ブロックを作成します。


          2 つの NumericEquals 条件を含む条件ブロック

加えて、ジョンのアクセスを 2009 年 1 月 1 日以降に制限する場合を考えます。2009 年 1 月 1 日を含めた日付と共に、他の条件、DateGreaterThan、を追加することになります。このような条件が付いたブロックは、以下の図のようになります。


          DateGreaterThan 条件を含む条件ブロック

複数の条件演算子がある場合、または 1 つの条件演算子に複数のキーがアタッチされている場合、条件は論理 AND を使用して評価されます。1 つの条件演算子に 1 つのキーのための複数の値が含まれる場合、条件演算子は論理 OR を使用して評価されます。許可または明示的な拒否の決定を返すためには、すべての条件演算子に一致する必要があります。いずれかの条件演算子が一致しない場合、結果は拒否となります。


          AND および OR がどのように複数の値に適用されるかを示した条件ブロック

前述のように、AWS には所定の条件演算子およびキー (aws:CurrentTime など) があります。各 AWS のサービスもまた、サービス固有のキーを定義します。

たとえば、以下の条件でユーザーのジョンに Amazon SQS キューへのアクセスを許可するとします。

  • 日時は 2013/8/16 の正午を過ぎたところです。

  • 日時は 2013/8/16 の午後 3 時前です。

  • リクエスト (IAM または Amazon SQS) またはメッセージ (Amazon SNS) が、IP アドレスの 192.0.2.0 から 192.0.2.255 の範囲または 203.0.113.0 から 203.0.113.255 の範囲で入ってきます。

お客様の条件ブロックには 3 つの個別の条件演算子があり、ジョンはお客様のキュー、トピック、またはリソースにアクセスするためには、それら 3 つすべての条件演算子に一致しなければいけません。

お客様のポリシーにおいて、条件ブロックは以下のようなものになります。aws:SourceIp の 2 つの値は、OR を使用して評価されます。個別の 3 つの条件演算子が、AND を使用して、評価されます。

"Condition" : { "DateGreaterThan" : { "aws:CurrentTime" : "2013-08-16T12:00:00Z" }, "DateLessThan": { "aws:CurrentTime" : "2013-08-16T15:00:00Z" }, "IpAddress" : { "aws:SourceIp" : ["192.0.2.0/24", "203.0.113.0/24"] } }

最終的に、ある特定の条件では、ポリシーの個別のキーに複数の値が含まれる可能性があります。条件設定演算子を使用して、これらの複数値のキーを、ポリシーに含まれる 1 つ以上の値に対してテストできます。詳細については、「複数のキー値をテストする条件を作成する(オペレーションの設定)」を参照してください。

このページの内容: