IAM Access Analyzer のポリシー生成に必要な権限を整理し、CloudTrail ログからポリシーを生成してみた

IAM Access Analyzer のポリシー生成に必要な権限を整理し、CloudTrail ログからポリシーを生成してみた

IAM Access Analyzer のポリシー生成に必要な CloudTrail、S3、IAM ロールの権限を整理しました。シングルアカウント構成で検証し、CloudTrail ログをもとにポリシー候補が生成されることを確認します。
2026.06.18

はじめに

クラウド事業本部コンサルティング部の山﨑です。

IAM Access Analyzer には、CloudTrail のアクセスアクティビティをもとに IAM ポリシーを生成する機能があります。

この機能を使うと、対象の IAM ロールが実際に使用した AWS API をもとに IAM ポリシーを作成できます。

ただ、実際に試そうとしたときに、具体的にどのような権限を付与すれば良いのかわかりませんでした。

そこで本記事では、IAM Access Analyzer のポリシー生成に必要な権限を、関係するリソースごとに整理し、シングルアカウント構成で実際に動かしてみます。

結論

IAM Access Analyzer のポリシー生成は、CloudTrail が有効であるだけでは十分ではありません。

主に以下の条件を満たす必要があります。

  • CloudTrail ログが S3 に配信されていること
  • CloudTrail が S3 バケットへログを書き込めること
  • IAM Access Analyzer 用ロールが CloudTrail 証跡と S3 上の CloudTrail ログを参照できること
  • ポリシー生成対象ロールの API コールが CloudTrail に記録されていること
  • ポリシー生成を実行するユーザー / ロールが、IAM Access Analyzer 用ロールに対する iam:GetRole / iam:PassRole を実行できること

今回の検証では、ポリシー生成対象ロール test-access-analyzer-target-role で EC2 Describe 系 API を実行し、その CloudTrail イベントをもとに IAM Access Analyzer のポリシー生成を実行しました。

結果として、今回の検証では生成されたポリシーに以下のアクションが含まれました。

ec2:DescribeInstances
ec2:DescribeVpcs
ec2:DescribeSecurityGroups
ec2:DescribeSubnets
sts:GetCallerIdentity

公式ドキュメントを読み解く

IAM Access Analyzer のポリシー生成を利用する前に、まず公式ドキュメントの記載を整理します。

ポリシー生成に関係するポイントは、大きく 3 つあります。

1. ポリシー生成は CloudTrail ログをもとに行われる

IAM Access Analyzer のポリシー生成は、CloudTrail ログを分析し、指定した期間内に IAM エンティティが使用したアクセス許可をもとにポリシーテンプレートを生成する機能です。

つまり、ポリシー生成には CloudTrail ログが必要です。

IAM Access Analyzer ポリシーの生成

2. CloudTrail ログは S3 バケットに配信される

公式ドキュメントでは、アクセスアクティビティに基づいてポリシーを生成するには CloudTrail 証跡を有効にする必要があり、CloudTrail はイベントを指定した S3 バケットに送信すると説明されています。

そのため、CloudTrail ログ保存先の S3 バケットと、CloudTrail が S3 に書き込むためのバケットポリシーが必要です。

また、CloudTrail が S3 バケットへログを書き込むには、CloudTrail サービスプリンシパルに対して s3:GetBucketAcls3:PutObject を許可します。

CloudTrail の Amazon S3 バケットポリシー

3. IAM Access Analyzer が CloudTrail / S3 を参照するためのサービスロールが必要

ポリシー生成時には、IAM Access Analyzer が CloudTrail 証跡や S3 上の CloudTrail ログ、IAM のサービス最終アクセス情報を参照するためのサービスロールを指定します。

公式ドキュメントでは、サービスロールの権限例として、主に以下の権限が示されています。

cloudtrail:GetTrail
s3:GetObject
s3:ListBucket
iam:GetServiceLastAccessedDetails
iam:GenerateServiceLastAccessedDetails

また、IAM Access Analyzer がこのロールを利用できるように、信頼ポリシーでは access-analyzer.amazonaws.comsts:AssumeRole を許可します。

今回の検証では、公式ドキュメントの権限例をベースに、CloudTrail 証跡の状態確認や GUI 操作、後続の権限不足検証で比較しやすいよう、一部の参照権限を追加しています。

