メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

詳細に設定されたアクセスコントロールのための IAM ポリシー条件の使用

DynamoDB でアクセス権限を付与するときは、アクセス権限ポリシーを有効にする方法を決める条件を指定できます。

概要

DynamoDB では、IAM ポリシー (「アクセスコントロール」を参照) を使用してアクセス権限を付与するとき、条件を指定することもできます。たとえば、次のようにすることができます。

  • テーブルまたはセカンダリインデックス内の項目と属性に対する読み取り専用アクセスをユーザーに許可するアクセス権限を付与します。

  • ユーザーのアイデンティティに基づいて、テーブルの特定の属性への書き込み専用アクセスをユーザーを許可するアクセス権限を付与します。

DynamoDB では、次のセクションのユースケースに示すように、条件キーを使用して IAM ポリシーの条件を指定できます。

注記

一部の AWS サービスはタグベースの条件もサポートしますが、DynamoDB はサポートしません。

アクセス権限のユースケース

DynamoDB API アクションへのアクセスを制御するだけでなく、個別のデータ項目と属性へのアクセスも制御できます。たとえば、次の操作を実行できます。

  • テーブルでアクセス権限を付与しますが、特定のプライマリキー値に基づいて、そのテーブル内の特定の項目へのアクセスを制限します。この例として、ゲーム用のソーシャルネットワーキングアプリケーションがあります。次の図に示すように、すべてのユーザーのゲームデータは 1 つのテーブルに保存されますが、いずれのユーザーも、自分が所有していないデータ項目にアクセスすることはできません。

  • 属性のサブセットのみがユーザー表示されるように、情報を非表示にします。この例として、ユーザーの位置に基づいて、近くの空港の運航便データを表示するアプリケーションがあります。航空会社名、到着時間、出発時間、および運航便番号がすべて表示されます。ただし、次の図に示すように、パイロット名や乗客数などの属性は非表示になります。

このような種類のきめ細かなアクセス制御を実装するには、セキュリティ認証情報と関連する権限にアクセスするための条件を指定した IAM アクセス権限ポリシーを作成します。次に、IAM コンソールを使用して作成する IAM ユーザー、グループ、またはロールにそのポリシーを適用します。IAM ポリシーによって、テーブルの個別の項目へのアクセス、その項目の属性へのアクセス、またはその両方へのアクセスを同時に制御できます。

必要に応じて、ウェブ ID フェデレーションを使用して、Login with Amazon、Facebook、または Google によって認証されるユーザーによるアクセスを制御できます。詳細については、「ウェブアイデンティティフェデレーションの使用」を参照してください。

IAM の Condition 要素を使用して、詳細なアクセスコントロールポリシーを実装できます。Condition 要素をアクセス権限ポリシーに追加することで、特定のビジネス要件に基づいて、DynamoDB テーブルとインデックスの項目と属性へのアクセスを許可または拒否できます。

例として、プレーヤーがさまざまなゲームを選択してプレイできるモバイルゲームアプリケーションを考えてみます。このアプリケーションでは、GameScores という名前の DynamoDB テーブルを使用して、高スコアなどのユーザーデータを記録します。テーブルの各項目は、ユーザー ID とユーザーがプレイしたゲームの名前で一意に識別されます。GameScores テーブルには、パーティションキー (UserId) およびソートキー (GameTitle) で構成されているプライマリキーがあります。ユーザーは、そのユーザー ID に関連付けられたゲームデータだけにアクセスできます。ゲームをプレイするユーザーは、GameRole という名前の IAM ロールに属する必要があります。このロールには、セキュリティポリシーが関連付けられています。

