Amazon DynamoDB テーブルにアクセスしたときの AccessDeniedException エラーをトラブルシューティングする方法を教えてください。
Amazon DynamoDB テーブルにアクセスしたいのですが、AccessDeniedException エラーが発生します。
簡単な説明
このエラーは、次の理由で表示される可能性があります。
- DynamoDB テーブルへのアクセスに使用した AWS ID およびアクセス管理 (IAM) ロールには、必要な権限がない。
- DynamoDB テーブルへのアクセスは組織レベルで制限されている。
- DynamoDB の Amazon Virtual Private Cloud (Amazon VPC) エンドポイントに関連付けられているポリシーが操作を制限している。
- 多要素認証 (MFA) を有効にしたものの、テーブルにアクセスするためのサインインに MFA を使用しなかった。
- DynamoDB テーブルを保護に、カスタマー管理キーまたは AWS マネージドキーを使用している。
- DynamoDB の Amazon CloudWatch Contributor Insights にアクセスできない。
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
解決策
IAM ロールには必要なアクセス許可がない
DynamoDB テーブルを作成するときに、テーブルへのアクセスに使用する IAM ロールに必要なアクセス権限を付与します。ポリシーを IAM ユーザー、グループ、またはロールにアタッチして、必要なアクセス許可を付与できます。詳細については、「Amazon DynamoDB でのアイデンティティベースのポリシーの使用」を参照してください。
IAM 権限 API コールの失敗をトラブルシューティングするには、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'",'
ご使用の ARN をリソース用の IAM ARN に置き換えてください。
**注:**AWS CLI スクリプトには jq コマンドライン JSON プロセッサが必要です。チュートリアルとダウンロードの手順については、「JSON 出力形式」を参照してください。
yum パッケージを使用するディストリビューションでは、次のコマンドを実行します。
$ sudo yum install jq
このコマンドの出力は以下のようになります。
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 番目のメッセージは、ID ベースのポリシーで DynamoDB: ListTables アクションが許可されていないことを意味します。
IAM ロールに DynamoDB テーブルへのアクセスに必要な権限があることを確認するためのベストプラクティスを以下に示します。
- 信頼ポリシーの DENY ステートメントには IAM ロールを含めないでください。
- 信頼ポリシーの ALLOW ステートメントに IAM ロールを含めてください。
- 許可ステートメント内で指定されたすべての IAM 条件が、sts:AssumeRole API アクションでサポートされていることを確認します。
- AWS CLI を使用して DynamoDB テーブルにアクセスする場合は、正しいアクセスキー ID とシークレットアクセスキーを使用してください。
詳細については、「IAM 権限アクセス拒否または不正エラーのトラブルシューティングに役立つデータを取得するにはどうすればよいですか」を参照してください。
DynamoDB テーブルへのアクセスは組織レベルで制限されている
DynamoDB テーブルにアクセスしようとしたときに次のエラーが表示される場合は、サービスコントロールポリシーによってアクセスが拒否されたことになります。
「サービスコントロールポリシーで明示的に拒否されているため、ユーザー: arn:aws:iam::11111222333:user/Admin にはリソース: arn:aws:dynamodb:us-east-1:11111222333:table 上で dynamodb:ListTables を実行する権限がありません」
この問題をトラブルシューティングするには、組織レベルで定義されているポリシーを更新してください。
**注:**組織レベルで DynamoDB オペレーションを拒否すると、その組織または AWS アカウントに存在するすべての IAM ロールが拒否されます。ロールまたはアカウントに必要な権限があっても、ロールまたはアカウントは拒否されます。
Amazon VPC エンドポイントポリシーにより操作が制限される
DynamoDB テーブルとアプリケーション間のデータ転送のプライバシーとセキュリティを向上させるには、Amazon VPC を使用できます。VPC エンドポイントに、テーブルへの IAM ユーザーのアクセスを制限する IAM リソースポリシーがある場合、次のエラーが表示されます。
ListTables オペレーション呼び出しのエラーが発生しました (AccessDeniedException): 「VPC エンドポイントポリシーで明示的に拒否されているため、ユーザー: arn:aws:iam::111222333444:user/Admin には、リソース: arn:aws:dynamodb:us-east-1:11111222333: table/* で、dynamodb:ListTables を実行する権限がありません」
このエラーを受け取った場合は、VPC エンドポイントポリシーに、ユーザー管理者の ListTables 操作を拒否する明示的な DENY ステートメントがあります。
VPC エンドポイントポリシーを表示するには、AWS CLI コマンド describe-vpc-endpoints を実行します。または、次の手順を実行してコンソールにポリシーを表示します。
- Amazon VPC コンソールを開きます。
- ナビゲーションペインで [エンドポイント] を選択します。
- VPC エンドポイントを選択します。
- 次に、[ポリシー] タブを選択して、エンドポイントポリシーを確認します。
この問題を解決するには、VPC エンドポイントポリシーを更新してください。
テーブルにアクセスするためのサインインに MFA を使用しなかった
アカウントで次の ID ベースのポリシーを使用して 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 アクションを含め、上記のポリシーに記載されていないすべてのアクションが拒否されます。
この問題を解決するには、MFA でサインインしてください。
DynamoDB テーブルはカスタマーマネージドキーまたは AWS マネージドキーを使用している
カスタマーマネージドキーまたは AWS Key Management Service (AWS KMS) キーを使用する DynamoDB テーブルには、正しいアクセス権限が必要です。KMS キーポリシーは、ユーザーに代わってキーを使用する権限を DynamoDB に付与する必要があります。テーブルにアクセスする IAM ユーザーには、AWS KMS キーに対する以下の最低アクセス権限が必要です。
- DynamoDB は AWS KMS キーを使用して、テーブルキーと呼ばれるテーブルの一意のデータキーを生成して暗号化します。このキーを生成して暗号化するには、kms:GenerateDataKey 権限が必要です。
- 暗号化されたキーにアクセスするには、AWS KMS キーに kms:Encrypt 権限と kms:Decrypt 権限が必要です。
- テーブルキーは、テーブルデータの暗号化に使用されるデータ暗号化キーを保護するために使用されます。カスタマーマネージドキーがテーブル用に変更された場合、DynamoDB は新しいテーブルキーを生成します。次に、DynamoDB は新しいテーブルキーを使用してデータ暗号化キーを再暗号化します。この操作を行うには、kms:ReEncrypt 権限が必要です。
- DynamoDB は kms:DescribeKey オペレーションを使用して、選択したカスタマーマネージドキーがアカウントとリージョンに存在するかどうかを判断します。キーがランダムに削除された場合、DescribeKey 呼び出しはエラーを返します。
- DynamoDB は権限を使用してカスタマーマネージドキーにアクセス権限を設定します。これらの付与権限は、DynamoDB がバックグラウンドシステムメンテナンスと継続的なデータ保護タスクを実行するときに使用されます。権限の付与はテーブルキーの生成にも使用されます。そのため、KMS:CreateGrant 権限を持っていることを確認してください。
詳細については、「Amazon DynamoDB が AWS KMS を使用する方法」を参照してください。
DynamoDB の CloudWatch Contributor Insights にアクセスできない
DynamoDB の CloudWatch Contributor Insights にアクセスしようとしたときにエラーが表示される場合は、適切な IAM 権限がない可能性があります。CloudWatch Contributor Insights にアクセスするには、次の権限が必要です。
詳細については、「DynamoDB の CloudWatch contributor insights: 仕組み」を参照してください。
**注:**DynamoDB は属性ベースのアクセス制御 (ABAC) をサポートしていません。また、タグベースの条件を使用してテーブルへのアクセスを制御することはできません。代わりに、きめ細かなアクセス制御 (FGAC) には IAM ポリシー条件を使用してください。
関連情報
IAM: プログラムおよびコンソールで複数のサービスへのアクセスを許可または拒否する
