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

複数のキー値をテストする条件を作成する(オペレーションの設定)

ポリシーの Condition 要素を使用して、1 つのキーに複数の値が対応付けられているリクエストをテストできます。AWS にプログラムまたは AWS マネジメントコンソール によりリクエストするとき、リクエストに情報を含めます。条件キーを使用して、リクエスト内の一致するキーの値をテストできます。たとえば、条件キーを使用して、DynamoDB テーブルの特定の属性へのアクセスや、タグに基づいた Amazon EC2 インスタンスへのアクセスをコントロールできます。

1 つのキーに複数の値が対応付けられているリクエストについて、ForAllValues 修飾子を使用してリクエスト値のセット全体が条件キー値のセット全体と一致するかどうかをテストします。リクエスト値のセットの少なくとも 1 つの値が、条件キー値のセットの少なくとも 1 つ値と一致するかどうかをテストするには、ForAnyValue 修飾子を使用します。これらの限定子によって条件演算子にセット演算機能が追加されるため、複数のリクエスト値を複数の条件値と照合できます。

だれかがリクエストを行うと、AWS はポリシーを評価して条件が true か false かを判断します。複数のキー値を含むリクエストの場合、AWS は修飾子に基づいて条件を評価します。

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

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

条件設定演算子の例

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

{ ID=101 UserName=Bob PostDateTime=20130930T231548Z Message="A good resource for this question is http://aws.amazon.com/documentation/" 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 (偽) を返します。