IAMポリシーの条件キーやPermission Boundaryを活用した高度なアクセス制御を理解した次のステップとして、継続的な権限監査の仕組みを学びましょう。本記事では、IAM Access Analyzerの各機能を詳しく解説し、外部アクセスの検出から未使用権限の分析、ポリシー生成まで、最小権限の原則を維持するための実践的なワークフローを紹介します。

IAM Access Analyzerとは

IAM Access Analyzerは、AWSリソースに設定されたポリシーを自動的に分析し、セキュリティリスクを検出するサービスです。2019年にリリースされて以来、継続的に機能が拡充され、現在では外部アクセスの検出だけでなく、未使用のアクセス分析やポリシー生成まで幅広い機能を提供しています。

IAM Access Analyzerの主要機能

IAM Access Analyzerは、大きく分けて4つの機能を提供します。

mindmap
  root((IAM Access Analyzer))
    外部アクセスの分析
      S3バケット
      IAMロール
      KMSキー
      Lambda関数
      SQSキュー
      Secrets Manager
    未使用アクセスの分析
      未使用のロール
      未使用のアクセスキー
      未使用のパスワード
      未使用の権限
    ポリシーの検証
      文法エラーの検出
      セキュリティ警告
      ベストプラクティス提案
    ポリシーの生成
      CloudTrailログベース
      最小権限ポリシー生成
      既存ポリシーの最適化
機能 説明 料金
外部アクセスの分析 組織外部からアクセス可能なリソースを検出 無料
未使用アクセスの分析 使用されていない権限やアクセスキーを検出 有料(アナライザー単位)
ポリシーの検証 ポリシーの文法エラーやセキュリティ問題を検出 無料
ポリシーの生成 CloudTrailログから最小権限ポリシーを生成 無料

アナライザーの種類と信頼ゾーン

IAM Access Analyzerは、「信頼ゾーン」という概念に基づいて外部アクセスを判定します。信頼ゾーンの外部からのアクセスが検出されると、検出結果(Finding)として報告されます。

flowchart TB
    subgraph "信頼ゾーン(アカウントスコープ)"
        A1[自分のAWSアカウント]
    end
    
    subgraph "外部(検出対象)"
        E1[他のAWSアカウント]
        E2[匿名アクセス]
        E3[外部IdP]
    end
    
    E1 -->|アクセス許可| A1
    E2 -->|アクセス許可| A1
    E3 -->|アクセス許可| A1
flowchart TB
    subgraph "信頼ゾーン(組織スコープ)"
        O1[組織内アカウントA]
        O2[組織内アカウントB]
        O3[組織内アカウントC]
    end
    
    subgraph "外部(検出対象)"
        E1[組織外のAWSアカウント]
        E2[匿名アクセス]
    end
    
    E1 -->|アクセス許可| O1
    E2 -->|アクセス許可| O2
アナライザータイプ 信頼ゾーン 用途
ACCOUNT 単一AWSアカウント 個別アカウントの分析
ORGANIZATION AWS Organizations全体 組織全体の一元管理
ACCOUNT_UNUSED_ACCESS 単一アカウントの未使用アクセス 個別アカウントの権限棚卸し
ORGANIZATION_UNUSED_ACCESS 組織全体の未使用アクセス 組織全体の権限棚卸し

外部アクセスの分析

外部アクセス分析は、IAM Access Analyzerの最も基本的な機能です。リソースベースポリシーを分析し、組織外部からアクセス可能なリソースを自動的に検出します。

分析対象のリソースタイプ

IAM Access Analyzerは、以下のAWSリソースタイプを分析対象としています。

リソースタイプ 分析対象のポリシー
S3バケット バケットポリシー、ACL
S3ディレクトリバケット バケットポリシー
S3アクセスポイント アクセスポイントポリシー
IAMロール 信頼ポリシー
KMSキー キーポリシー
Lambda関数 リソースベースポリシー
SQSキュー キューポリシー
Secrets Managerシークレット リソースベースポリシー
SNSトピック トピックポリシー
EBSボリュームスナップショット スナップショット共有設定
RDS DBスナップショット スナップショット共有設定
RDS DBクラスタースナップショット スナップショット共有設定
ECRリポジトリ リポジトリポリシー
EFSファイルシステム ファイルシステムポリシー
DynamoDBテーブル リソースベースポリシー
DynamoDB Streams リソースベースポリシー

