IAM アクセス許可でのアクセス拒否または不正なアクセスのエラーをトラブルシューティングするにはどうすればよいですか?
最終更新日: 2021 年 1 月 7 日
AWS リソースにアクセスを試みたところ、"access denied (アクセスが拒否されました)" または "unauthorized (不正なアクセスです)" というエラーが表示されました。AWS Identity and Access Management (IAM) ユーザーに対するアクセス許可の問題を、トラブルシューティングする方法を教えてください。
簡単な説明
Amazon Athena クエリまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、IAM アクセス許可 API の呼び出しに関する失敗をトラブルシューティングできます。
解決方法
注: AWS CLI コマンドの実行時にエラーが発生した場合は、使用する AWS CLI を最新バージョンにしてください。
オプション 1: Athena クエリを使用し AWS CloudTrail ログを検索することで IAM アクセス許可 API の呼び出しに関する失敗をトラブルシューティングする
注: この作業を開始する前に、Amazon Simple Storage Service (Amazon S3) バケットへのログ記録を、証跡として有効にする必要があります。これは、証跡として Amazon S3 バケットに配信される CloudTrail ログファイルに記録されたイベントが、Athena により使用されるためです。
1. 「AWS CloudTrail ログを検索するために Amazon Athena でテーブルを自動作成するにはどうすればよいですか?」のAthena テーブルの作成セクションの手順に従います。
注意: 自動的に作成される Athena テーブルは、Amazon S3 バケットと同じ AWS リージョンにあります。
2. Athena コンソールを開き、[新規クエリ] を選択してから、ダイアログボックスを選択してサンプルクエリを削除します。
3. 次のサンプルクエリを入力し、[クエリの実行] を選択します。
このサンプルクエリでは、時刻形式は ISO 8601 基本形式および UTC の Z 記号を使用します。
注意: your-arn をリソースの IAM Amazon リソースネーム (ARN) に置き換え、your-table をテーブル名に置き換えます。
SELECT from_iso8601_timestamp(eventTime) AS "Time", useridentity.arn AS "Identity ARN", eventID AS "Event ID",
eventsource AS "Service", eventname AS "Action", errorCode AS "Error", errorMessage AS "Message"
FROM your-table
WHERE from_iso8601_timestamp(eventtime) >= from_iso8601_timestamp('2019-10-29T06:40:00Z')
AND from_iso8601_timestamp(eventtime) < from_iso8601_timestamp('2019-10-29T06:55:00Z')
AND userIdentity.arn = 'your-arn'
AND eventType = 'AwsApiCall'
AND errorCode is not null
AND (lower(errorCode) LIKE '%accessdenied%' OR lower(errorCode) LIKE '%unauthorized%')
ORDER BY eventTime desc
4. このテーブルの出力例は、アイデンティティ ARN のアクセス許可エラーを示しています。
| Time | Event ID | Service | Action | Error | Message |
|-----------------------------|--------------------------------------|--------------------------|--------------|--------------|----------------------------------------------------------------------------------------------------------------------|
| 2019-10-29 06:52:45.000 UTC | 0406f0c1-47a8-4f71-8a94-18267b84042a | cloudtrail.amazonaws.com | LookupEvents | AccessDenied | User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents with an explicit deny |
| 2019-10-29 06:41:48.000 UTC | 14e5e77c-f682-45e1-8c88-12d15af293dd | cloudtrail.amazonaws.com | LookupEvents | AccessDenied | User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents |
注意: CloudTrail イベント出力では、結果が配信されるまでに最大 15 分かかることがあります。
5. 必要に応じて、サンプルクエリから次の行を削除することで、すべてのユーザーのエラーを取得します。
AND userIdentity.arn = 'your-arn'
6. 必要に応じて、サンプルクエリから次の行を削除することで、指定した期間で発生したすべてのエラーが取得できます。
AND (lower(errorCode) LIKE '%accessdenied%' OR lower(errorCode) LIKE '%unauthorized%')
オプション 2: AWS CLI を使用して IAM アクセス許可 API の呼び出しに関する失敗をトラブルシューティングする
注: この AWS CLI スクリプトには、jq コマンドライン用の JSON プロセッサが必要です。チュートリアルとダウンロードの手順については、JSON 出力形式を参照してください。yum パッケージを使用するディストリビューションの場合は、次のコマンドを実行します。
$ sudo yum install jq
1. 次の AWS CLI コマンドを実行します。
注意: your-arn をリソースの IAM ARN に置き換えます。
( echo "Time,Identity ARN,Event ID,Service,Action,Error,Message";
aws cloudtrail lookup-events --start-time "2019-10-29T06:40:00Z" --end-time "2019-10-29T06:55: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'",'
注意: CloudTrail へのルックアップ要求の速度は、アカウントごとに 1 秒あたり 1 要求に制限されています。この制限を超えると、スロットリングエラーが発生します。
2. このテーブルの出力例は、過去 90 日間のアイデンティティ ARN のアクセス許可エラーを示しています。
Time Event ID Service Action Error Message
2019-10-29T06:52:45Z 0406f0c1-47a8-4f71-8a94-18267b84042a cloudtrail.amazonaws.com LookupEvents AccessDenied User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents with an explicit deny
2019-10-29T06:41:48Z 14e5e77c-f682-45e1-8c88-12d15af293dd cloudtrail.amazonaws.com LookupEvents AccessDenied User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents
3. 必要に応じて、次の行を削除することで、すべてのユーザーのエラーを取得します。
.userIdentity.arn == \"your-arn\" and
4. 必要に応じて、次の行を削除することで、指定した期間で発生したすべてのエラーが取得できます。
and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\")))
不正なアクセスに関するエラーのトラブルシューティング
Athena および AWS CLI の出力例は、CloudTrail サービスの LookupEvents アクションの呼び出しに関する情報を含んでいます。
cloudtrail: LookupEvents の出力に明示的な拒否が示されている場合は、IAM ポリシーが正しくないこと意味しています。すべての IAM ポリシータイプは、拒否エラーを明示的に返します。また、明示的な拒否ステートメントは常に許可ステートメントを上書きします。
cloudtrail: LookupEvents 出力は、エラーが暗黙的な拒否の結果であることを示します。この出力エラーは、次の場合に発生することがあります。
- IAM ポリシーで、cloudtrail: LookupEvents アクションが明示的に許可されている。
- アイデンティティのアクセス許可の上限が IAM ポリシーによって制限されている。
- アカウントの AWS Organizations のサービスコントロールポリシー (SCP) に、明示的な許可がない。
アクセスを確立するために IAM によって評価されるポリシータイプは次のとおりです。
- AWS Organizations SCP
- リソースベースのポリシー
- IAM アクセス許可の境界
- セッションポリシー
- アイデンティティベースのポリシー
IAM ポリシーの評価方法と管理方法の詳細については、ポリシーの評価論理 および IAM ポリシーの管理を参照してください。