Amazon DynamoDB テーブルにアクセスしようとしているときに表示される AccessDeniedException というエラーをトラブルシューティングする方法を教えてください。

所要時間3分
0

Amazon DynamoDB テーブルにアクセスしようとしていますが、AccessDeniedException というエラーが表示されます。

簡単な説明

このエラーは、次の理由により発生する可能性があります。

  • DynamoDB テーブルへのアクセスに使用した AWS Identity and Access Management (IAM) ロールに必要なアクセス許可がない。
  • DynamoDB テーブルへのアクセスが組織レベルで制限されている。
  • DynamoDB の Amazon Virtual Private Cloud (Amazon VPC) エンドポイントに関連付けられたポリシーにより、オペレーションが制限されている。
  • 多要素認証 (MFA) を有効にし、MFA を使用してサインインせずにテーブルにアクセスしようとした。
  • DynamoDB テーブルの保護に、カスタマーマネージドキーまたは AWS マネージドキーを使用している。

解決方法

IAM ロールに必要なアクセス許可がない

DynamoDB はリソースベースのポリシーをサポートしていません。DynamoDB テーブルを作成する際は、テーブルへのアクセスに使用する IAM ロールに必要なアクセス許可を必ず付与してください。IAM ユーザー、グループ、またはロールにポリシーをアタッチして、必要なアクセス許可を付与できます。詳細については、「Amazon DynamoDB でのアイデンティティベースポリシー (IAM ポリシー) の使用」を参照してください。

AWS コマンドラインインターフェイス (AWS CLI) スクリプトを使用して、IAM アクセス許可 API の呼び出しに関する失敗をトラブルシューティングできます。

注: この AWS CLI スクリプトには、jq コマンドライン用の JSON プロセッサが必要です。チュートリアルとダウンロードの手順については、「JSON 出力形式」を参照してください。yum パッケージを使用するディストリビューションの場合は、次のコマンドを実行します。

$ sudo yum install jq

次の AWS CLI コマンドを実行します。

( echo "Time,Identity ARN,Event ID,Service,Action,Error,Message";
>   aws cloudtrail lookup-events --start-time "2022-08-04T13:23:00Z" --end-time "2022-08-04T13:27:00Z" --query "Events[*].CloudTrailEvent" --output text \
>     | jq -r ". | select(.userIdentity.arn == \"your-ARN\" and .eventType == \"AwsApiCall\" and .errorCode != null
>     and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\"))))
>     | [.eventTime, .userIdentity.arn, .eventID, .eventSource, .eventName, .errorCode, .errorMessage] | @csv"
> ) | column -t -s'",'

注: your-ARN をリソースの IAM ARN に置き換えてください。

このコマンドの出力は次のようになります。

Time                 Identity ARN                           Event ID                             Service                Action     Error Message 
2022-08-04T13:24:14Z arn:aws:iam::111122223333:user/article 42f420fe-ef06-43be-98a6-d5a0a90d7b4c dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* with an explicit deny in an identity-based policy
2022-08-04T13:51:22Z arn:aws:iam::111122223333:user/article b174e4e1-94a7-403e-a15f-1234aec796a6 dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* because no identity-based policy allows the dynamodb:ListTables action

この例の最初のメッセージは、この操作を拒否するユーザー 111122223333 にアクセス許可をアタッチしたため、ListTables アクションを実行できないことを示しています。2 番目のメッセージは、アイデンティティベースのポリシーで dynamodb:ListTables アクションが許可されていないことを示しています。

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

次のベストプラクティスを使用して、DynamoDB テーブルへのアクセスに必要なアクセス許可が IAM ロールにあることを確認してください。

  • IAM ロールが信頼ポリシーの DENY ステートメントに含まれていないことを確認してください。
  • IAM ロールが信頼ポリシーの ALLOW ステートメントに含まれていることを確認してください。
  • ALLOW ステートメント内で指定されたすべての IAM 条件が、sts:AssumeRole API アクションでサポートされていることを確認してください。
  • AWS CLI から DynamoDB テーブルにアクセスする場合は、正しいアクセスキー ID とシークレットアクセスキーを使用していることを確認してください。

詳細については、「IAM 許可のアクセスが拒否された、または不正なアクセスエラーのトラブルシューティングに役立つデータを取得するにはどうすればよいですか?」を参照してください。

DynamoDB テーブルへのアクセスが組織レベルで制限されている

DynamoDB テーブルにアクセスしようとしたときに次のエラーが表示される場合、サービスコントロールポリシーによりアクセスが拒否されています。

User: arn:aws:iam::11111222333:user/Admin is not authorized to perform: 
dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table with an explicit deny in a service control policy

