IAM Access Analyzer のポリシー生成で発生する権限不足エラーを検証してみた
はじめに
クラウド事業本部コンサルティング部の山﨑です。
前回の記事では、IAM Access Analyzer のポリシー生成に必要な CloudTrail、S3、IAM Access Analyzer 用ロールの権限を整理し、CloudTrail ログをもとにポリシーテンプレートが生成されることを確認しました。
IAM Access Analyzer のポリシー生成に必要な権限を整理し、CloudTrail ログからポリシーを生成してみた
正常に動くことは確認できた一方で、実際に利用する際には、CloudTrail や S3、IAM Access Analyzer 用ロールに必要な権限が不足していると、ポリシー生成に失敗するケースもありそうです。
そこで今回は、IAM Access Analyzer のポリシー生成で必要な権限や設定をあえて不足させた場合に、どのようなエラーや表示になるのかを検証してみました。
検証内容
今回は、以下のパターンで、権限や設定が不足している場合、または分析対象イベントが存在しない場合のポリシー生成時の動作を検証しました。
| パターン | 内容 |
|---|---|
| パターン1 | IAM Access Analyzer 用ロールから S3 読み取り権限を外す |
| パターン2 | S3 バケットポリシーで IAM Access Analyzer 用ロールを明示的に拒否する |
| パターン3 | IAM Access Analyzer 用ロールから CloudTrail 参照権限を外す |
| パターン4 | IAM Access Analyzer 用ロールから IAM サービス最終アクセス情報の権限を外す |
| パターン5 | 分析対象期間内に対象ロールのイベントがない場合を確認する |
結論
今回の検証結果を先にまとめると、以下のようになりました。
| 状態 | 結果 |
|---|---|
| IAM Access Analyzer 用ロールに S3 読み取り権限がない | Incorrect permissions assigned to access CloudTrail S3 bucket. |
| S3 バケットポリシーで IAM Access Analyzer 用ロールを明示的に拒否 | Incorrect permissions assigned to access CloudTrail S3 bucket. |
| IAM Access Analyzer 用ロールに CloudTrail 参照権限がない | cloudtrail:GetTrail の権限不足 |
| IAM Access Analyzer 用ロールに IAM サービス最終アクセス情報の権限がない | Incorrect permissions assigned to accessRole. |
| 分析対象期間内に対象ロールのイベントがない | ポリシー生成は成功するが、「指定された期間の CloudTrail ログにサービスとアクションは見つかりませんでした」と表示される |
特に分かりやすかったポイントは以下です。
- S3 権限不足と S3 バケットポリシーによる拒否は、どちらも同じ S3 バケットアクセス権限エラーになる
- 今回の検証では、CloudTrail 関連権限を外した場合、
cloudtrail:GetTrailの権限不足として表示される - IAM サービス最終アクセス情報の権限が不足している場合は、
accessRoleの権限不足として表示される - 分析対象期間にイベントがない場合は権限エラーではなく、ポリシー生成自体は成功する
そのため、IAM Access Analyzer のポリシー生成でエラーが出た場合は、エラーメッセージに応じて以下を確認すると切り分けしやすそうです。
Incorrect permissions assigned to access CloudTrail S3 bucket.
→ IAM Access Analyzer 用ロールの S3 権限
→ CloudTrail ログ保存先 S3 バケットのバケットポリシー
cloudtrail:GetTrail の権限不足
→ IAM Access Analyzer 用ロールの CloudTrail 参照権限
Incorrect permissions assigned to accessRole.
→ IAM Access Analyzer 用ロールの IAM サービス最終アクセス情報に関する権限
指定された期間の CloudTrail ログにサービスとアクションは見つかりませんでした
→ 分析対象期間
→ 対象ロールの API コール有無
検証環境
前回の記事で作成した以下のリソースを利用します。
| 種別 | 名前 |
|---|---|
| S3 バケット | test-access-analyzer-cloudtrail-logs-example |
| CloudTrail 証跡 | test-access-analyzer-trail |
| ポリシー生成対象ロール | test-access-analyzer-target-role |
| IAM Access Analyzer 用ロール | test-access-analyzer-access-role |
| 正常系ポリシー | test-access-analyzer-access-policy |
正常系では、IAM Access Analyzer 用ロールに CloudTrail、S3、IAM サービス最終アクセス情報に関する権限を付与しています。
やってみる
パターン1:S3 読み取り権限がない場合
まず、IAM Access Analyzer 用ロールから CloudTrail ログ保存先 S3 バケットを参照するための権限を外してみます。
具体的には、今回の正常系ポリシーで付与していた以下の S3 関連権限をまとめて削除したポリシーを作成し、IAM Access Analyzer 用ロールにアタッチしました。
s3:GetObject
s3:ListBucket
s3:GetBucketLocation
この状態で AWS マネジメントコンソールからポリシー生成を実行したところ、以下のエラーが表示されました。
ポリシーの生成に失敗しました。
Incorrect permissions assigned to access CloudTrail S3 bucket.
Please fix before trying again.

