IAM アクセス許可の「アクセス拒否」または「許可されていない」エラーのトラブルシューティングに役立つデータを取得する方法を教えてください。

所要時間3分
0

AWS リソースにアクセスすると、「アクセス拒否」または「許可されていない」エラーが表示されます。これらの AWS Identity and Access Management (IAM) API コールでのエラーをトラブルシューティングする参考となるデータを求めています。

簡単な説明

Amazon Athena クエリまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、障害が発生した IAM API コールのエラーログを取得します。次に指示に従い、IAM ポリシーでのアクセス拒否または操作が許可されていないことを示すエラーをトラブルシューティングします

解決策

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

Athena クエリを使用して CloudTrail ログを検索し、IAM API コールのエラーをトラブルシューティングする

注: 始める前に、Amazon Simple Storage Service (Amazon S3) バケットに記録するための証跡を作成する必要があります。Athena は、その証跡の Amazon S3 バケットに配信される AWS CloudTrail ログファイルに記録されたイベントを使用するため、この手順が必要です。

1.「Athena でテーブルを自動的に作成して AWS CloudTrail ログを検索する方法を教えてください」の「Athena テーブルを作成する」セクションに記載された手順を実行します。

注: 自動的に作成される Athena テーブルは、Amazon S3 バケットと同じ AWS リージョンに置かれます。

2.Athena コンソールを開き、プラス記号 "+" をクリックして新しいクエリを作成します。

3.次のクエリ例を入力し、[実行] を選択します。

このクエリ例では、時刻形式は ISO 8601 基本形式を使用しており、Z 変数は UTC です。

注: 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.次の表の出力例には、ID 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%')

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 リージョンにつき、1 秒あたり 2 件に制限されています。この制限を超えると、スロットリングエラーが発生します。

2.この表の出力例は、指定された期間における ID 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 コールに関連したものです。

Deny ステートメントが含まれているためにアクセスを拒否する IAM ポリシーでは、エラーメッセージに明示的拒否と暗黙的拒否に関する特定のフレーズが含まれます。IAM の明示的拒否エラーには、次のフレーズが含まれます。 <type> 「ポリシーに明示的な拒否があります」IAM の暗黙的拒否エラーには、次のフレーズが含まれます。 <type> 「アクションを許可する <action> ポリシーがありません」

出力に明示的な拒否を含む cloudtrail:LookupEvents は、関連する IAM ポリシーが正しくないことを示しています。

明示的な拒否が発生する可能性があるポリシータイプの例を次に示します。ID ベースのポリシー、リソースベースのポリシー、アクセス許可の境界、組織の SCP、セッションポリシー。明示的な deny ステートメントは、常に allow ステートメントよりも優先されます。明示的な拒否は、IAM ユーザーの ID ベースのポリシーにあります。

ID ベースのポリシーで許可されていないことが理由の cloudtrail:LookupEvents は、ID ベースのポリシーではこの API アクションが許可されず、暗黙的な拒否が発生したことを示しています。ID ベースのポリシーには、cloudtrail:LookupEvents API アクションに対する明示的な allow ステートメントがありません。

AWS がアクセスを確立するために評価するポリシータイプは次のとおりです。

IAM ポリシーの評価および管理方法の詳細については、「ポリシー評価ロジック」と「IAM ポリシーの管理」を参照してください。

関連情報

IAM のポリシーとアクセス許可

IAM ポリシーのトラブルシューティング

コメントはありません

関連するコンテンツ