この問題のトラブルシューティングを行うには、組織レベルで定義されているポリシーを確認します。

: 組織レベルで DynamoDB オペレーションを拒否した場合、必要なアクセス許可があったとしても、その組織または AWS アカウントに存在する IAM ロールが DynamoDB にアクセスすることはできません。

Amazon VPC エンドポイントポリシーによってオペレーションが制限されている

Amazon VPC を使用して、DynamoDB テーブルとアプリケーション間のデータ転送におけるプライバシーとセキュリティを向上させることができます。エンドポイントを作成する際、明示的または暗黙的な拒否を使用する IAM リソースポリシーを VPC エンドポイントにアタッチすることで、特定のユーザーにテーブルへのアクセスを制限できます。テーブルにアクセスしようとしている IAM ユーザーにアクセスを制限すると、次のようなエラーが表示されます。

An error occurred (AccessDeniedException) when calling the ListTables operation: User: arn:aws:iam::111222333444:user/Admin is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table/* with an explicit deny in a VPC endpoint policy

このエラーは、ユーザー Admin に対する ListTables オペレーションを拒否する明示的な DENY ステートメントが、VPC エンドポイントポリシーに含まれていることを示しています。

VPC エンドポイントポリシーを確認するには、AWS CLI コマンド describe-vpc-endpoints を実行します。

  • または -

次の操作を実行します。

  1. Amazon VPC コンソールを開きます。
  2. ナビゲーションペインから、[Endpoints] (エンドポイント) を選択します。
  3. VPC エンドポイントを選択します。
  4. 次に、[Policy] (ポリシー) タブを選択して、エンドポイントのポリシーを確認します。

MFA を使用してサインインせずにテーブルにアクセスしようとした

次のアイデンティティベースのポリシーを使用して、アカウントでMFA を設定したとします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAllExceptListedIfNoMFA",
      "Effect": "Deny",
      "NotAction": [
        "iam:CreateVirtualMFADevice",
        "iam:EnableMFADevice",
        "iam:GetUser",
        "iam:ListMFADevices",
        "iam:ListVirtualMFADevices",
        "iam:ResyncMFADevice",
        "sts:GetSessionToken"
      ],
      "Resource": "",
      "Condition": {
        "BoolIfExists": {
          "aws:MultiFactorAuthPresent": "false"
        }
      }
    }
  ]
}

この場合、MFA を使用した認証に必要なアクションを除くすべてのアクションが拒否されます。IAM ユーザーが MFA でサインインしていない場合、DynamoDB のアクションを含め、上記のポリシーに記載されていないすべてのアクションが拒否されます。

DynamoDB テーブルでカスタマーマネージドキーまたは AWS マネージドキーを使用している

カスタマーマネージドキーまたは AWS Key Management Service (AWS KMS) キーを使用して DynamoDB テーブルを作成する場合、その KMS キーのポリシーにより、ユーザーに代わってキーを使用するアクセス許可が DynamoDB に付与されている必要があります。

テーブルにアクセスする IAM ユーザーに、AWS KMS キーに対する次のような最小限のアクセス許可があることを確認してください。

  • DynamoDB は AWS KMS キーを使用して、テーブルキーと呼ばれるテーブル用の一意のデータキーを生成および暗号化します。このキーを生成して暗号化するには、kms:GenerateDataKey アクセス許可が必要です。
  • テーブルキーは、テーブルデータの暗号化に使用されるデータ暗号化キーのセキュリティ保護に使用されます。テーブル用にカスタマーマネージドキーが変更されると、DynamoDB は新しいテーブルキーを生成します。その後、DynamoDB は新しいテーブルキーを使用してデータ暗号化キーを再暗号化します。この操作を行うには、kms:ReEncrypt アクセス許可が必要です。
  • DynamoDB は、kms:DescribeKey オペレーションを使用して、選択したカスタマーマネージドキーがアカウントとリージョン内に存在するかどうかを判断します。キーがランダムに削除されると、DescribeKey の呼び出しはエラーを返します。
  • DynamoDB は許可を使用して、カスタマーマネージドキーにアクセス許可を設定します。これらのアクセス許可は、DynamoDB がバックグラウンドのシステムメンテナンスと継続的なデータ保護のタスクを実行する際に使用されます。アクセス許可は、テーブルキーの生成にも使用されます。そのため、kms:CreateGrant アクセス許可があることを確認してください。

詳細については、「Amazon DynamoDB が AWS KMS を使用する方法」を参照してください。


AWS公式
AWS公式更新しました 2年前
コメントはありません