公式ドキュメントから分かる必要条件

ここまでを整理すると、IAM Access Analyzer のポリシー生成には以下が必要です。

1. CloudTrail 証跡が有効であること
2. CloudTrail ログが S3 に配信されていること
3. CloudTrail が S3 にログを書き込めるバケットポリシーが設定されていること
4. IAM Access Analyzer が CloudTrail / S3 / IAM 情報を参照できるサービスロールがあること
5. ポリシー生成対象ロールの API コールが CloudTrail に記録されていること
6. ポリシー生成を実行するユーザー / ロールが IAM Access Analyzer 用ロールに対する GetRole / PassRole を実行できること

検証構成と権限の考え方

今回の検証は、シングルアカウント構成で実施しました。

IAM Access Analyzer のポリシー生成では、権限を大きく以下の 4 箇所に分けて考えると整理しやすいです。

設定箇所 目的
IAM Access Analyzer 用ロール IAM Access Analyzer が CloudTrail 証跡と S3 上の CloudTrail ログを参照する
S3 バケットポリシー CloudTrail が S3 にログを書き込む
ポリシー生成対象ロール 実際に API コールを行い、CloudTrail に利用履歴を残す
実行ユーザー / ロール ポリシー生成を開始し、Access Analyzer 用ロールに対して iam:GetRole / iam:PassRole を実行する

今回の検証構成は以下です。

ポイントは、ポリシー生成対象ロールと、IAM Access Analyzer が CloudTrail / S3 を参照するためのロールが別である点です。

ポリシー生成対象ロールは、実際に API コールを行うロールです。

一方、IAM Access Analyzer 用ロールは、IAM Access Analyzer が CloudTrail 証跡や S3 上の CloudTrail ログを参照するために AssumeRole するロールです。

なお、ここでいう IAM Access Analyzer 用ロールは、コンソールで別アカウントへ切り替えるためのスイッチロールではありません。IAM Access Analyzer サービスが CloudTrail 証跡や S3 上の CloudTrail ログを参照するために AssumeRole するサービスロールです。

今回利用したリソース

今回の検証では、以下のリソースを利用しました。

種別 名前
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
IAM Access Analyzer 用ポリシー test-access-analyzer-access-policy

以降では、主にバケットポリシーと IAM ポリシーの内容を紹介します。

S3 バケット

CloudTrail ログ保存先として、以下の S3 バケットを利用しました。

バケット名
test-access-analyzer-cloudtrail-logs-example
バケットポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSCloudTrailAclCheck",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::test-access-analyzer-cloudtrail-logs-example",
      "Condition": {
        "StringEquals": {
          "aws:SourceArn": "arn:aws:cloudtrail:ap-northeast-1:123456789012:trail/test-access-analyzer-trail"
        }
      }
    },
    {
      "Sid": "AWSCloudTrailWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::test-access-analyzer-cloudtrail-logs-example/AWSLogs/123456789012/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control",
          "aws:SourceArn": "arn:aws:cloudtrail:ap-northeast-1:123456789012:trail/test-access-analyzer-trail"
        }
      }
    }
  ]
}

このポリシーでは、CloudTrail サービスプリンシパルに対して以下を許可しています。

権限 用途
s3:GetBucketAcl CloudTrail がバケット ACL を確認するため
s3:PutObject CloudTrail がログファイルを S3 に書き込むため

なお、今回の検証では CloudTrail ログ保存先の S3 バケットに対して SSE-KMS は設定していません。そのため、IAM Access Analyzer 用ロールに kms:Decrypt は付与していません。

SSE-KMS で CloudTrail ログを暗号化する構成では、S3 読み取り権限に加えて、利用する KMS キーに対する復号権限も考慮する必要があります。

IAM Access Analyzer 用ロール

IAM Access Analyzer が CloudTrail / S3 を参照するためのサービスロールとして、以下を作成しました。

ロール名
test-access-analyzer-access-role
信頼ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "access-analyzer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

この信頼ポリシーにより、IAM Access Analyzer サービスが test-access-analyzer-access-role を AssumeRole できます。

IAM Access Analyzer 用ロールには、以下のポリシーをアタッチしました。

ポリシー名
test-access-analyzer-access-policy

ポリシー本文は以下です。

