IAM 許可のアクセスが拒否された、または不正なアクセスエラーのトラブルシューティングに役立つデータを取得するにはどうすればよいですか?
AWS リソースにアクセスを試みたところ、「access denied」(アクセスが拒否されました) または「unauthorized」(不正なアクセスです) というエラーが表示されました。これらの AWS Identity and Access Management (IAM) API コールの失敗のエラーのトラブルシューティングに役立つデータを取得するにはどうすればよいですか?
簡単な説明
Amazon Athena クエリまたは AWS Command Line Interface (AWS CLI) を使用して、IAM API コールの失敗のエラーログを取得できます。その後、指示に従って、IAM ポリシーを使用してアクセス拒否または不正なオペレーションエラーをトラブルシューティングします。
解決方法
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
オプション 1: Athena クエリを使用して、CloudTrail ログを検索することで、IAM API コールの失敗をトラブルシューティングする
注: この作業を開始する前に、Amazon Simple Storage Service (Amazon S3) バケットにログ記録するために証跡が作成されている必要があります。これは、証跡として Amazon S3 バケットに配信される AWS CloudTrail ログファイルに記録されたイベントが、Athena により使用されるためです。
1. 「AWS CloudTrail ログを検索するために Athena でテーブルを自動作成するにはどうすればよいですか?」のAthena テーブルの作成セクションのステップに従います。
注: 自動的に作成される Athena テーブルは、Amazon S3 バケットと同じ AWS リージョンにあります。
2. Athena コンソールを開き、プラス記号**「+」**を選択して新しいクエリを作成します。
3. 次のサンプルクエリを入力し、[Run] (実行) を選択します。
このサンプルクエリでは、時刻形式は 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 in an identity-based policy | | 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 because no identity-based policy allows the cloudtrail:LookupEvents action |
注: 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 秒あたり 2 件のリクエストに制限されています。この制限を超えると、スロットリングエラーが発生します。
2. このテーブルの出力例は、指定期間のアイデンティティ ARN の許可エラーを一覧で表示しています。
注: 過去 90 日間にリージョンで発生したイベントを検索できます。
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 in an identity-based policy 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 because no identity-based policy allows the cloudtrail:LookupEvents action
3. (オプション) 次の行を削除することで、すべてのユーザーのエラーを取得します。
.userIdentity.arn == \"your-arn\" and
4. (オプション) 次の行を削除することで、指定した期間で発生したすべてのエラーが取得できます。
and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\")))
不正なアクセスに関するエラーをトラブルシューティングする
Athena と以前の AWS CLI の出力例は、CloudTrail LookupEvents API コールに関連しています。
拒否ステートメントが含まれているためにアクセスを拒否する IAM ポリシーには、明示的および暗黙的な拒否のエラーメッセージに特定のフレーズが含まれています。IAM 明示的拒否エラーには、「with an explicit deny in a <type> policy」(<type> ポリシーに明示的拒否あり) というフレーズが含まれています。IAM の暗黙的拒否エラーには、「because no <type> policy allows the <action> action」(<action> アクションを許可する <type> ポリシーがないため) というフレーズが含まれています。
「cloudtrail:LookupEvents with an explicit deny」(cloudtrail:LookupEvents (明示的拒否あり)) の出力は、関連付けられている IAM ポリシーが正しくないことを示しています。
明示的拒否は、これらのポリシータイプのいずれかから発生する可能性があります。例えば、アイデンティティベースのポリシー、リソースベースのポリシー、許可の境界、組織の SCP、セッションポリシーなどです。明示的拒否ステートメントは常に許可ステートメントを上書きします。明示的拒否は、IAM ユーザーのアイデンティティベースのポリシーに存在します。
「cloudtrail:LookupEvents because no identity-based policy allows」(cloudtrail:LookupEvents (アイデンティティベースのポリシーで許可されていないため)) の出力は、アイデンティティベースのポリシーがこの API アクションを許可せず、暗黙的に拒否されることを示しています。アイデンティティベースのポリシーには、cloudtrail:LookupEvents API アクションに対する明示的許可のステートメントがありません。
アクセスを確立するために AWS によって評価されるポリシータイプは次のとおりです。
IAM ポリシーの評価方法と管理方法の詳細については、「ポリシーの評価論理」および「IAM ポリシーの管理」を参照してください。
関連情報

関連するコンテンツ
- 質問済み 3年前lg...
- 質問済み 4年前lg...
- 質問済み 5年前lg...
- 質問済み 4年前lg...