[アップデート] DynamoDB がリソースベースポリシーをサポートしました!

先日登場した DynamoDB のPrivateLink (インターフェイス型 VPC エンドポイント) との併用でより最小権限かつプライベートな DynamoDB へのアクセスが実現できます
2024.03.23

こんにちは、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 にも実施することができるようになりました。

参考

おわりに

今回は、DynamoDB がリソースベースポリシーをサポートした件についてブログを執筆しました。

ポリシー内でポリシーの変更を行うアクションを除外する必要がある箇所については、頭を悩ませましたがよく考えてみると分かる部分だと感じました。

クロスアカウントの制御やタグベースでの制御など幅広いコントロールが可能だと思いますので、ぜひ検証などチャレンジしてみてください。

この記事がどなたかの役に立つと嬉しいです。