Amazon Web Services ブログ

Amazon DynamoDBでAPI操作のきめ細かいアクセス制御と監視を可能にする

お客様はアプリケーションのパフォーマンス、スケーラビリティ、耐障害性を向上させるためにDynamoDBを選択します。DynamoDBのサーバーレスアーキテクチャでは、ハードウェア、スケーリング、パッチ、保守を抽象化することで運用を簡単にすることができます。DynamoDBにおけるデータアクセスとセキュリティの管理は、インスタンスベースのデータベースソリューションとは異なります。RBDMSソリューションではファイアウォールのルールやパスワード認証、データベース接続管理に依存している一方で、DynamoDBは、AWS Identity and Access Management(IAM)を使用して、リソースへのアクセスの認証と認可を行います。

このブログではFine-grained Access Control (FGAC) を使用した、信頼できるIAMエンティティへの最小権限アクセス制御を実装する方法について説明します。DynamoDB上で条件ベースのIAMポリシーを使用してFGACを構成する方法を示し、AWSリージョンやタグなどの属性に基づいてDynamoDBへのきめ細かいアクセス制御を行うためのAWS IAM Identity Centerの権限セットのサンプルを提供します。また、DynamoDBとAWS CloudTrailを連携させ、DynamoDBのコントロールプレーンとデータプレーンのAPIアクションをログに記録する方法を紹介します。例えば、CloudTrailのログにDeleteItemイベントを記録し、Amazon CloudWatchのメトリクスフィルタを作成し、CloudWatchアラームを作成することができます。また、これらのリソースの作成を自動化するHashiCorp Terraform infrastructure as code (IaC)テンプレートも提供しています。

DynamoDBにおけるきめ細かいアクセス制御

きめ細かなアクセス制御を実装するステップは以下のようになります。

  1. IAMポリシーにおける条件式やプレフィックスを使用してIAM Identity Centerの許可セットを作成し、最小権限のアクセスを実装する。
  2. IAM Identity CenterでAWSアカウントを選択し、ユーザーとグループを割り当て、許可セットを割り当てる。

DynamoDBはフルマネージドなデータベースサービスであり、ホスティングされたデータベースの運用やスケーリングの管理負荷を軽減することができます。しかし、許可されたユーザーやアプリケーションがDynamoDBのデータを作成・変更できるようにするためには、AWSのサービスを利用して効果的にアクセス制御を実装する必要があります。具体的な内容に入る前に、基本的なことを理解しておくことが重要です。

IAMはAWSセキュリティの基盤です。これにより、AWSリソースに対して誰がどのようなアクションを実行することができるかを制御することができます。IAMユーザーやグループ、ロールに対して許可を拒否または付与することができます。

IAMに加えて、DynamoDBはリソースベースポリシーをサポートしています。リソースベースポリシーにより、各リソースにアクセスできるユーザーと、各リソースで実行できるアクションを指定することで、アクセス権限を定義できます。リソースベースポリシーは、IAM Access AnalyzerおよびBlock Public Access (BPA)機能との統合もサポートします。リソースベースポリシーにより、アカウント間のアクセス制御が大幅に簡素化されます。様々なDynamoDB認証シナリオと、それらを解決するためのリソースベースポリシーの実装方法については、「Simplify cross-account access control with Amazon DynamoDB using resource-based policies」を参照してください。

きめ細かいアクセス制御を実装する

DynamoDBでは、デーブル内の個々の項目や属性のレベルに至るまで、きめ細やかなアクセス制御を実装できます。以下のステップを完了します。

  1. DynamoDBテーブルにアクセスできるユーザーと、必要なアクセスレベルを特定します。実行する必要がある読み取りおよび書き込み操作を決定します。
  2. DynamoDBへのアクセスを必要とするサービスと個人のIAMユーザー、グループ、またはロールを作成します。
  3. IAMポリシーを作成し、IAMユーザーまたはロールにアタッチします。

以下はTestTableと呼ばれる特定のテーブルからタグを削除する操作を拒否するサンプルポリシーです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyDeleteTag2",
      "Effect": "Deny",
      "Action": [
        "dynamodb:UntagResource"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/TestTable"
      ]
    }
  ]
}

以下のポリシーはTestTableに対して全てのDynamoDBのアクションを許可します。

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
        { 
            "Sid": "AllowedResourcesWithPrefixApp", 
            "Effect": "Allow", 
            "Action": [ 
                "dynamodb:*" 
            ], 
            "Resource": [ 
                "arn:aws:dynamodb:us-east-1:123456789012:table/TestTable*" 
            ] 
        } 
    ] 
}

