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 -->|アクセス許可| A1flowchart 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
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:TerminateInstances、ec2:DeleteVolume、ec2: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)の実現方法について解説します。
参考リンク#