IAM Access Analyzer 用ロールに CloudTrail ログ保存先 S3 バケットへの読み取り権限がない場合、ポリシー生成は失敗することが分かりました。
CloudTrail 証跡が有効で、対象ロールの API コールが記録されていても、IAM Access Analyzer 用ロールが S3 バケットを読めなければポリシー生成はできません。
設定を元に戻して、正常にポリシー生成ができるか確認します。

各パターンの間では、設定を正常な状態に戻したうえでポリシー生成ができることを確認しています。以降は長くなるため、正常状態への復旧確認については割愛します。
パターン2:S3 バケットポリシーで拒否した場合
次に、IAM Access Analyzer 用ロールには S3 読み取り権限を残したまま、S3 バケットポリシー側で IAM Access Analyzer 用ロールを明示的に拒否してみます。
追加した Deny は以下のような内容です。
{
"Sid": "DenyAccessAnalyzerRead",
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/test-access-analyzer-access-role"
},
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::test-access-analyzer-cloudtrail-logs-example",
"arn:aws:s3:::test-access-analyzer-cloudtrail-logs-example/*"
]
}
この状態で AWS マネジメントコンソールからポリシー生成を実行したところ、パターン1と同じエラーが表示されました。
ポリシーの生成に失敗しました。
Incorrect permissions assigned to access CloudTrail S3 bucket.
Please fix before trying again.

IAM Access Analyzer 用ロール側に S3 読み取り権限があっても、S3 バケットポリシーで明示的に拒否されている場合は、ポリシー生成に失敗しました。
また、エラーメッセージは IAM Access Analyzer 用ロール側の S3 権限が不足している場合と同じでした。
そのため、このエラーが出た場合は、以下の両方を確認する必要がありそうです。
- IAM Access Analyzer 用ロールの IAM ポリシー
- CloudTrail ログ保存先 S3 バケットのバケットポリシー
パターン3:CloudTrail 参照権限がない場合
次に、IAM Access Analyzer 用ロールから CloudTrail 参照権限を外してみます。
具体的には、今回の正常系ポリシーで付与していた以下の CloudTrail 関連権限を削除しました。
cloudtrail:GetTrail
cloudtrail:DescribeTrails
cloudtrail:GetTrailStatus
cloudtrail:ListTags
cloudtrail:ListTrails
cloudtrail:LookupEvents
この状態で AWS マネジメントコンソールからポリシー生成を実行したところ、以下のエラーが表示されました。
エラーが発生しました。
Validation error occurred while calling cloudtrail:GetTrail:
User: arn:aws:sts::123456789012:assumed-role/test-access-analyzer-access-role/EXAMPLE
is not authorized to perform: cloudtrail:GetTrail
on resource: arn:aws:cloudtrail:ap-northeast-1:123456789012:trail/test-access-analyzer-trail
because no identity-based policy allows the cloudtrail:GetTrail action

このエラーは原因が分かりやすいです。
エラー内に以下が含まれていました。
assumed-role/test-access-analyzer-access-role/EXAMPLE
つまり、IAM Access Analyzer が test-access-analyzer-access-role を AssumeRole するところまでは成功しています。
その後、AssumeRole したロールに cloudtrail:GetTrail 権限がないため、CloudTrail 証跡の参照で失敗していることが分かります。
パターン4:IAM サービス最終アクセス情報の権限がない場合
次に、IAM Access Analyzer 用ロールから IAM のサービス最終アクセス情報に関する権限を外してみます。
具体的には、以下の権限を削除しました。
iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
この状態で AWS マネジメントコンソールからポリシー生成を実行したところ、以下のエラーが表示されました。
ポリシーの生成に失敗しました。
Incorrect permissions assigned to accessRole.
Please fix before trying again.

