DAX のアクセスコントロール - Amazon DynamoDB

DAX のアクセスコントロール

DynamoDB アクセラレーター (DAX) は DynamoDB と連携して動作し、アプリケーションにキャッシングレイヤーをシームレスに追加するように設計されています。ただし、DAX および DynamoDB には、個別のアクセス制御のメカニズムがあります。どちらのサービスもそれぞれのセキュリティポリシーの実装に AWS Identity and Access Management (IAM) を使用しますが、セキュリティモデルは DAX と DynamoDB で異なります。

両方のセキュリティモデルを理解することを強くお勧めします。そうすることで、DAX を使用するアプリケーションに適切なセキュリティ手段を実装できます。

このセクションでは、DAX が提供するアクセスコントロールメカニズムを説明し、必要に合わせて調整できる IAM ポリシーの例を示します。

DynamoDB では、個別の DynamoDB リソースでユーザーが実行できるアクションを制限する IAM ポリシーを作成できます。たとえば、特定の DynamoDB テーブルに対して、ユーザーに読み込み専用アクションのみを許可するユーザーロールを作成できます。(詳細については、Amazon DynamoDB の Identity and Access Management を参照してください)。対して、DAX のセキュリティモデルでは、クラスターのセキュリティおよびクラスターがユーザーに代わって実行する DynamoDB API アクション機能が中心です。

警告

現在 IAM ロールおよびポリシーを使用して DynamoDB テーブルのデータへのアクセスを制限している場合、DAX を使用することで、これらのポリシーが覆される場合があります。たとえば、あるユーザーが、DAX 経由では DynamoDB テーブルにアクセスできても、DynamoDB に直接アクセスすると同じテーブルに対する明示的なアクセスができないという場合があります。詳細については、「Amazon DynamoDB の Identity and Access Management」を参照してください。

DAX では、DynamoDB のデータに対してユーザーレベルの分離を実施していません。代わりに、ユーザーは DAX クラスターにアクセスする際に、そのクラスターの IAM ポリシーのアクセス権限を継承します。そのため、DAX 経由で DynamoDB テーブルにアクセスする際、有効なアクセスコントロールは DAX クラスターの IAM ポリシーのアクセス権限のみです。他のアクセス権限は認識されません。

隔離が必要な場合は、追加の DAX クラスターを作成して、クラスターごとに IAM ポリシーを限定することをお勧めします。たとえば、複数の DAX クラスターを作成し、各クラスターに 1 つのテーブルのみに対してアクセスを許可することもできます。

DAX 用の IAM サービスロール

DAX クラスターを作成するときに、クラスターを IAM ロールと関連付ける必要があります。これは、クラスターのサービスロールと呼ばれます。

DAXCluster01 という名前の新しい DAX クラスターを作成するとします。DAXServiceRole というサービスロールを作成し、そのロールを DAXCluster01 と関連付けます。DAXServiceRole のポリシーは、DAXCluster01 と対話するユーザーの代理で DAXCluster01 が実行できる DynamoDB アクションを定義します。

サービスロールを作成する際に、DAXServiceRole と DAX サービス自体の信頼関係を指定する必要があります。信頼関係は、どのエンティティがロールを引き受けアクセス権限を利用できるかを決定します。以下は、DAXServiceRole の信頼関係のドキュメントの例です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "dax.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

この信頼関係では、DAX クラスターが DAXServiceRole を引き受け、ユーザーに代わって DynamoDB API コールを実行します。

許可される DynamoDB API アクションは、DAXServiceRole にアタッチした IAM ポリシードキュメントに記載されています。以下に、ポリシードキュメントの例を示します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DaxAccessPolicy", "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:PutItem", "dynamodb:GetItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books" ] } ] }

このポリシーでは、DAX は、DynamoDB テーブルに対して必要な DynamoDB API アクションを実行できます。dynamodb:DescribeTable アクションは、DAX がテーブルに関するメタデータを維持するために必要です。その他のアクションは、テーブル内の項目に対して実行される読み込みおよび書き込みアクションです。Books という名前のテーブルは us-west-2 リージョンにあり、AWS アカウント ID 123456789012 によって所有されています。

注記

DAX は、クロスサービスアクセス中に混乱した代理問題を防止するメカニズムをサポートしています。詳細については、IAM ユーザーガイド混乱した代理問題 を参照してください。

DAX クラスターのアクセスを許可する IAM ポリシー