このアプリケーションのユーザーアクセス権限を管理するには、次のようなアクセス権限ポリシーを記述できます。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToOnlyItemsMatchingUserID", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${www.amazon.com:user_id}" ], "dynamodb:Attributes": [ "UserId", "GameTitle", "Wins", "Losses", "TopScore", "TopScoreDateTime" ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES" } } } ] }

GameScores テーブル (Resource 要素) の特定の DynamoDB アクション (Action 要素) に対するアクセス権限の付与に加えて、Condition 要素は、次のようにアクセス権限を制限する DynamoDB に固有の次の条件キーを使用します。

  • dynamodb:LeadingKeys – この条件キーにより、ユーザーはパーティションキーの値がユーザー ID に一致する項目にのみアクセスできます。この ID、${www.amazon.com:user_id} は、置換変数です。置換変数の詳細については、「ウェブアイデンティティフェデレーションの使用」を参照してください。

  • dynamodb:Attributes – この条件キーは指定された属性へのアクセスを制限し、アクセス権限ポリシーに示されたアクションのみが、これらの属性の値を返すことができるようにします。さらに、StringEqualsIfExists 句は、アプリケーションが常に対象となる特定の属性のリストを提供し、すべての属性をリクエストできないようにします。

IAM ポリシーが評価されると、結果は必ず true (アクセス許可) または false (アクセス拒否) になります。Condition 要素のいずれかの部分が false の場合、ポリシー全体が false と評価され、アクセスは拒否されます。

重要

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

IAM ポリシードキュメントには、次の Unicode 文字のみを含めることができます。水平タブ (U+0009)、ラインフィード (U+000A)、キャリッジリターン (U+000D)、および U+0020~U+00FF の範囲内の文字。

条件の指定: 条件キーの使用

AWS には、アクセスコントロールのために IAM をサポートするすべての AWS サービスに合わせて事前定義された一連の条件キー (AWS 全体に対する条件キー) が用意されています。たとえば、aws:SourceIp 条件キーを使用して、リクエスタの IP アドレスを確認してから、アクションの実行を許可できます。AWS 全体に対するキーの詳細とリストについては、『IAM ユーザーガイド』の「条件に利用可能なキー」を参照してください。

注記

条件キーは大文字と小文字が区別されます。

以下の表では、DynamoDB に適用される DynamoDB サービス固有の条件キーを示しています。

DynamoDB 条件キー 説明
dynamodb:LeadingKeys

テーブルの最初のキー属性、つまりパーティションキーを表します。キーが 1 つの項目のアクションで使用される場合も、キー名 LeadingKeys は複数形であることに注意してください。また、条件で ForAllValues を使用するときには、LeadingKeys 修飾子を使用する必要があります。

dynamodb:Select

Select または Query リクエストの Scan パラメータを表します。Select には次のいずれかの値を指定できます。

  • ALL_ATTRIBUTES

  • ALL_PROJECTED_ATTRIBUTES

  • SPECIFIC_ATTRIBUTES

  • COUNT

dynamodb:Attributes

リクエストの属性名、またはリクエストから返される属性のリストを表します。次に示すように、Attributes 値は、特定の DynamoDB API アクション用のパラメーターと同じ方法で名前が付けられ、同じ意味を持ちます。

  • AttributesToGet

    用途: BatchGetItem, GetItem, Query, Scan

  • AttributeUpdates

    用途: UpdateItem

  • Expected

    用途: DeleteItem, PutItem, UpdateItem

  • Item

    用途: PutItem

  • ScanFilter

    用途: Scan

dynamodb:ReturnValues

リクエストの ReturnValues パラメータを表します。ReturnValues には次のいずれかの値を指定できます。

  • ALL_OLD

  • UPDATED_OLD

  • ALL_NEW

  • UPDATED_NEW

  • NONE

dynamodb:ReturnConsumedCapacity

リクエストの ReturnConsumedCapacity パラメータを表します。ReturnConsumedCapacity には、次のいずれかの値を指定できます。

  • TOTAL

  • NONE

ユーザーアクセスの制限

多くの IAM アクセス権限ポリシーでは、パーティションキーの値がユーザー識別子と一致するテーブルの項目へのアクセスのみをユーザーに許可します。たとえば、前述のゲームアプリケーションは、この方法でアクセスを制限し、ユーザーは自分のユーザー ID に関連付けらたゲームデータのみにアクセスできるようにします。IAM 置換変数 ${www.amazon.com:user_id}${graph.facebook.com:id}、および ${accounts.google.com:sub} には、Login with Amazon、Facebook、および Google のユーザー識別子が格納されます。アプリケーションがこのようなアイデンティティプロバイダーのいずれかにログインし、この識別子を取得する方法については、「ウェブアイデンティティフェデレーションの使用」を参照してください。

注記

以下のセクションの各例では、Effect 句を Allow に設定して、許可されるアクション、リソース、およびパラメーターだけを指定します。IAM ポリシーで明示的に指定されたものへのアクセスだけが許可されます。

場合によっては、拒否ベースとなるようにこのポリシーを書き直すことができます。つまり、Effect 句を Deny に設定して、ポリシーのすべてのロジックを逆にします。ただし、拒否ベースのポリシーを DynamoDB で使用しないことをお勧めします。このようなポリシーは、許可ベースのポリシーと比べて、正しく記述することが難しいためです。また、DynamoDB API への将来の変更(または、既存の API 入力への変更)が原因で、拒否ベースのポリシーが機能しなくなる可能性があります。

ポリシー例: きめ細かなアクセスコントロールのための IAM ポリシー条件の使用

このセクションでは、DynamoDB テーブルとインデックスに対してきめ細かなアクセス制御を実装するためのポリシーについて説明します。

注記

すべての例で、us-west-2 リージョンを使用し、架空のアカウント ID を含めています。

1: 特定のパーティションのキー値を持つ項目へのアクセスを制限するアクセス権限の付与

以下のアクセス権限ポリシーは、GamesScore テーブルで DynamoDB アクションのセットを許可するアクセス権限を付与します。このポリシーは dynamodb:LeadingKeys 条件キーを使用して、UserID パーティションキーの値が、このアプリケーション用の Login with Amazon の一意のユーザー ID と一致する項目のみでユーザーアクションを制限します。

重要

Scan 用のアクセス権限は、アクションのリストに含まれていません。これは、Scan が主要なキーにかかわらずすべての項目を返すためです。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "FullAccessToUserItems", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${www.amazon.com:user_id}" ] } } } ] }

注記

ポリシー変数を使用する場合は、2012-10-17 をポリシー内で明示的に指定する必要があります。アクセスポリシー言語のデフォルトバージョン、2008-10-17 では、ポリシー変数をサポートしていません。

読み取りアクセスを実装するには、データを変更可能なアクションを削除します。次のポリシーでは、読み込み専用アクセスを提供するアクションだけが条件に追加されています。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadOnlyAccessToUserItems", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${www.amazon.com:user_id}" ] } } } ] }

