[アップデート] DynamoDB がリソースベースポリシーをサポートしました!
こんにちは、AWS 事業本部の平木です!
DynamoDB がリソースベースポリシーをサポートし細かいアクセス制御をできるようになったのでブログにしました。
そもそもリソースベースポリシーって何?
IAM ロールや IAM ユーザーなどの IAM アイデンティティに対してアタッチできるポリシーが、アイデンティティベースポリシーなのに対して、
S3 や Lambda などのリソースにアタッチし、どのプリンシパルに対して特定のアクションを許可するかという制御を行うのが、リソースベースポリシーです。
詳しくは下記ブログをご参照ください。
やってみた
DynamoDB では先日インターフェイス型の VPC エンドポイントが使用できるようになったので、
今回は DynamoDB のインターフェイス型 VPC エンドポイントを経由したアクセスのみに制限してみたいと思います。
環境は以下のような環境を作成します。
EC2 や VPC の作成の工程は割愛します。
VPC エンドポイントの作成
DynamoDB のインターフェイス型 VPC エンドポイントの作成方法は以下を参照ください。
下記のように DynamoDB のインターフェイス型 VPC エンドポイントが完成しました。
エンドポイント URL は後ほど使用するため控えておいてください。
DynamoDB テーブルの作成
続いて本題の DynamoDB のテーブルを作成します。
今回のアップデートにより、テーブル作成画面に下記のようにリソースベースのポリシー の記述項目が増えました。
今回はここに下記のようなポリシーを適用してみることで、ソースが特定の VPC エンドポイントである場合を除き、DynamoDB テーブルへのList*
、Describe
、*ResourcePolicy
以外のアクションを拒否してみたいと思います。
※それぞれ固有の ID を置換してください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessToSpecificVPCEOnly", "Effect": "Deny", "Principal": "*", "NotAction": [ "dynamodb:*ResourcePolicy", "dynamodb:List*", "dynamodb:Describe*" ], "Resource": "arn:aws:dynamodb:ap-northeast-1:<AWS アカウント ID>:table/<Table 名>", "Condition": { "StringNotEquals": { "aws:SourceVpce": "<VPC エンドポイント ID>" } } } ] }
the new resource policy will not allow you to update the resource policy in the future.
上記エラーが設定時に出た場合には下記アクションは拒否条件から除外すると回避できます。
- DeleteResourcePolicy
- GetResourcePolicy
- PutResourcePolicy
リソースベースポリシーでポリシーの更新アクションを制限してしまうとポリシーを一切更新できなくなってしまうため拒否条件から除外する必要があります。
ポリシーを変更させたくない場合には、アイデンティティベースで制限してください。
検証
リソースがそろったところでDynmoDBFullAccess
の権限を持った EC2 から DynamoDB に API を実行し挙動を確認してみます。
まずは、DescribeTable
API で VPC エンドポイント経由でなくても実行できることを確認してみると問題なくアクセスできていることが確認できました。
~$ aws dynamodb describe-table \ --table-name sample-tb \ --region ap-northeast-1 \ --query Table.TableStatus "ACTIVE" ~$
Nat Gateway のルートを削除すると応答しなくなるため、Nat Gateway でアクセスしていることが分かります。
Nat Gateway のルートを戻し、続いてPutItem
API を使って Nat Gateway 経由で実行すると、VPC エンドポイント経由以外のアクセスは拒否しているため想定通り ErrorOccured が発生しました。
~$ aws dynamodb put-item \ --table-name sample-tb \ --region ap-northeast-1 \ --item '{ "id": { "N": "1" }, "num": { "N": "10" } }' An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:sts::012345678901:assumed-role/EC2onSimpleRole/i-0766747d157e6f4dd is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:ap-northeast-1:012345678901:table/sample-tb with an explicit deny in a resource-based policy
では VPC エンドポイント経由で問題なく実行できるか確認すると、エラーは特になくプロンプトが返ってきました。
~$ aws dynamodb put-item \ --table-name sample-tb \ --region ap-northeast-1 \ --endpoint-url https://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.dynamodb.ap-northeast-1.vpce.amazonaws.com \ --item '{ "id": { "N": "1" }, "num": { "N": "10" } }' ~$
最後、GetItem
API で確認してみると問題なく返ってきました。
~$ aws dynamodb get-item \ --table-name sample-tb \ --region ap-northeast-1 \ --endpoint-url https://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.dynamodb.ap-northeast-1.vpce.amazonaws.com \ --key '{ "id": {"N": "1"}, "num": { "N": "10"} }' { "Item": { "id": { "N": "1" }, "num": { "N": "10" } } } ~$
IAM Access Analyzer
リソースベースポリシーをサポートしたことによって、IAM Access Analyzer で意図しないプリンシパルに対して許可を与えていないかどうかの評価を DynamoDB にも実施することができるようになりました。
参考
- Using resource-based policies for DynamoDB - Amazon DynamoDB
- Resource-based policy examples - Amazon DynamoDB
おわりに
今回は、DynamoDB がリソースベースポリシーをサポートした件についてブログを執筆しました。
ポリシー内でポリシーの変更を行うアクションを除外する必要がある箇所については、頭を悩ませましたがよく考えてみると分かる部分だと感じました。
クロスアカウントの制御やタグベースでの制御など幅広いコントロールが可能だと思いますので、ぜひ検証などチャレンジしてみてください。
この記事がどなたかの役に立つと嬉しいです。