この記事はAWSシニアエバンジェリスト Jeff BarrのAmazon Web Services Blogの記事、Fine-Grained Access Control for Amazon DynamoDBを堀内康弘 (Facebook, Twitter)が翻訳したものです。
私はAWSの新サービスおよび新機能と一緒にブログを公開するプロセスを本当に楽しんでいます。 多くの機能は数十万人のAWSをご利用の皆様からの特定のリクエストからはじまっています。 我々のコアバリューの一つである "Customer Obsession" を信条に、AWSチームの誰もが、お客様の声に耳を傾け、それらのフィードバックが適切なサービスチームに届いたことを確認することに全力を尽くしています。
Amazon DynamoDBは短期間のうちにデベロッパーの間で非常に人気になっています。 多くの開発者はDynamoDBを、モバイルアプリやオンラインゲームを構築するのに使っています。この種のアプリはDynamoDBを使うことで、スケーラビリティ、柔軟性、効率性といったベネフィットを得ることができます。 これらのアプリは一般的に、簡単に数百万、数千万のユーザーまで成長するようなユーザーベース全体の情報を保存するために、ひとつのテーブルを使います。 このようにシナリオでは、アプリの認証と認可の処理を行うためにアプリとDynamoDBの間にプロクシ層をもうける必要があります。

プロクシを使用することで、追加に費用がかかることはもちろんのこと、レイテンシーが生じたり、複雑性が増したりします。しかしこういったプロクシベースのアーキテクチャは一般的でよく目にするものでした。多くの場合、プロクシは特定のアイテム(場合によっては、属性)に対するアクセスの制限以上のことは何も行いません。
Fine-Grained Access Control for DynamoDB (DynamoDB用のきめ細かなアクセス制御)
上記のようなユースケースをより簡単に実装できるようにするために、Fine-Grained Access Control for DynamoDBをローンチいたしました。
AWS Identity and Access Management (IAM) ポリシーを使用して、DyanmoDBのテーブルに格納されたアイテムおよび属性に対するアクセスを、上記のような中間層のプロキシを必要とせずに、制御することができます。
例えば、Fine-Grained Access Controlを使えば、以下のようなものを構築することができます。
- ユーザーの位置情報に基づいて、近くの空港の情報を表示するモバイルアプリ。このアプリは、エアライン名、到着時刻、およびフライトナンバーといった属性にアクセスおよび表示することができますが、パイロット名または乗客数にアクセスまたは表示することはできません。
- ひとつのテーブルに全てのユーザーのハイスコアを保存するモバイルゲーム。各ユーザーは自身のスコアを更新することはできますが、他人のスコアにはアクセスすることができません。
Fine-Grained Access Controlは、IAMのCondition要素を使って実装されています。この要素を使って、アプリケーションのニーズに応じたアイテムおよび属性に対するアクセスを許可または拒否することができます。選択できるオプションは次のとおりです。
Horizontal - ハッシュキーの値に一致させることにより、特定のテーブルの特定のDynamoDBのアイテムを、選択的に隠したり、公開したりすることができます。

Vertical - 属性名に一致させることにより、特定のテーブルのDynamoDBのアイテム全ての特定の属性を、選択的に隠したり、公開したりすることができます。

Combined - 同じポリシー内でHorizontalとVerticalのコントロールを行使することができます。

このオプションとIAM Actionを組み合わせることで、さらに細かいコントロールを行うことができます。例えば、ポリシー内でGetItemとQueryのみを許可することにより、上記のようなオプションの読み取り専用のバリアントを作成できます。
Fine-Grained Access Controlの利用手順
アクセスポリシーを作成する方法、IAM roleを作成する方法、アプセスポリシーをロールに適用する方法をさらに詳しく知りたい方は、DynamoDBのデベロッパーガイドのFine-Grained Access Controlセクションをご覧ください。
また、サンプルポリシーのコレクションも用意されています。
roleのtrustポリシーはどのIDプロバイダ(例えば、Login with Amazon、Facebook、Google)を許可するかを決定し、accessポリシーはどのAWSリソース(例えば、DynamoDBのテーブル、アイテム、属性)をアクセス許可するのかを決定します。
こちらは非常にシンプルなポリシーです。各認証されたユーザーは、GameScoresテーブル内の自分自身の項目に読み取り専用のアクセス権を持ちます。
{"Version":"2012-10-17","Statement": [{"Effect":"Allow","Action": ["dynamodb:GetItem","dynamodb:BatchGetItem","dynamodb:Query"
],"Resource": ["arn:aws:dynamodb:us-west-2:123456789012:dynamodb:table/GameScores"],"Condition": {"ForAllValues:StringEquals": {"dynamodb:LeadingKeys": ["${www.amazon.com:user_id}"]
}
}
}]
}
コードの中では、AWS Security Token ServiceのAssumeRoleWithWebIdentity関数を呼び出し、DynamoDB用の一時セキュリティクレデンシャルを取得するために、roleを使います。
最初のポリシーを作成するために新らしいDynamoDB Policy Generatorを使うことができます。DyanamoDBのコンソールに移動し、テーブルを選択したら、Access Controlボタンをクリックします。



ポリシーを作成したら、Web ID プロバイダが許可なしでアクセスできるようにするためにIAM Consoleに向かいます。そして、rolにポリシーを貼りつけます。

このパワフルな新しいアクセス制御の機能が皆様のお役にたてれば幸いです。是非感想をお聞かせください!
-- Jeff;
この記事はAWSシニアエバンジェリスト Jeff BarrのAmazon Web Services Blogの記事、Fine-Grained Access Control for Amazon DynamoDBを堀内康弘 (Facebook, Twitter)が翻訳したものです。