DAX クラスターを作成したら、ユーザーが DAX クラスターにアクセスできるように、ユーザーにアクセス許可を付与する必要があります。

例えば、Alice というユーザーに DAXCluster01 へのアクセス許可を付与するとします。最初に、受信者がアクセスできる DAX クラスターと DAX API アクションを定義する IAM ポリシー (AliceAccessPolicy) を作成します。次に、このポリシーをユーザー Alice にアタッチして、アクセスを付与します。

次に示すポリシードキュメントは、受取人に DAXCluster01 のフルアクセスを付与します。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dax:*" ], "Effect": "Allow", "Resource": [ "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" ] } ] }

ポリシードキュメントは DAX クラスターへのアクセスを許可しますが、DynamoDB に対するアクセス権限は付与しません。(DynamoDB のアクセス権限は、DAX サービスロールによって付与されます。)

ユーザー Alice 用に、まず上記のポリシードキュメントを持った AliceAccessPolicy を作成します。次に、ポリシーを Alice にアタッチします。

注記

ポリシーをユーザーにアタッチする代わりに、IAM ロールにアタッチできます。この方法では、そのロールを引き受けるユーザーのすべてに、ポリシーで定義したアクセス権限があります。

ユーザーポリシーは、DAX サービスロールとともに、受信者が DAX 経由でアクセスできる DynamoDB リソースおよび API アクションを決定します。

導入事例: DynamoDB と DAX にアクセスする

次のシナリオは、DAX で使用する IAM ポリシーについての理解を深めるために役立ちます。(このシナリオは、このセクションの他の部分でも参照されます)。次の図は、このシナリオの大まかな概要を示しています。

このシナリオには、次のエンティティがあります。

  • ユーザー (Bob)。

  • IAM ロール (BobUserRole)。Bob は実行時にこのロールを引き受けます。

  • IAM ポリシー (BobAccessPolicy)。このポリシーは、BobUserRole にアタッチされています。BobAccessPolicy では、BobUserRole がアクセスできる DynamoDB リソースと DAX リソースが定義されます。

  • DAX クラスター (DAXCluster01)。

  • IAM サービスロール (DAXServiceRole)。このロールにより、DAXCluster01 は DynamoDB にアクセスできます。

  • IAM ポリシー (DAXAccessPolicy)。このポリシーは、DAXServiceRole にアタッチされています。DAXAccessPolicy では、DAXCluster01 がアクセスできる DynamoDB API およびリソースが定義されます。

  • DynamoDB テーブル (Books)。

BobAccessPolicyDAXAccessPolicy のポリシーステートメントの組み合わせにより、Bob が Books に対して何ができるかが決まります。たとえば、Books に (DynamoDB エンドポイントを使用して) 直接アクセスできる、(DAX クラスターを使用して) 間接的にアクセスできる、またはその両方などです。Books からデータを読み取る、Books にデータを書き込む、またはその両方が可能な場合もあります。

DynamoDB へのアクセスと DAX へのアクセス防止

DynamoDB テーブルに直接アクセスすることを許可する一方で、DAX クラスターを使用した間接的なアクセスを防止することもできます。DynamoDB への直接アクセスについては、BobUserRole のアクセス権限は (ロールにアタッチされている) BobAccessPolicy によって決まります。

DynamoDB (のみ) への読み込み専用アクセス

Bob は BobUserRole で DynamoDB にアクセスできます。このロールにアタッチされた IAM ポリシー (BobAccessPolicy) は、BobUserRole がアクセスできる DynamoDB テーブルと、BobUserRole が呼び出すことができる API を決定します。

BobAccessPolicy に対して、次のポリシードキュメントを検討してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

このドキュメントが BobAccessPolicy にアタッチされていると、BobUserRole は DynamoDB エンドポイントにアクセスし、Books テーブルで読み込み専用のオペレーションを実行できるようになります。

DAX はこのポリシーには含まれていないため、DAX 経由のアクセスは拒否されます。

DynamoDB (のみ) への読み込み/書き込みアクセス

BobUserRole に DynamoDB への読み込み/書き込みアクセスが必要な場合、次のポリシーを使用できます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

ここでも、DAX はこのポリシーには含まれていないため、DAX 経由のアクセスは拒否されます。

DynamoDB および DAX へのアクセス

