メニュー
AWS Identity and Access Management
ユーザーガイド

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

このトピックでは、リクエスト内の 1 つのキーに対して複数の値をテストできるようにするポリシー Condition 要素をどのように作成するかについて説明します。実質的に、設定操作を使用する条件を作成できます。このタイプの条件は、DynamoDB テーブルの詳細な制御(例: 特定の属性へのアクセスの許可または拒否)を許可するポリシーを作成するのに役立ちます。

このタイプの条件を作成するには、 条件演算子付きの ForAllValues 限定子または ForAnyValue 限定子を使用できます。これらの限定子によって条件演算子にセット演算機能が追加されるため、複数のリクエスト値を複数の条件値と照合できます。

はじめに

リクエスト内の複数の値を、ポリシーで指定した 1 つ以上の値と照合するポリシーを作成することが必要な場合があります。良い例として、Amazon DynamoDB テーブルの属性に対するリクエストがあります。技術サポートフォーラムのスレッドに関する情報の格納に使用する Thread という名前の Amazon DynamoDB テーブルがあるとします。このテーブルには、IDUserNamePostDateTimeMessage、および Tags などのような属性が含まれることが考えられます。

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

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

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

これらのシナリオをサポートするために、条件演算子に次の修飾子を使用できます。

  • ForAnyValue - リクエスト内のキー値のいずれかがポリシーの条件値のいずれかと一致する場合に true が返されます。

  • ForAllValues - リクエストに指定されたすべてのキー値とポリシーの 1 つ以上の値が一致する場合に true が返されます。

DynamoDB で設定演算子を使用して、個々のデータ項目および属性への詳細なアクセス権を実装する方法については、Amazon DynamoDB 開発者ガイド ガイドの「Fine-Grained Access Control for DynamoDB」を参照してください。

条件設定演算子の例

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

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "GetItem", "Resource": "arn:aws:dynamodb:REGION:ACCOUNT-ID-WITHOUT-HYPHENS:table/Thread", "Condition": {"ForAllValues:StringLike": {"dynamodb:requestedAttributes": [ "PostDateTime", "Message", "Tags" ]}} }] }

ユーザーが DynamoDB に対して、Threads テーブルから属性 PostDateTime および Message を取得するリクエストを送信した場合、リクエストは許可されます。ユーザーが要求するすべての属性が、ポリシーで指定された値と一致するためです。ただし、ユーザーのリクエストに ID 属性が含まれる場合、リクエストは失敗します。ID が許可属性のリストに含まれておらず、ForAllValues 限定子によって、要求されたすべての値がポリシーに含まれていることが要求されるためです。

以下の例は、ユーザーが PutItem アクションの実行を試みた場合(つまり、ユーザーが ID または PostDateTime 属性の更新を試みた場合)にこれらの属性へのアクセスを拒否するポリシーの一部として、ForAnyValue 限定子を使用する方法を示しています。Effect エレメントが Deny に設定されていることに注意してください。

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "Action": "PutItem", "Resource": "arn:aws:dynamodb:REGION:ACCOUNT-ID-WITHOUT-HYPHENS:table/Thread", "Condition": {"ForAnyValue:StringLike": {"dynamodb:requestedAttributes": [ "ID", "PostDateTime" ]}} }] }

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

代わりに、ユーザーが UserName 属性のみを使用して PutItem を実行するリクエストを実行したとします。この場合、リクエスト内の属性(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 限定子が含まれます。

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "GetItem", "Resource": "arn:aws:dynamodb:REGION:ACCOUNT-ID-WITHOUT-HYPHENS:table/Thread", "Condition": {"ForAllValues:StringLike": {"dynamodb:requestedAttributes": [ "PostDateTime", "Message", "Tags" ]}} }] }

ユーザーが DynamoDB に対して、属性 PostDateTime および UserName を取得するリクエストを送信すると仮定します。リクエスト内のキーとポリシーの条件値は次のとおりです。

キー(リクエスト) 条件値(ポリシー)
PostDateTime PostDateTime
UserName Message
  Tags

組み合わせの評価:

PostDateTimePostDateTime と一致するか

True

PostDateTimeMessage と一致するか

False

PostDateTimeTags と一致するか

False

UserNamePostDateTime と一致するか

False

UserNameMessage と一致するか

False

UserNameTags と一致するか

False

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

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

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "Action": "PutItem", "Resource": "arn:aws:dynamodb:REGION:ACCOUNT-ID-WITHOUT-HYPHENS:table/Thread", "Condition": {"ForAnyValue:StringLike": {"dynamodb:requestedAttributes": [ "ID", "PostDateTime" ]}} }] }

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

UserNameID と一致するか

False

UserNamePostDateTime と一致するか

False

MessagesID と一致するか

False

MessagePostDateTime と一致するか

False

PostDateTimeID と一致するか

False

PostDateTimePostDateTime と一致するか

True

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

注記

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