複数のキーまたは値による条件の作成 - AWS Identity and Access Management

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

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

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

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

ポリシーに複数の条件演算子がある場合、または 1 つの条件演算子に複数のキーがアタッチされている場合、条件は論理 AND を使用して評価されます。1 つの条件演算子に 1 つのキーのための複数の値が含まれる場合、条件演算子は論理 OR を使用して評価されます。目的の Allow または Deny 効果をトリガーするには、すべての条件が true に解決される必要があります。


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

StringNotEqualsDateNotEqualsなどのように、否定された一致条件演算子のポリシーで複数の値がリストされた場合、有効なアクセス許可は論理的 AND であるように働きます。例えば、StringNotEquals 条件演算子に aws:PrincipalAccount の値が複数ある場合、条件を真に合わせるために、文字列はリストされた aws:PrincipalAccount の値のいずれにも一致しません。

複数のキーバリューの使用

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

  • ForAllValues リクエストセットのすべてのメンバーの値が条件キーセットのサブセットであるかどうかをテストします。リクエストのすべてのキーバリューがポリシーの 1 つ以上の値と一致する場合、条件は true を返します。また、リクエストにキーがない場合、またはキーバリューが空の文字列などの null データセットに解決される場合は 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 演算子を使用して、個々のデータ項目と属性へのきめ細かいアクセスを実装する方法の詳細については、DynamoDB のきめ細かなアクセスコントロールAmazon 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" ] } } } ] }

ユーザーが Message に対し、DynamoDB テーブルから Tags および Thread 属性を取得するためのリクエストをすると仮定します。この場合、ユーザーがリクエストした属性がすべてポリシーで指定された値と一致するため、リクエストは許可されます。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 条件演算子を使用すると、リクエストにキーがない場合、またはキーバリューが null データセット(空の文字列など)に解決される場合は true を返します。リクエストに少なくとも 1 つの値を含めるようにするには、ポリシーで別の条件を使用する必要があります。例については、「AWS リクエスト時のアクセスの制御」を参照してください。

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

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

キー(リクエスト)

条件値 (ポリシー)

PostDateTime

PostDateTime

UserName

Message

 

Tags

組み合わせの評価:

PostDateTime は と一致するかPostDateTime

PostDateTime は と一致するかMessage

PostDateTime は と一致するかTags

UserName は と一致するかPostDateTime

UserName は と一致するかMessage

UserName は と一致するかTags

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

  • 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 を取得するリクエストを送信するとします。組み合わせの評価:

PostDateTime は と一致するかPostDateTime

True

PostDateTime は と一致するかMessage

False

PostDateTime は と一致するかTags

False

UserName は と一致するかPostDateTime

False

UserName は と一致するかMessage

False

UserName は と一致するかTags

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 リクエストを作成するとしましょう。その評価、次のとおりとなります。

UserName は と一致するかID

False

UserName は と一致するかPostDateTime

False

Messages は と一致するかID

False

Message は と一致するかPostDateTime

False

PostDateTime は と一致するかID

False

PostDateTime は と一致するかPostDateTime

True

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

注記

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