外部アクセスアナライザーの作成

AWS CLIを使用して外部アクセスアナライザーを作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# アカウントスコープのアナライザーを作成
aws accessanalyzer create-analyzer \
    --analyzer-name external-access-analyzer \
    --type ACCOUNT \
    --tags Environment=Production

# 組織スコープのアナライザーを作成(管理アカウントで実行)
aws accessanalyzer create-analyzer \
    --analyzer-name org-external-access-analyzer \
    --type ORGANIZATION \
    --tags Environment=Production

マネジメントコンソールから作成する場合は、IAMコンソールの「Access Analyzer」セクションから「アナライザーを作成」を選択します。

検出結果の確認と対応

アナライザーを作成すると、自動的にリソースの分析が開始されます。検出結果はAWS CLIまたはマネジメントコンソールで確認できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 検出結果の一覧取得
aws accessanalyzer list-findings \
    --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:123456789012:analyzer/external-access-analyzer

# 特定のリソースタイプでフィルタリング
aws accessanalyzer list-findings \
    --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:123456789012:analyzer/external-access-analyzer \
    --filter '{"resourceType": {"eq": ["AWS::S3::Bucket"]}}'

# アクティブな検出結果のみ取得
aws accessanalyzer list-findings \
    --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:123456789012:analyzer/external-access-analyzer \
    --filter '{"status": {"eq": ["ACTIVE"]}}'

検出結果には以下のステータスがあります。

stateDiagram-v2
    [*] --> Active: 新規検出
    Active --> Archived: アーカイブ(意図的な設定)
    Active --> Resolved: リソースポリシー修正
    Archived --> Active: アーカイブ解除
    Resolved --> [*]: 検出結果削除
ステータス 説明 アクション
Active 未対応の検出結果 調査と対応が必要
Archived 意図的な設定として承認済み 定期的なレビュー
Resolved リソース設定の変更により解決 自動的に更新

検出結果への対応例

S3バケットが外部アカウントからアクセス可能と検出された場合の対応例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
    "analyzedAt": "2026-01-25T10:30:00Z",
    "condition": {},
    "createdAt": "2026-01-25T10:30:00Z",
    "id": "finding-id-12345",
    "isPublic": false,
    "principal": {
        "AWS": "arn:aws:iam::999888777666:root"
    },
    "resource": "arn:aws:s3:::my-shared-bucket",
    "resourceOwnerAccount": "123456789012",
    "resourceType": "AWS::S3::Bucket",
    "status": "ACTIVE"
}

この検出結果に対して、以下の対応を検討します。

  1. 意図した共有の場合: 検出結果をアーカイブし、理由を記録
  2. 意図しない共有の場合: バケットポリシーを修正して外部アクセスを削除
1
2
3
4
5
# 検出結果をアーカイブ(意図した設定の場合)
aws accessanalyzer update-findings \
    --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:123456789012:analyzer/external-access-analyzer \
    --ids finding-id-12345 \
    --status ARCHIVED

未使用アクセスの分析

未使用アクセス分析は、付与されているが実際には使用されていない権限を検出する機能です。最小権限の原則を維持するために重要な機能であり、2023年に追加されました。

未使用アクセスアナライザーの作成

未使用アクセスアナライザーは、外部アクセスアナライザーとは別に作成する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# アカウントスコープの未使用アクセスアナライザーを作成
aws accessanalyzer create-analyzer \
    --analyzer-name unused-access-analyzer \
    --type ACCOUNT_UNUSED_ACCESS \
    --configuration '{
        "unusedAccess": {
            "unusedAccessAge": 90
        }
    }'

# 組織スコープの未使用アクセスアナライザーを作成
aws accessanalyzer create-analyzer \
    --analyzer-name org-unused-access-analyzer \
    --type ORGANIZATION_UNUSED_ACCESS \
    --configuration '{
        "unusedAccess": {
            "unusedAccessAge": 90
        }
    }'

unusedAccessAgeパラメータは、何日間使用されていない場合に「未使用」と判定するかを指定します。1日から365日の範囲で設定可能で、デフォルトは90日です。

検出される未使用アクセスの種類

未使用アクセスアナライザーは、以下の4種類の未使用アクセスを検出します。

