ある企業はマルチテナント SaaS アプリケーションを開発しています。各テナントのデータを DynamoDB テーブルに保存しており、テナント A のユーザーがテナント C のデータにアクセスできないよう保証する必要があります。Cognito で認証済みのユーザーに対して、テナント単位のアクセス制御を実現する最もスケーラブルな方法はどれですか?
- A. テナントごとに異なる DynamoDB テーブルを作成し、Cognito グループとロールのマッピングでテーブルレベルのアクセスを制御する
- B. Cognito ID プールのロールセッションタグと IAM ポリシーの aws:RequestedRegion 条件を組み合わせる
- C. 1 つの DynamoDB テーブルにすべてのテナントデータを保存し、アプリケーションコード内でテナント ID フィルタリングを実装する
- D. Cognito ID プールの属性ベースアクセス制御(ABAC)でテナント ID をセッションタグとして渡し、IAM ポリシーの dynamodb:LeadingKeys 条件でパーティションキーをテナント ID に限定する
解答と解説を見る
正解: D
ABAC(属性ベースアクセス制御)を使い、Cognito の認証済みユーザーにテナント ID をセッションタグとして付与します。IAM ポリシーでは dynamodb:LeadingKeys 条件を使ってパーティションキー(テナント ID)をセッションタグ値と一致するもののみに制限します。これにより 1 つのポリシーで全テナントを制御でき、テナント増加時も追加変更が不要で最もスケーラブルです。A はテナントごとにテーブルを作成するとテーブル数が膨大になりコストと管理負荷が増大します。C はアプリケーションコードでフィルタリングするのはバグやセキュリティ脆弱性のリスクがあります。B の aws:RequestedRegion はリージョン制限のための条件キーでテナント分離には使えません。
📚 関連サービスの解説: Amazon Cognito ・ AWS IAM