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

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

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

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

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

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


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

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

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

条件を複数のキー値を持つ要求コンテキストと比較するには、ForAllValues または ForAnyValue 集合演算子を使用する必要があります。これらの集合演算子は、2 つの値のセットを比較するために使用されます。

ポリシー条件が、リクエスト内のタグセットやポリシー条件内のタグセットなど、2 つの値のセットを比較する場合、AWS にセットを比較する方法を指示する必要があります。IAM は 2 つの集合演算子 ForAnyValue および ForAllValues を定義します。集合演算子は、複数値の条件キーでのみ使用してください。単一値の条件キーで集合演算子を使用しないでください。

AWS 条件キーが単一値または複数値であるかどうかを判別するには、そのデータ型を確認します。サービスの条件キーデータ型を表示するには、「AWS サービスのアクション、リソース、および条件キー」を参照し、条件キーを表示するサービスを選択します。条件 [Type] (型) フィールドに ArrayOf 接頭辞が含まれる場合、条件キーは複数値です。たとえば、AWS Key Management ServiceString 単一値データ型と ArrayOfString 複数値データ型の条件キーをサポートします。

  • 単一値の条件キーはリクエストコンテキストに、最大で 1 つの値を持ちます。たとえば、AWS でリソースにタグを付けることができます。リソースタグは、タグキー値のペアとして格納されます。リソースタグキーは単一のタグ値を持つことができます。したがって、aws:ResourceTag/tag-key は単一値の条件キーです。単一値の条件キーで集合演算子を使用しないでください。

  • 複数値の条件キーは、リクエストコンテキストに複数の値を持つことができます。たとえば、AWS 内のリソースにタグを付けることができ、リクエストに複数のタグキーと値のペアを含めることができます。したがって、aws:TagKeys は複数の値を持つ条件キーです。複数値の条件キーには集合演算子が必要です。

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

  • ForAllValues — 複数値の条件キーで使用します。リクエストセットのすべてのメンバーの値が条件キーセットのサブセットであるかどうかをテストします。リクエストのすべてのキーバリューがポリシーの 1 つ以上の値と一致する場合、条件は true を返します。また、リクエストにキーがない場合、またはキーバリューが空の文字列などの null データセットに解決される場合は true を返します。過度に制限される可能性があるため、Allow 効果を持つ ForAllValues を使用しないでください。

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

    注記

    単一値と複数値の条件キーの違いは、ポリシー条件の値の数ではなく、要求コンテキストの値の数であることです。

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

リクエスト内の複数の値とポリシーで指定した 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

組み合わせの評価:

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 を返します。