flowchart TD
    subgraph "未使用アクセスの種類"
        A[未使用のIAMロール]
        B[未使用のIAMユーザー認証情報]
        C[未使用のアクセスキー]
        D[未使用の権限]
    end
    
    A --> A1[指定期間内に<br/>AssumeRoleされていないロール]
    B --> B1[パスワードが使用されていない<br/>IAMユーザー]
    C --> C1[指定期間内に<br/>使用されていないアクセスキー]
    D --> D1[付与されているが<br/>使用されていないアクション]
検出タイプ 説明 推奨アクション
UnusedIAMRole 指定期間内に引き受けられていないロール ロールの削除または無効化
UnusedIAMUserAccessKey 使用されていないアクセスキー アクセスキーの削除
UnusedIAMUserPassword 使用されていないパスワード ユーザーの削除またはパスワード削除
UnusedPermission 付与されているが使用されていない権限 ポリシーの縮小

未使用権限の検出結果例

未使用の権限が検出された場合、具体的にどのアクションが使用されていないかが報告されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
    "analyzedAt": "2026-01-25T10:30:00Z",
    "createdAt": "2026-01-25T10:30:00Z",
    "findingType": "UnusedPermission",
    "id": "unused-finding-67890",
    "resource": "arn:aws:iam::123456789012:role/MyAppRole",
    "resourceOwnerAccount": "123456789012",
    "resourceType": "AWS::IAM::Role",
    "status": "ACTIVE",
    "unusedPermissionDetails": {
        "serviceNamespace": "ec2",
        "actions": [
            "ec2:TerminateInstances",
            "ec2:DeleteVolume",
            "ec2:DeleteSnapshot"
        ],
        "lastAccessed": null
    }
}

この例では、MyAppRoleに付与されているec2:TerminateInstancesec2:DeleteVolumeec2:DeleteSnapshotの権限が使用されていないことを示しています。

未使用権限への対応ワークフロー

flowchart TD
    A[未使用権限の検出] --> B{権限は必要か?}
    B -->|本当に不要| C[ポリシーから権限を削除]
    B -->|将来必要になる可能性| D[リスク評価]
    D --> E{リスクレベルは?}
    E -->|高| F[権限を削除<br/>必要時に再付与]
    E -->|低| G[検出結果をアーカイブ<br/>次回レビュー時に再評価]
    C --> H[変更をテスト環境で検証]
    F --> H
    H --> I[本番環境に適用]

ポリシーの検証

ポリシー検証機能を使用すると、IAMポリシーの作成前に文法エラーやセキュリティ上の問題を検出できます。カスタムポリシーを本番環境に適用する前の品質チェックとして活用できます。

ポリシー検証の実行

AWS CLIを使用してポリシーを検証します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# ファイルからポリシーを検証
aws accessanalyzer validate-policy \
    --policy-type IDENTITY_POLICY \
    --policy-document file://my-policy.json

# インラインでポリシーを検証
aws accessanalyzer validate-policy \
    --policy-type IDENTITY_POLICY \
    --policy-document '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "s3:*",
                "Resource": "*"
            }
        ]
    }'

対応するポリシータイプは以下の通りです。

ポリシータイプ 用途
IDENTITY_POLICY IAMユーザー、グループ、ロールにアタッチするポリシー
RESOURCE_POLICY S3バケットポリシーなどのリソースベースポリシー
SERVICE_CONTROL_POLICY AWS OrganizationsのSCP

検証結果の種類

ポリシー検証は、以下の種類の検出結果を返します。

タイプ 説明 対応の必要性
ERROR ポリシーが機能しない重大な問題 必須
SECURITY_WARNING セキュリティ上のリスク 強く推奨
WARNING ベストプラクティスからの逸脱 推奨
SUGGESTION 改善の提案 検討

検証結果の例

以下は、過度に広い権限を持つポリシーを検証した場合の結果例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
    "findings": [
        {
            "findingType": "SECURITY_WARNING",
            "issueCode": "PASS_ROLE_WITH_STAR_IN_RESOURCE",
            "learnMoreLink": "https://docs.aws.amazon.com/...",
            "locations": [
                {
                    "path": [
                        {"value": "Statement"},
                        {"index": 0},
                        {"value": "Resource"}
                    ],
                    "span": {
                        "start": {"line": 7, "column": 21, "offset": 156},
                        "end": {"line": 7, "column": 24, "offset": 159}
                    }
                }
            ],
            "findingDetails": "iam:PassRoleアクションにワイルドカード(*)を使用すると、任意のロールをパスできてしまいます。"
        },
        {
            "findingType": "WARNING",
            "issueCode": "MISSING_VERSION",
            "learnMoreLink": "https://docs.aws.amazon.com/...",
            "locations": [],
            "findingDetails": "ポリシーにVersionステートメントがありません。\"Version\": \"2012-10-17\"を追加することを推奨します。"
        }
    ]
}

