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

複数のキーまたは値による条件の作成

ポリシーの Condition 要素を使用して、1 つのキーに複数のキーまたは複数の値が対応付けられているリクエストをテストできます。プログラムまたは AWS を通じて AWS マネジメントコンソール にリクエストを行うと、リクエストにはプリンシパル、オペレーション、タグなどに関する情報が含まれます。リクエストに含まれる情報とデータについては、「リクエスト」を参照してください。条件キーを使用して、リクエスト内の一致するキーの値をテストできます。たとえば、条件キーを使用して、DynamoDB テーブルの特定の属性へのアクセスや、タグに基づいた Amazon EC2 インスタンスへのアクセスをコントロールできます。

Condition エレメントは複数の条件を含むことができ、各条件は複数のキー値ペアを含むことができます。ほとんどの条件キーでは、複数の値の使用がサポートされています。以下の図が解説したものです。他に特定のない限り、すべてのキーには複数の値を含むことができます。

複数のキーまたは値を持つ条件の評価ロジック

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


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

複数のキーと値の使用

1 つのキーに複数の値が含まれるリクエストの場合、配列のように条件を角括弧で囲む必要があります ("Key2":["Value2A", "Value2B"])。また、ForAllValues または ForAnyValue set 演算子を StringLike 条件演算子とともに使用する必要もあります。これらの限定子によって条件演算子にセット演算機能が追加されるため、複数のリクエスト値を複数の条件値と照合できます。

  • ForAllValues – リクエスト値のセット全体が条件キー値のセット全体に一致するかどうかをテストします。リクエストで指定されたすべてのキー値がポリシーの 1 つ以上の値と一致する場合、条件は true を返します。リクエストに一致するキーがない場合、またはキー値が空の文字列などの空のデータセットに解決される場合は、true を返します。

  • ForAnyValue – リクエスト値のセットの少なくとも 1 つの数値が、条件キー値のセットの少なくとも 1 つ値と一致するかどうかをテストします。リクエスト内のキー値のいずれかがポリシーの条件値のいずれかと一致する場合に true が返されます。一致するキーまたは空のデータセットがない場合、条件は false を返します。

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


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

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


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

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

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

  • 時刻は 2019 年 7 月 16 日の午後 12:00 以降です。

  • 日時は 2019/7/16 の午後 3 時前です。

  • リクエスト元は、192.0.2.0~192.0.2.255 または 203.0.113.0~203.0.113.255 の範囲の IP アドレスです。

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

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

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

条件セット演算子で複数の値を使用する例

リクエスト内の複数の値とポリシーで指定した 1 つ以上の値との一致を調べるポリシーを作成できます。テクニカルサポートフォーラムでスレッドに関する情報を保存するために使用される Thread という Amazon DynamoDB テーブルがあるとします。テーブルには、IDUserNamePostDateTimeMessage、および Tagsという名前の属性があります。

{ ID=101 UserName=Bob PostDateTime=20130930T231548Z Message="A good resource for this question is docs.aws.amazon.com" Tags=["AWS", "Database", "Security"] }

DynamoDB で set 演算子を使用して、個々のデータ項目および属性への詳細なアクセスを実装する方法については、Amazon DynamoDB 開発者ガイド の「DynamoDB のきめ細かなアクセスコントロール」を参照してください。

PostDateTimeMessage、および Tags 属性のみの表示をユーザーに許可するポリシーを作成できます。ユーザーのリクエストにこれらの属性のいずれかが含まれている場合、許可されます。ただし、リクエストに他の属性 (ID など) が含まれている場合、リクエストは拒否されます。論理的に言えば、許可される属性 (PostDateTimeMessageTags) のリストを作成する必要があります。また、ユーザーがリクエストしたすべての属性が、その許可された属性のリストに含まれている必要があることをポリシーで示す必要があります。

次のポリシーの例は、ForAllValues 条件演算子で StringEquals 限定子を使用する方法を示しています。この条件では、ユーザーは、Thread という名前の DynamoDB テーブルの IDMessage、または Tags 属性のみをリクエストできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "ID", "Message", "Tags" ] } } } ] }

ユーザーが DynamoDB に対し、Thread テーブルから Message および Tags 属性を取得するためのリクエストをすると仮定します。この場合、ユーザーがリクエストした属性がすべてポリシーで指定された値と一致するため、リクエストは許可されます。GetItem オペレーションは、ユーザーがデータベーステーブルキーとして ID 属性を渡すことを必要とします。また、これはポリシーでも許可されます。ただし、ユーザーのリクエストに UserName 属性が含まれている場合、リクエストは失敗します。その理由は、UserName が許可された属性のリストに含まれておらず、ForAllValues 修飾子は、要求されたすべての値がポリシーに含まれている必要があるためです。

重要

dynamodb:Attributes を使用する場合、テーブルのすべてのプライマリキー属性とインデックスキー属性の名前を指定する必要があります。ポリシーに記載されているセカンダリインデックスも指定する必要があります。指定しなかった場合、DynamoDB は、このキー属性を使用して、リクエストされたアクションを実行できません。

