IAM アクセス許可でのアクセス拒否または不正なアクセスのエラーをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2019 年 12 月 20 日

AWS リソースにアクセスしようとして、「アクセスが拒否されました」または「不正なアクセスです」というエラーが表示されました。AWS Identity and Access Management (IAM) ユーザーのアクセス許可の問題をトラブルシューティングするにはどうすればよいですか?

簡単な説明

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

解決方法

オプション 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 のインストール設定が完了していることを確認してください。

注意: この 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 ポリシーを管理するを参照してください。