ポリシー検証の自動化

CI/CDパイプラインにポリシー検証を組み込むことで、セキュリティリスクのあるポリシーがデプロイされることを防止できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# GitHub Actionsでの検証例
name: Validate IAM Policies

on:
  pull_request:
    paths:
      - 'policies/**'

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
          aws-region: ap-northeast-1
      
      - name: Validate IAM Policies
        run: |
          for policy in policies/*.json; do
            echo "Validating $policy..."
            result=$(aws accessanalyzer validate-policy \
              --policy-type IDENTITY_POLICY \
              --policy-document file://$policy \
              --output json)
            
            errors=$(echo $result | jq '[.findings[] | select(.findingType == "ERROR")] | length')
            warnings=$(echo $result | jq '[.findings[] | select(.findingType == "SECURITY_WARNING")] | length')
            
            if [ "$errors" -gt 0 ] || [ "$warnings" -gt 0 ]; then
              echo "Policy validation failed for $policy"
              echo $result | jq '.findings'
              exit 1
            fi
          done

ポリシーの生成

ポリシー生成機能は、CloudTrailのアクティビティログに基づいて、実際に使用されたアクションのみを許可する最小権限ポリシーを自動生成します。これにより、過剰な権限を持つポリシーを適切なサイズに縮小できます。

ポリシー生成の仕組み

sequenceDiagram
    participant User as IAMユーザー/ロール
    participant AWS as AWSサービス
    participant CT as CloudTrail
    participant AA as Access Analyzer
    
    User->>AWS: API呼び出し
    AWS->>CT: イベントログ記録
    Note over CT: 90日間のログを蓄積
    
    User->>AA: ポリシー生成リクエスト
    AA->>CT: ログ分析
    CT->>AA: 使用されたアクション一覧
    AA->>AA: 最小権限ポリシー生成
    AA->>User: 生成されたポリシー

ポリシー生成の開始

AWS CLIを使用してポリシー生成を開始します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# ポリシー生成ジョブの開始
aws accessanalyzer start-policy-generation \
    --policy-generation-details '{
        "principalArn": "arn:aws:iam::123456789012:role/MyAppRole"
    }' \
    --cloud-trail-details '{
        "trails": [
            {
                "cloudTrailArn": "arn:aws:cloudtrail:ap-northeast-1:123456789012:trail/management-trail",
                "regions": ["ap-northeast-1"],
                "allRegions": false
            }
        ],
        "startTime": "2025-10-25T00:00:00Z",
        "endTime": "2026-01-25T00:00:00Z",
        "accessRole": "arn:aws:iam::123456789012:role/AccessAnalyzerMonitorServiceRole"
    }'

ポリシー生成には、CloudTrailログを読み取るための適切なIAMロールが必要です。以下は、Access Analyzerがログを読み取るためのサービスロール例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudtrail:GetTrail",
                "cloudtrail:GetTrailStatus",
                "cloudtrail:LookupEvents"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::cloudtrail-bucket-name",
                "arn:aws:s3:::cloudtrail-bucket-name/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:ap-northeast-1:123456789012:key/key-id",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "s3.ap-northeast-1.amazonaws.com"
                }
            }
        }
    ]
}

ポリシー生成結果の取得

ポリシー生成は非同期で実行されます。ジョブの状態を確認し、完了後に結果を取得します。

1
2
3
4
5
6
7
8
9
# ポリシー生成ジョブの状態確認
aws accessanalyzer get-generated-policy \
    --job-id job-id-12345

# 生成されたポリシーの取得
aws accessanalyzer get-generated-policy \
    --job-id job-id-12345 \
    --include-resource-placeholders \
    --include-service-level-template

生成されたポリシーの例

CloudTrailログの分析により、以下のような最小権限ポリシーが生成されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3ReadAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::my-app-data-bucket",
                "arn:aws:s3:::my-app-data-bucket/*"
            ]
        },
        {
            "Sid": "DynamoDBAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-northeast-1:123456789012:table/MyAppTable"
            ]
        },
        {
            "Sid": "CloudWatchLogsAccess",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/my-function:*"
            ]
        }
    ]
}

定期的な権限監査ワークフロー

IAM Access Analyzerを活用した継続的な権限監査のワークフローを紹介します。セキュリティを維持しながら運用効率を高めるためには、定期的なレビューサイクルを確立することが重要です。

推奨される監査サイクル

flowchart TD
    subgraph "日次"
        D1[外部アクセス検出結果の確認]
        D2[新規検出結果への対応]
    end
    
    subgraph "週次"
        W1[未使用アクセス検出結果のレビュー]
        W2[アーカイブ済み検出結果の再評価]
    end
    
    subgraph "月次"
        M1[全IAMロール/ユーザーの棚卸し]
        M2[ポリシー生成による最適化検討]
        M3[権限監査レポートの作成]
    end
    
    subgraph "四半期"
        Q1[アナライザー設定の見直し]
        Q2[監査プロセスの改善]
    end
    
    D1 --> D2
    W1 --> W2
    M1 --> M2 --> M3
    Q1 --> Q2

自動化されたアラート設定

EventBridgeとSNSを使用して、新しい検出結果が発生した際に自動通知を設定できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
    "source": ["aws.access-analyzer"],
    "detail-type": ["Access Analyzer Finding"],
    "detail": {
        "status": ["ACTIVE"],
        "findingType": [
            {"prefix": "External"}
        ]
    }
}

このルールにより、外部アクセスに関する新しい検出結果が発生した際に、セキュリティチームへ即座に通知されます。

AWS Security Hubとの統合

IAM Access Analyzerの検出結果は、AWS Security Hubに自動的に送信されます。Security Hubを通じて、他のセキュリティサービスの検出結果と統合的に管理できます。

flowchart LR
    AA[IAM Access Analyzer] --> SH[Security Hub]
    GD[GuardDuty] --> SH
    Inspector[Inspector] --> SH
    Config[AWS Config] --> SH
    
    SH --> Dashboard[統合ダッシュボード]
    SH --> Alert[アラート通知]
    SH --> Remediation[自動修復]

権限監査レポートの生成

月次レポートを生成するためのスクリプト例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
# 権限監査レポート生成スクリプト

ANALYZER_ARN="arn:aws:access-analyzer:ap-northeast-1:123456789012:analyzer/external-access-analyzer"
UNUSED_ANALYZER_ARN="arn:aws:access-analyzer:ap-northeast-1:123456789012:analyzer/unused-access-analyzer"
REPORT_DATE=$(date +%Y-%m-%d)

echo "=== IAM Access Analyzer 権限監査レポート ===" > report-${REPORT_DATE}.txt
echo "レポート生成日: ${REPORT_DATE}" >> report-${REPORT_DATE}.txt
echo "" >> report-${REPORT_DATE}.txt

# 外部アクセス検出結果のサマリー
echo "## 外部アクセス検出結果" >> report-${REPORT_DATE}.txt
aws accessanalyzer list-findings \
    --analyzer-arn ${ANALYZER_ARN} \
    --filter '{"status": {"eq": ["ACTIVE"]}}' \
    --query 'findings | length(@)' \
    --output text | xargs -I {} echo "アクティブな検出結果: {} 件" >> report-${REPORT_DATE}.txt

# 未使用アクセス検出結果のサマリー
echo "" >> report-${REPORT_DATE}.txt
echo "## 未使用アクセス検出結果" >> report-${REPORT_DATE}.txt
aws accessanalyzer list-findings \
    --analyzer-arn ${UNUSED_ANALYZER_ARN} \
    --filter '{"status": {"eq": ["ACTIVE"]}}' \
    --query 'findings | length(@)' \
    --output text | xargs -I {} echo "アクティブな検出結果: {} 件" >> report-${REPORT_DATE}.txt

# 検出結果の詳細
echo "" >> report-${REPORT_DATE}.txt
echo "## 外部アクセス検出結果詳細" >> report-${REPORT_DATE}.txt
aws accessanalyzer list-findings \
    --analyzer-arn ${ANALYZER_ARN} \
    --filter '{"status": {"eq": ["ACTIVE"]}}' \
    --query 'findings[].{Resource: resource, Type: resourceType, Principal: principal}' \
    --output table >> report-${REPORT_DATE}.txt

echo "レポートを report-${REPORT_DATE}.txt に出力しました"

AWS CLIとSDKでの操作

IAM Access AnalyzerはAWS CLIおよび各種SDKから操作できます。自動化やプログラムによる統合に活用できます。

主要なCLIコマンド

コマンド 用途
create-analyzer アナライザーの作成
delete-analyzer アナライザーの削除
list-analyzers アナライザーの一覧取得
list-findings 検出結果の一覧取得
get-finding 検出結果の詳細取得
update-findings 検出結果のステータス更新
validate-policy ポリシーの検証
start-policy-generation ポリシー生成の開始
get-generated-policy 生成されたポリシーの取得

Python SDKでの操作例

boto3を使用したPythonでの操作例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import boto3
from datetime import datetime, timedelta

# Access Analyzerクライアントの作成
client = boto3.client('accessanalyzer', region_name='ap-northeast-1')

# アナライザーの作成
def create_analyzer(analyzer_name, analyzer_type='ACCOUNT'):
    response = client.create_analyzer(
        analyzerName=analyzer_name,
        type=analyzer_type,
        tags={
            'Environment': 'Production',
            'ManagedBy': 'SecurityTeam'
        }
    )
    return response['arn']

# アクティブな検出結果の取得
def get_active_findings(analyzer_arn):
    findings = []
    paginator = client.get_paginator('list_findings')
    
    for page in paginator.paginate(
        analyzerArn=analyzer_arn,
        filter={
            'status': {'eq': ['ACTIVE']}
        }
    ):
        findings.extend(page['findings'])
    
    return findings

# 検出結果のアーカイブ
def archive_findings(analyzer_arn, finding_ids):
    client.update_findings(
        analyzerArn=analyzer_arn,
        ids=finding_ids,
        status='ARCHIVED'
    )

# ポリシーの検証
def validate_policy(policy_document, policy_type='IDENTITY_POLICY'):
    response = client.validate_policy(
        policyType=policy_type,
        policyDocument=policy_document
    )
    return response['findings']

# 使用例
if __name__ == '__main__':
    analyzer_arn = 'arn:aws:access-analyzer:ap-northeast-1:123456789012:analyzer/my-analyzer'
    
    # アクティブな検出結果を取得して表示
    findings = get_active_findings(analyzer_arn)
    for finding in findings:
        print(f"Resource: {finding['resource']}")
        print(f"Type: {finding['resourceType']}")
        print(f"Status: {finding['status']}")
        print("---")

料金と制限

IAM Access Analyzerの料金体系と制限事項を理解しておくことが重要です。

料金

機能 料金
外部アクセス分析 無料
ポリシー検証 無料
ポリシー生成 無料
未使用アクセス分析 有料(アナライザーあたり月額、分析対象ロール/ユーザー数により変動)

未使用アクセス分析の料金は、リージョンやアナライザータイプ、分析対象のIAMロール/ユーザー数によって異なります。最新の料金情報はAWS公式サイトを確認してください。

サービス制限

項目 デフォルト制限
アカウントあたりのアナライザー数 1(タイプごと)
検出結果の保持期間 90日(アーカイブ済みも含む)
ポリシー生成の同時実行数 1
ポリシー検証の1回あたりの最大ポリシーサイズ 10KB

まとめ

本記事では、IAM Access Analyzerを活用した継続的な権限監査の方法について解説しました。

IAM Access Analyzerは、以下の4つの主要機能を提供します。

  • 外部アクセスの分析: 組織外部からアクセス可能なリソースを自動検出
  • 未使用アクセスの分析: 使用されていない権限やアクセスキーを検出
  • ポリシーの検証: ポリシーの文法エラーやセキュリティリスクを事前チェック
  • ポリシーの生成: CloudTrailログから最小権限ポリシーを自動生成

これらの機能を組み合わせた定期的な権限監査ワークフローを確立することで、最小権限の原則を継続的に維持できます。特に、CI/CDパイプラインへのポリシー検証の組み込みや、EventBridgeを使用した検出結果の自動通知は、セキュリティ運用の効率化に大きく貢献します。

次回は、AWS IAM Identity Centerを使用した複数AWSアカウントへのシングルサインオン(SSO)の実現方法について解説します。

参考リンク