また、ユーザーが一部の属性 (IDUserName 属性など) をリクエストに含めることを明示的に禁止することができます。たとえば、更新 (PUT 操作) で特定の属性の変更を禁止する必要があるため、ユーザーが DynamoDB テーブルを更新する場合に、それらの属性を除外することができます。この場合、禁止属性 (IDUserName) のリストを作成します。ユーザーが要求する属性のいずれかが禁止属性のいずれかに一致する場合、リクエストを拒否します。

以下の例では、ユーザーが ForAnyValue アクションの実行を試みるときに、ID および PostDateTime 属性へのアクセスを拒否する PutItem 修飾子を使用する方法を示しています。つまり、ユーザーが Thread テーブルで上記の属性のいずれかの更新を試みた場合です。Effect エレメントが Deny に設定されていることに注意してください。

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }

ユーザーが、PostDateTime テーブルの Message および Thread 促成の更新をするリクエストを行ったとします。ForAnyValue 限定子によって、要求された属性のいずれかがポリシー内のリストに含まれるかどうかが確認されます。この場合、1 つの一致 (PostDateTime) があるので、条件は true (真) になります。リクエスト内の他の値も一致した場合(例: リソース)、ポリシー全体の評価は true(真)を返します。ポリシーの結果は Deny になっているので、リクエストは拒否されます。

代わりに、ユーザーが PutItem 属性のみを使用して UserName を実行するリクエストを実行したとします。この場合、リクエスト内の属性 (UserName のみ) は、ポリシーに含まれるどの属性 (IDPostDateTime) とも一致しません。この条件では false が返されるので、ポリシーの結果 (Deny) も false になり、このポリシーでリクエストは拒否されません(リクエストを成功させるには、別のポリシーで明示的に許可する必要があります。このポリシーでリクエストは明示的に拒否されていませんが、すべてのリクエストが暗黙的に拒否されます)。

条件セット演算子を持つ複数の値の評価ロジック

このセクションでは、ForAllValues および ForAnyValue 限定子と共に使用される評価ロジックの詳細について説明します。次の表は、リクエストに含めることができるキー (PostDateTimeUserName) と、PostDateTimeMessageTags の各値を含むポリシーの条件に含めることができるキーを示しています。

キー (リクエスト)

条件値 (ポリシー)

PostDateTime

PostDateTime

UserName

Message

 

Tags

組み合わせの評価:

PostDateTimePostDateTime と一致するか

PostDateTimeMessage と一致するか

PostDateTimeTags と一致するか

UserNamePostDateTime と一致するか

UserNameMessage と一致するか

UserNameTags と一致するか

条件演算子の結果は、ポリシーの条件で使用される修飾子によって異なります。

  • ForAllValues.リクエスト内のすべてのキー (PostDateTime または UserName) がポリシーの 1 つ以上の条件値 (PostDateTimeMessageTags) と一致する場合に、true (真) が返されます。言い換えると、条件が true (真) となるためには、PostDateTimePostDateTimeMessage、または Tags と等しく、かつ UserNamePostDateTimeMessage、または Tags と等しい必要があります。

  • ForAnyValueリクエスト値とポリシー値 (例にある 6 つのいずれか) の組み合わせが true (真) を返す場合に、true (真) が返されます。

以下のポリシーには ForAllValues 限定子が含まれます。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "PostDateTime", "Message", "Tags" ] } } } }

ユーザーが DynamoDB に、属性 PostDateTime および UserName を取得するリクエストを送信するとします。組み合わせの評価:

PostDateTimePostDateTime と一致するか

True

PostDateTimeMessage と一致するか

False

PostDateTimeTags と一致するか

False

UserNamePostDateTime と一致するか

False

UserNameMessage と一致するか

False

UserNameTags と一致するか

False

このポリシーには ForAllValues 条件演算子修飾子が含まれています。つまり、PostDateTime に対して 1 つ以上の一致、UserName に対して 1 つの一致が必要です。UserName に対する一致がないので、条件演算子は false (偽) を返し、リクエストは許可されません。

以下のポリシーには ForAnyValue 限定子が含まれます。

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }

ポリシーには "Effect":"Deny" が含まれており、アクションは PutItem です。ユーザーが PutItemUserNameMessage 属性を含む PostDateTime リクエストを作成するとしましょう。その評価、次のとおりとなります。

UserNameID と一致するか

False

UserNamePostDateTime と一致するか

False

MessagesID と一致するか

False

MessagePostDateTime と一致するか

False

PostDateTimeID と一致するか

False

PostDateTimePostDateTime と一致するか

True

修飾子が ForAnyValue で、これらのテストのいずれかが true (真) を返す場合、条件は true (真) を返します。最後のテストでは true が返されるので、条件は true になります。Effect エレメントが Deny に設定されているため、リクエストは拒否されます。

注記

リクエスト内のキー値が空のデータセット (たとえば、空の文字列) に解決される場合、ForAllValues によって修飾される条件演算子は true を返します。さらに、ForAnyValue によって修飾される条件演算子は false を返します。