重要

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

2: テーブルの特定の属性へのアクセスを制限するアクセス権限の付与

次のアクセス権限ポリシーは、dynamodb:Attributes 条件キーを追加して、テーブルの 2 つの特定の属性のみへアクセスを許可します。この属性に対して、読み込み、書き込み、または条件付き書き込みまたはスキャンフィルタでの評価を実行できます。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "LimitAccessToSpecificAttributes", "Effect": "Allow", "Action": [ "dynamodb:UpdateItem", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:BatchGetItem", "dynamodb:Scan" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "UserId", "TopScore" ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES", "dynamodb:ReturnValues": [ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }

注記

このポリシーでは、ホワイトリスト手法を使用し、名前の付いた一連の属性へのアクセスを許可します。代わりに、他の属性へのアクセスを拒否する同等のポリシーを記述できます (ブラックリスト手法)。このブラックリスト 手法は、お勧めしません。それは、ユーザーが、すべての考えられる属性名を使用してリクエストを繰り返し発行し、最終的に、アクセスが許可されていない属性を見つけることで、ブラックリストに記載されている属性の名前を特定できる可能性があるためです。これを回避するには、Wikipedia (http://en.wikipedia.org/wiki/Principle_of_least_privilege) で説明されているように、最小権限の原則に従ってホワイトリスト手法を使用し、拒否される属性を指定するのではなく、許可されるすべての値を列挙します。

このポリシーでは、PutItemDeleteItem、または BatchWriteItem は許可されません。これらのアクションでは常に前の項目全体が置き換えられ、アクセスが許可されていない属性の以前の値を、ユーザーが削除できる可能性があるためです。

アクセス権限ポリシーの StringEqualsIfExists 句により、以下を実施することができます。

  • ユーザーが Select パラメータを指定する場合、その値は SPECIFIC_ATTRIBUTES である必要があります。この要件により、インデックスの射影からなど、API アクションが許可されていない属性を返さないようにします。

  • ユーザーが ReturnValues パラメータを指定する場合、その値は、NONEUPDATED_OLD、または UPDATED_NEW にする必要があります。これが必要なのは、UpdateItem アクションでは、置換する前に項目が存在するかどうかをチェックするために、および、リクエストされた場合に前の属性値を返すことができるように、暗黙的な読み込みオペレーションが実行されるためです。ReturnValues をこのように制限することで、確実にユーザーが許可された属性だけを読み込むまたは書き込むことができるようにします。

  • StringEqualsIfExists 節により、許可されたアクションのコンテキストで、リクエストごとに Select または ReturnValues パラメータのいずれか 1 つだけを使用できるようにすることができます。

次に、このポリシーのバリエーションをいくつか示します。

  • 読み込みアクションだけを許可するには、許可されるアクションのリストから UpdateItem を削除できます。残りのどのアクションも ReturnValues を受け付けないので、条件から ReturnValues を削除できます。また、Select パラメーターには必ず値 (特に指定のない限り、ALL_ATTRIBUTES) があるので、StringEqualsIfExistsStringEquals に変更できます。

  • 書き込みアクションだけを許可するには、許可されるアクションのリストから、UpdateItem を除くすべてのアクションを削除します。UpdateItem では Select パラメーターを使用しないので、条件から Select を削除できます。また、ReturnValues パラメーターには必ず値 (特に指定のない限り、NONE) があるので、StringEqualsIfExistsStringEquals に変更する必要があります。

  • 名前がパターンに一致するすべての属性を許可するには、StringEquals ではなく StringLike を使用し、複数文字パターン照合ワイルドカード文字 (*) を使用します。

3: 特定の属性で更新を回避するアクセス権限の付与

以下のアクセス権限のポリシーでは、dynamodb:Attributes 条件キーによって識別される特定の属性のみを更新するようユーザーアクセスを制限します。StringNotLike 条件によって、アプリケーションが、dynamodb:Attributes 条件キーを使用して指定された属性を更新できないようになります。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PreventUpdatesOnCertainAttributes", "Effect": "Allow", "Action": [ "dynamodb:UpdateItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores", "Condition": { "ForAllValues:StringNotLike": { "dynamodb:Attributes": [ "FreeGamesAvailable", "BossLevelUnlocked" ] }, "StringEquals": { "dynamodb:ReturnValues": [ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }

次の点に注意してください。

  • UpdateItem アクションは、他の書き込みアクションと同じように、更新前の値と更新後の値を返すことができるように、項目への読み取りアクセスを必要とします。ポリシーでは、dynamodb:ReturnValues 条件キーを指定して、更新が許可される属性のみにアクセスするようアクションを制限します。条件キーは、リクエストの ReturnValues を制限して NONEUPDATED_OLD、または UPDATED_NEW のみを指定し、ALL_OLD または ALL_NEW は含まれません。

  • PutItem および DeleteItem アクションは項目全体を置き換えるため、アプリケーションは任意の属性を変更することができます。したがって、特定の属性のみを更新するようアプリケーションを制限するときは、それらの API 用のアクセス権限を付与しないようにします。

4: インデックスで射影された属性のみのクエリを許可するアクセス権限の付与

以下のアクセス権限ポリシーでは、dynamodb:Attributes 条件キーを使用して、セカンダリインデックス (TopScoreDateTimeIndex) でクエリを許可します。また、このポリシーでは、インデックスに射影された特定の属性だけをリクエストするようクエリを制限します。

アプリケーションがクエリで属性のリストを指定するよう要求するには、ポリシーで dynamodb:Select 条件キーを指定して、DynamoDB の Query アクションの Select パラメーターが SPECIFIC_ATTRIBUTES であることを要求します。属性のリストは、dynamodb:Attributes 条件キーを使用して提供される特定のリストに制限されます。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "QueryOnlyProjectedIndexAttributes", "Effect": "Allow", "Action": [ "dynamodb:Query" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "TopScoreDateTime", "GameTitle", "Wins", "Losses", "Attempts" ] }, "StringEquals": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES" } } } ] }

次のアクセス権限ポリシーは、似ていますが、クエリでは、インデックスに射影されたすべての属性をリクエストする必要があります。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "QueryAllIndexAttributes", "Effect": "Allow", "Action": [ "dynamodb:Query" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition": { "StringEquals": { "dynamodb:Select": "ALL_PROJECTED_ATTRIBUTES" } } } ] }

5: 特定の属性とパーティションキー値へのアクセスを制限するアクセス権限の付与

以下のアクセス権限ポリシーでは、特定の DynamoDB アクション (Action 要素で指定) をテーブルとテーブルインデックス (Resource 要素で指定) で許可します。このポリシーは、dynamodb:LeadingKeys 条件キーを使用して、パーティションキーの値がユーザーの Facebook ID に一致する項目のみにアクセス権限を制限します。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "LimitAccessToCertainAttributesAndKeyValues", "Effect": "Allow", "Action": [ "dynamodb:UpdateItem", "dynamodb:GetItem", "dynamodb:Query", "dynamodb:BatchGetItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores", "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${graph.facebook.com:id}" ], "dynamodb:Attributes": [ "attribute-A", "attribute-B" ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES", "dynamodb:ReturnValues": [ "NONE", "UPDATED_OLD", "UPDATED_NEW" ] } } } ] }

次の点に注意してください。

  • ポリシー (UpdateItem) によって許可された書き込みアクションでは、attribute-A または attribute-B のみを変更できます。

  • ポリシーでは UpdateItem が許可されるため、アプリケーションは新しい項目を挿入でき、その非表示の属性は、新しい項目では null として表示されます。この属性が TopScoreDateTimeIndex に射影されている場合、テーブルからのフェッチを引き起こすクエリを防止するという利点がポリシーに追加されます。

  • アプリケーションは、dynamodb:Attributes に列挙されている属性以外の属性を読み込むことができません。このポリシーにより、アプリケーションは、読み込みリクエストで Select パラメーターを SPECIFIC_ATTRIBUTES に設定する必要があり、ホワイトリストに記載されている属性だけをリクエストすることができます。書き込みリクエストの場合、アプリケーションは、ReturnValuesALL_OLD または ALL_NEW に設定できません。また、他の属性に基づく条件付き書き込みオペレーションを実行できません。

関連トピック