許可ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudTrailRead",
      "Effect": "Allow",
      "Action": [
        "cloudtrail:GetTrail",
        "cloudtrail:DescribeTrails",
        "cloudtrail:GetTrailStatus",
        "cloudtrail:ListTags",
        "cloudtrail:ListTrails",
        "cloudtrail:LookupEvents"
      ],
      "Resource": "*"
    },
    {
      "Sid": "S3ReadCloudTrailLogs",
      "Effect": "Allow",
      "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/*"
      ]
    },
    {
      "Sid": "IAMServiceLastAccessed",
      "Effect": "Allow",
      "Action": [
        "iam:GenerateServiceLastAccessedDetails",
        "iam:GetServiceLastAccessedDetails"
      ],
      "Resource": "*"
    }
  ]
}
権限 用途
cloudtrail:GetTrail 指定した CloudTrail 証跡を参照する
cloudtrail:DescribeTrails CloudTrail 証跡の情報を取得する
cloudtrail:GetTrailStatus CloudTrail 証跡の状態を確認する
cloudtrail:ListTags CloudTrail 証跡のタグ情報を参照する
cloudtrail:ListTrails CloudTrail 証跡一覧を参照する
cloudtrail:LookupEvents CloudTrail イベントを参照する
s3:GetObject S3 上の CloudTrail ログファイルを読み取る
s3:ListBucket CloudTrail ログ保存先バケット内のオブジェクトを一覧する
s3:GetBucketLocation S3 バケットのリージョン情報を取得する
iam:GenerateServiceLastAccessedDetails IAM のサービス最終アクセス情報を生成する
iam:GetServiceLastAccessedDetails IAM のサービス最終アクセス情報を取得する

公式ドキュメントのサービスロール権限例では、主に以下が示されています。

cloudtrail:GetTrail
s3:GetObject
s3:ListBucket
iam:GetServiceLastAccessedDetails
iam:GenerateServiceLastAccessedDetails

本検証では、この権限例をベースに、CloudTrail 証跡の状態確認や GUI 操作、後続の権限不足検証で比較しやすいように、CloudTrail 参照系の権限と s3:GetBucketLocation も追加しています。

ポリシー生成対象ロール

ポリシー生成対象として、以下の IAM ロールを利用しました。

test-access-analyzer-target-role

このロールには、検証用に ReadOnlyAccess を付与し、以下の API を実行しました。

ec2:DescribeInstances
ec2:DescribeVpcs
ec2:DescribeSecurityGroups
ec2:DescribeSubnets
sts:GetCallerIdentity

ポリシー生成対象ロール自体に、IAM Access Analyzer 用の特別な権限は不要です。

ただし、対象ロールで実行した API コールが CloudTrail に記録され、分析対象期間内に含まれている必要があります。

CloudTrail ログの確認

CloudTrail 証跡 test-access-analyzer-trail により、対象ロールの API コールが S3 バケットに配信されていることを確認しました。

S3 バケット内には、以下のような CloudTrail ログファイルが作成されました。

AWSLogs/123456789012/CloudTrail/ap-northeast-1/2026/06/17/123456789012_CloudTrail_ap-northeast-1_20260617T0430Z_EXAMPLE.json.gz
AWSLogs/123456789012/CloudTrail/ap-northeast-1/2026/06/17/123456789012_CloudTrail_ap-northeast-1_20260617T0435Z_EXAMPLE.json.gz

また、CloudTrail のステータスは以下の通りでした。

{
  "IsLogging": true,
  "LatestDeliveryTime": "2026-06-17T04:32:16.660000+00:00",
  "LatestDeliveryError": null
}

IsLoggingtrueLatestDeliveryErrornull であるため、CloudTrail から S3 へのログ配信に問題がないことを確認できました。

さらに、CloudTrail ログ内に、ポリシー生成対象ロールの API コールが記録されていることを確認しました。

2026-06-17T04:31:27Z sts.amazonaws.com GetCallerIdentity arn:aws:sts::123456789012:assumed-role/test-access-analyzer-target-role/test-access-analyzer-session
2026-06-17T04:31:44Z ec2.amazonaws.com DescribeInstances arn:aws:sts::123456789012:assumed-role/test-access-analyzer-target-role/test-access-analyzer-session
2026-06-17T04:31:50Z ec2.amazonaws.com DescribeVpcs arn:aws:sts::123456789012:assumed-role/test-access-analyzer-target-role/test-access-analyzer-session
2026-06-17T04:31:56Z ec2.amazonaws.com DescribeSecurityGroups arn:aws:sts::123456789012:assumed-role/test-access-analyzer-target-role/test-access-analyzer-session
2026-06-17T04:32:02Z ec2.amazonaws.com DescribeSubnets arn:aws:sts::123456789012:assumed-role/test-access-analyzer-target-role/test-access-analyzer-session