DAX クラスターに対するアクセスを許可するには、IAM ポリシーに DAX 固有のアクションを含める必要があります。

次の DAX 固有のアクションは、DynamoDB API の類似した名前のアクションに対応しています。

  • dax:GetItem

  • dax:BatchGetItem

  • dax:Query

  • dax:Scan

  • dax:PutItem

  • dax:UpdateItem

  • dax:DeleteItem

  • dax:BatchWriteItem

  • dax:ConditionCheckItem

dax:EnclosingOperation 条件キーについても同様です。

DynamoDB への読み込み専用アクセスと DAX への読み込み専用アクセス

Bob には、DynamoDB と DAX の両方から Books テーブルへの読み込み専用アクセスが必要であるとします。次のポリシー (BobUserRole にアタッチされている) により、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

ポリシーには、DAX アクセス用のステートメント (DAXAccessStmt) と DynamoDBaccess 用の別のステートメント (DynamoDBAccessStmt) があります。これらのステートメントにより、Bob は、GetItemBatchGetItemQueryScan リクエストを DAXCluster01 に送信できるようになります。

ただし、DAXCluster01 のサービスロールにも、DynamoDB の Books テーブルへの読み込み専用のアクセスが必要になります。DAXServiceRole にアタッチされた以下の IAM ポリシーは、この条件を満たします。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

DynamoDB への読み込み/書き込みアクセスと DAX 経由の読み込み専用アクセス

特定のユーザーロールに、DAX 経由での読み込み専用アクセスを許可したまま、DynamoDB テーブルへの読み込み/書き込みアクセスを提供できます。

Bob の場合、BobUserRole の IAM ポリシーは、Books テーブルに対する DynamoDB の読み込み/書き込みアクションを許可しながら、DAXCluster01 を介した読み込み専用アクションもサポートする必要があります。

BobUserRole に対する次のポリシードキュメントの例では、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

さらに、DAXServiceRole には、DAXCluster01Books テーブルに対して読み込み専用のアクションを実行できるようにする IAM ポリシーが必要になります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

DynamoDB への読み込み/書き込みアクセスと DAX への読み込み/書き込みアクセス

次に、Bob に DynamoDB から直接、または DAXCluster01 からの間接的な Books テーブルへの読み込み/書き込みアクセスが必要であるとします。BobAccessPolicy にアタッチされている次のポリシードキュメントでは、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

さらに、DAXServiceRole には、DAXCluster01Books テーブルに対する読み込み/書き込みアクションを許可する IAM ポリシーが必要になります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

DAX 経由での DynamoDB へのアクセスの許可と DynamoDB への直接アクセスの防止

このシナリオでは、Bob は Books テーブルに DAX 経由でアクセスできますが、DynamoDB の Books テーブルに直接アクセスすることはできません。したがって、Bob が DAX にアクセスすると、他の場合ではアクセスできない DynamoDB テーブルへのアクセスも取得します。DAX サービスロール用の IAM ポリシーを設定する際に、ユーザーアクセスポリシー経由で DAX クラスターへのアクセスを付与されたユーザーには、そのポリシーで指定されたテーブルへのアクセスも付与されることに注意してください。この場合、BobAccessPolicy には DAXAccessPolicy で指定されたテーブルへのアクセスが付与されます。

現在 IAM ロールおよびポリシーを使用して DynamoDB テーブルおよびデータへのアクセスを制限している場合、DAX を使用することで、これらのポリシーが覆される場合があります。次のポリシーでは、Bob は DynamoDB テーブルに DAX 経由でアクセスできますが、DynamoDB の同じテーブルに明示的に直接アクセスすることはできません。

BobAccessPolicy にアタッチされている次のポリシードキュメント (BobUserRole) では、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" } ] }

このアクセスポリシーには、DynamoDB に直接アクセスするアクセス許可がありません。

BobAccessPolicy と次の DAXAccessPolicy により、BobUserRole は、DynamoDB テーブル Books にアクセスできるようになります。ただし、BobUserRole は、Books テーブルに直接アクセスすることはできません。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

この例に示すように、ユーザーアクセスポリシーおよび DAX クラスターアクセスポリシーのアクセスコントロールを設定する場合は、エンドツーエンドのアクセスを完全に理解し、最小権限の原則が守られていることを確認してください。また、DAX クラスターへのアクセスをユーザーに付与することで、以前に確立されたアクセスコントロールポリシーが覆されないことを確認してください。