CloudTrail 参照権限と S3 読み取り権限があっても、IAM サービス最終アクセス情報の権限が不足している場合は、ポリシー生成に失敗しました。
S3 権限不足時は以下のエラーでした。
Incorrect permissions assigned to access CloudTrail S3 bucket.
一方、IAM サービス最終アクセス情報の権限不足では以下のエラーでした。
Incorrect permissions assigned to accessRole.
S3 バケットアクセスの問題ではなく、Access Analyzer 用ロール全体の権限不足として扱われているように見えます。
パターン5:分析対象期間内に対象ロールのイベントがない場合
最後に、権限不足ではありませんが、分析対象期間に対象ロールのイベントがない場合の挙動を確認しました。
IAM Access Analyzer 用ロール、CloudTrail 証跡、S3 バケットポリシーはいずれも正常な状態に戻したうえで、対象ロールが API コールしていない時間帯を分析対象期間として指定しました。

この状態で AWS マネジメントコンソールからポリシー生成を実行したところ、ポリシー生成自体は成功しました。
ポリシーが生成されました。
IAM でカスタマイズして管理ポリシーとして作成できます。

しかし、生成されたポリシーを確認すると、以下のメッセージが表示されました。
指定された期間の CloudTrail ログにサービスとアクションは見つかりませんでした

分析対象期間内に対象ロールの API コールが存在しない場合、ポリシー生成ジョブ自体は成功するものの、生成されたポリシーの確認画面では「指定された期間の CloudTrail ログにサービスとアクションは見つかりませんでした」と表示されることが分かりました。
これは権限不足ではなく、指定した期間に分析対象となる CloudTrail イベントが存在しない状態です。
結果まとめ
今回の検証結果をまとめると以下です。
| パターン | 状態 | 結果 |
|---|---|---|
| S3 読み取り権限なし | IAM Access Analyzer 用ロールから S3 権限を削除 | Incorrect permissions assigned to access CloudTrail S3 bucket. |
| S3 バケットポリシー Deny | S3 バケットポリシーで IAM Access Analyzer 用ロールを拒否 | Incorrect permissions assigned to access CloudTrail S3 bucket. |
| CloudTrail 参照権限なし | IAM Access Analyzer 用ロールから CloudTrail 権限を削除 | cloudtrail:GetTrail の権限不足 |
| IAM サービス最終アクセス情報に関する権限なし | IAM Access Analyzer 用ロールから IAM サービス最終アクセス情報に関する権限を削除 | Incorrect permissions assigned to accessRole. |
| 対象イベントなし | 分析対象期間に対象ロールの API コールなし | 生成は成功。ただしサービスとアクションは見つからない |
わかったこと
S3 関連の問題は同じエラーになる
以下のどちらでも、同じ S3 バケットアクセス権限エラーになりました。
- IAM Access Analyzer 用ロールに S3 読み取り権限がない
- S3 バケットポリシーで IAM Access Analyzer 用ロールを拒否している
エラーは以下です。
Incorrect permissions assigned to access CloudTrail S3 bucket.
そのため、このエラーが出た場合は、IAM ポリシーだけでなく、S3 バケットポリシーも確認した方がよさそうです。
CloudTrail 権限不足は不足アクションが分かりやすい
今回の検証では、CloudTrail 関連権限を外した場合、cloudtrail:GetTrail の権限不足として表示されました。
この場合は、エラーメッセージから不足しているアクションを比較的特定しやすいです。
IAM サービス最終アクセス情報の権限不足は accessRole のエラーになる
IAM サービス最終アクセス情報の権限が不足している場合は、以下のエラーになりました。
Incorrect permissions assigned to accessRole.
S3 バケットアクセスのエラーとは異なるため、Access Analyzer 用ロールに必要な IAM 権限が付与されているか確認する必要があります。
対象イベントなしは権限不足ではない
分析対象期間にイベントがない場合は、権限不足エラーにはなりませんでした。
ポリシー生成自体は成功しますが、生成結果には以下のメッセージが表示されます。
指定された期間の CloudTrail ログにサービスとアクションは見つかりませんでした
そのため、ポリシー生成結果にアクションが出ない場合は、権限不足だけでなく、指定した分析対象期間が正しいかも確認する必要があります。
まとめ
前回は IAM Access Analyzer のポリシー生成が正常に動作することを確認しました。
今回はその続きとして、必要な権限や設定が不足している場合や、分析対象イベントが存在しない場合にどのような挙動になるのかを検証しました。
ポリシー生成でエラーが発生した際の切り分けの参考になれば幸いです。