DynamoDBは、テーブル内のきめ細かなアクセス制御を定義できる条件式をサポートしています。操作が成功するために満たす必要がある条件を指定できます。次のサンプルポリシーでは、パーティションキーの値がテーブルTestTableのユーザーIDと一致する特定の属性にユーザーがアクセスできるようにします。${www.amazon.com:user_id} で表記されるIDは変数を代替しています。

{ 
    "Version":"2012-10-17", 
    "Statement":[ 
        { 
            "Sid":"AllowAccessToOnlyItemsMatchingUserID", 
            "Effect":"Allow", 
            "Action":[ 
                "dynamodb:GetItem", 
                "dynamodb:BatchGetItem", 
                "dynamodb:Query", 
                "dynamodb:PutItem", 
                "dynamodb:UpdateItem", 
                "dynamodb:DeleteItem", 
                "dynamodb:BatchWriteItem" 
            ], 
            "Resource":[ 
                "arn:aws:dynamodb:us-east-1:123456789012:table/TestTable" 
            ], 
            "Condition":{ 
                "ForAllValues:StringEquals":{ 
                    "dynamodb:LeadingKeys":[ 
                        "${www.amazon.com:user_id}" 
                    ], 
                    "dynamodb:Attributes":[ 
                        "attribute1", "attribute2", "attribute3" 
                    ] 
                }, 
                "StringEqualsIfExists":{ 
                    "dynamodb:Select":"SPECIFIC_ATTRIBUTES" 
                } 
            } 
        } 
    ] 
}

DynamoDBの操作とデータプレーンのアクティビティを監視する

DynamoDBはCloudTrailと統合されています。証跡を作成することで、DynamoDBコントロールプレーンAPIアクションをイベントとしてCloudTrail ログに記録できます。CloudTrailファイルのデータプレーンAPIアクションのロギングを有効にするには、CloudTrailでデータイベントのロギングを有効にする必要があります。データプレーンイベントをリソースタイプでフィルタリングして、CloudTrailに選択的に記録するDynamoDB API呼び出しを細かく制御できます。

大まかに手順は以下の通りです。

  1. CloudTrailを有効にして、DynamoDB APIオペレーションをログに記録できるようにします。
  2. CloudWatchメトリクスフィルターを使用して目的のAPIオペレーションをキャプチャし、それを数値のCloudWatchメトリクスに変換します。
  3. カスタムメトリクスを使用してCloudWatchアラームを作成します。
  4. Amazon Simple Notification Service (Amazon SNS)を使用して、作成したアラームの状態が変わった時に、登録しているエンドポイントまたはクライアントにEメールを送信します。

次の図は、このアーキテクチャのコンポーネントを示しています。

前提条件

このウォークスルーには以下が必要です。

  • AWSアカウント
  • 必要な権限を付与したIAMユーザーかロール
  • DynamoDB、CloudTrail、CloudWatch、Amazon SNSへのアクセス

CloudTrailを用いてDynamoDB操作をログに記録する

このソリューションでは、データイベントを作成して API アクションを CloudWatch ロググループに記録します。 これにより、どの DynamoDB 項目が作成、読み取られ、更新され、削除されたかをすばやく判断し、API 呼び出しのソースを特定できます。 不正な DynamoDB アクティビティを検出した場合、アクセスを制限するアクションをただちに実行することもできます。

次のスクリーンショットは、高度なイベントセレクター設定を使用してデータイベントを作成し、CloudTrail のデータプレーンオペレーション DeleteItem をキャプチャする方法を示しています。

次の例はAWS Command Line Interface (AWS CLI)を用いて高度なイベントセレクターを使用する方法を示しています。

aws cloudtrail put-event-selectors --trail-name TrailName \ --advanced-event-selectors '[ { "name": "findDeleteItems", "fieldSelectors": [ { "field": "eventCategory", "equals": [ "Data" ] }, { "field": "resources.type", "equals": [ "AWS::DynamoDB::Table" ] }, { "field": "eventName", "equals": [ "DeleteItem" ] } ] } ]

DynamoDBテーブルに項目を作成してから削除することで、このルールをテストできます。これにより、CloudTrailでDelete ItemのAPIオペレーションが生成されるはずです。トラフィックが生成されたら、次のスクリーンショットが示すように、CloudWatch Logsコンソールにログインしてロググループを選択し、イベントDeleteItemを検索できます。

以下はCloudWatch Logsコンソールで実行できるクエリのサンプルです。

  • アクセス拒否された操作を見つける。
filter (errorCode ="AccessDenied" and eventSource="dynamodb.amazonaws.com" and eventName ="DescribeGlobalTable")
  • 権限のない操作を見つける。