これで、ポリシー生成で利用する CloudTrail ログ内に、対象ロールの API コールが存在することを確認できました。

GUI でポリシー生成を実行する

ここからは AWS マネジメントコンソールで実施しました。

ロール詳細画面の 許可 タブにある CloudTrail イベントに基づいてポリシーを生成 から、ポリシー生成を実行しました。

1-2

1-1

3

4

5

生成結果を確認する

生成されたポリシーに含まれるアクションとして以下が検出されました。

今回の検証では、AssumeRole 後に aws sts get-caller-identity で認証情報を確認したため、sts:GetCallerIdentity も検出されています。

EC2
- DescribeSubnets
- DescribeSecurityGroups
- DescribeInstances
- DescribeVpcs

STS
- GetCallerIdentity

これは、事前に CloudTrail ログで確認した以下のイベントと一致しています。

GetCallerIdentity
DescribeInstances
DescribeVpcs
DescribeSecurityGroups
DescribeSubnets

つまり、IAM Access Analyzer が CloudTrail ログに記録された対象ロールのアクセスアクティビティをもとに、ポリシー候補を生成できたことを確認できました。

最終的に、今回の検証では以下のようなポリシーが生成されました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSubnets",
        "ec2:DescribeVpcs",
        "sts:GetCallerIdentity"
      ],
      "Resource": "*"
    }
  ]
}

わかったこと

今回の検証で、IAM Access Analyzer のポリシー生成に必要な権限を整理できました。

CloudTrail が有効なだけでは不十分

IAM Access Analyzer のポリシー生成では、CloudTrail が有効であることに加えて、CloudTrail ログが S3 に配信されている必要があります。

また、IAM Access Analyzer 用ロールがその S3 バケットを読み取れる必要があります。

IAM Access Analyzer 用ロールには CloudTrail / S3 / IAM 参照権限が必要

IAM Access Analyzer 用ロールには、CloudTrail、S3、IAM の参照権限が必要です。

特に重要なのは以下です。

  • CloudTrail 証跡を参照する権限
  • S3 上の CloudTrail ログを読み取る権限
  • IAM のサービス最終アクセス情報を参照する権限

このロールを GUI のポリシー生成画面で CloudTrail アクセス用ロールとして指定しました。

ポリシー生成対象ロールには、分析対象期間内の CloudTrail イベントが必要

ポリシー生成対象ロール自体に、IAM Access Analyzer 用の特別な権限は不要です。

ただし、そのロールで実行した API コールが CloudTrail に記録され、分析対象期間内に含まれている必要があります。

ポリシー生成時には iam:GetRole / iam:PassRole が必要

ポリシー生成を実行するユーザー / ロールには、IAM Access Analyzer の実行権限に加えて、CloudTrail アクセス用ロールを参照するための iam:GetRole と、IAM Access Analyzer に渡すための iam:PassRole が必要です。

まとめ

IAM Access Analyzer のポリシー生成に必要な権限を整理し、シングルアカウント構成で実際にポリシー生成が成功することを確認しました。

今回の検証で分かったポイントは以下です。

  • IAM Access Analyzer のポリシー生成は CloudTrail ログをもとに行われる
  • CloudTrail ログは S3 に配信されている必要がある
  • CloudTrail が S3 にログを書き込むための S3 バケットポリシーが必要
  • IAM Access Analyzer 用ロールには、CloudTrail / S3 / IAM の参照権限が必要
  • ポリシー生成を実行するユーザー / ロールには、IAM Access Analyzer の実行権限に加えて iam:GetRole / iam:PassRole が必要
  • ポリシー生成対象ロールには、分析対象期間内の CloudTrail イベントが必要
  • 実際に対象ロールで実行した EC2 Describe 系 API と STS API が、生成ポリシーに反映された

ポリシーを生成するための権限で迷っている方の参考になれば幸いです。

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事