filter (errorCode ="UnauthorizedOperation" and eventSource="dynamodb.amazonaws.com" and eventName ="DescribeGlobalTable")

CloudWatchメトリクスフィルターの作成

メトリクスフィルターを使用して、ログデータを実用的なメトリクスに変換し、アラームを作成できます。フィルターには、単語、完全一致のフレーズおよび数値を使用できます。正規表現(regex)を使用して独自のフィルターパターンを作成することも、JSONやスペースで区切られたフィルターパターンと組み込むこともできます。

DeleteItemイベントに対するメトリクスフィルターを作成するには、 ロググループのメトリクスフィルターの作成を参照してください。

CloudWatchアラームを作成する

メトリクスフィルターを作成したら、CloudWatchアラームを作成できます。手順についてはCloudTrail イベントの CloudWatch アラームの作成: 例を参照してください。[アクションの設定]ページで[通知]を選択し、次に[アラーム状態]を選択します。これは、しきい値を超えた時にSNSトピックに通知を送信するアクションが実行されることを示します。

SNSトピックを作成する

SNSトピックを作成するために、Amazon SNSトピックの作成に記載のステップに従ってください。アラームのステートが変化した際、Amazon SNSはサブスクライブされたエンドポイントやクライアントにメールを送信します。

Terraformコード

DynamoDB API操作のCloudTrailログ、CloudWatchメトリクスフィルター、CloudWatchアラームの作成を自動化するためのコードが提供されています。その後、お好みの通知チャネルを使用してSNSトピックを作成できます。

DynamoDBの高度なオブザーバビリティ

CloudWatch Contributor Insightsを使用してログデータを分析し、コントリビューターデータを表示する時系列を作成できます。Contributor Insightsには、DynamoDBのパフォーマンスメトリクスを分析するための組み込みルールが用意されています。Contributor Insightsはパーティションとパーティション+ソートキーの両方について、頻繁にアクセスされるキーとスロットルされたキーを記録します。これにより、最もよく使用されるプライマリキーを見つけて、誰または何がシステムパフォーマンスに影響を与えているのかを理解できます。DynamoDBテーブルのContributor Insightsは明示的に有効にする必要があります。

またAmazon EventBridgeルールを使用して、CreateTableDeleteTableUpdateTableといったDynamoDB データ定義言語 (DDL) の操作をモニタリングし、SNSトピックを介して通知を受け取ることもできます。EventBridgeルールは特定の種類のイベントを監視します。一致するイベントが発生すると、そのイベントはルールに関連づけられているターゲットにルーティングされます。

まとめ

この投稿では、DynamoDB で条件ベースの IAM ポリシーを使用してきめ細かなアクセス制御を設定する方法に関するガイドラインを提供しました。 また、DynamoDB を CloudTrail と統合し、DynamoDB コントロールおよびデータプレーン API アクションをイベントとして CloudTrail ログに記録し、CloudWatch メトリクスフィルターを作成し、CloudWatch アラームを作成するための Terraform IaC テンプレートも提供しました。

このソリューションでは、予防的モニタリングと事後対応型のモニタリングのベストプラクティスを実装して、DynamoDB に適切なセキュリティ制御を適用できます。 きめ細かなアクセス制御の詳細については、 AmazonDynamoDBにおけるきめ細かなアクセス制御という動画をご覧ください。 詳細については、 AWS Well-Architected フレームワークDynamoDB を使用した設計とアーキテクチャの設計に関するベストプラクティスおよびDynamoDB テーブルのコストの最適化を参照してください。


著者情報

Arun Chandapillalは、ダイバーシティ&インクルージョンの推進者であるシニアアーキテクトです。 彼は、ビジネスファーストのクラウド採用戦略を通じてお客様が IT の近代化を加速し、クラウドでアプリケーションとインフラストラクチャをうまく構築、デプロイ、管理できるよう支援することに情熱を注いでいます。 Arun は自動車愛好家であり、熱心な講演者であり、慈善家であり、「与えたものは得られる(返される)」と信じています。


Parag Nagwekar は AWS Proserv のシニアクラウドインフラストラクチャアーキテクトです。 彼は顧客と協力して、クラウドとITの近代化への道のりを支援するソリューションを設計および構築しています。 彼の情熱は、クラウド内のアプリケーションにスケーラブルで可用性の高いサービスを提供することです。 システム管理、DevOps、分散アーキテクチャ、クラウドアーキテクチャなど、複数の分野での経験があります。

(本記事は 2024/05/21に投稿された Enable fine-grained access control and observability for API operations in Amazon DynamoDB を翻訳したものです。)