はじめに
IAMポリシーの設計は「地味だけど間違えると致命的」な作業です。
ワイルドカード (*) を乱用した過剰権限ポリシーはセキュリティインシデントの温床になります。かといって一から最小権限ポリシーを書くのは時間がかかる。
私はLambda・S3・DynamoDB・CloudWatchを組み合わせたサーバーレスアーキテクチャを運用していますが、IAMポリシーの設計・レビューをClaude Codeに任せることで作業時間を約70%削減できました。
この記事では実践的な手順を5つのステップで解説します。
Step 1: 用途を伝えてポリシーを自動生成
プロンプトでLambdaの処理内容と制約を伝えるだけで、すぐに最小権限ポリシーを生成できます。
claude -p "
以下のLambda関数に必要な最小権限IAMポリシーをJSONで生成して。
【Lambdaの処理内容】
- S3バケット 'user-uploads-prod' から画像を読み取り
- 加工後に 'user-thumbnails-prod' に保存
- 処理結果をDynamoDBテーブル 'image-metadata' に記録
- エラー時はSNSトピック 'alert-topic' に通知
- CloudWatch Logsにログ出力
【制約】
- 削除操作は不要
- リソースARNはアカウントID 123456789012、リージョン ap-northeast-1 を使用
"
生成される出力例(抜粋):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3ReadSourceBucket",
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::user-uploads-prod/*"
},
{
"Sid": "DynamoDBWriteMetadata",
"Effect": "Allow",
"Action": ["dynamodb:PutItem", "dynamodb:UpdateItem"],
"Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/image-metadata"
},
{
"Sid": "CloudWatchLogs",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/*"
}
]
}
ポイントは「削除操作は不要」「ARNのアカウントIDとリージョンを指定」といった制約を一緒に渡すことです。これだけでワイルドカードを使わない、きれいな最小権限ポリシーが出てきます。
Step 2: 既存ポリシーのセキュリティレビュー
既存のポリシーに問題がないかレビューしてもらいます。
claude -p "
以下のIAMポリシーをセキュリティの観点でレビューして。
問題点と修正案を具体的に教えて。
$(cat policy.json)
"
Claude Codeが指摘してくれる典型的な問題:
| 問題 | リスク | 修正方法 |
|---|---|---|
Resource: "*" でS3フルアクセス |
データ漏洩・改ざん | バケットとプレフィックスを明示 |
不要な s3:DeleteObject
|
意図しないデータ削除 | アクションから除去 |
iam:PassRole をワイルドカードで許可 |
特権昇格攻撃 | 特定のロールARNのみ許可 |
| CloudTrailの無効化確認なし | 監査ログ消去リスク | CloudTrail保護SCPを追加 |
Step 3: CDKでロール実装
「CDKのTypeScriptコードで出力して」と伝えれば、そのままデプロイできるコードが生成されます。
// lib/iam-stack.ts - Claude Codeが生成するCDKコード例
import * as cdk from "aws-cdk-lib";
import * as iam from "aws-cdk-lib/aws-iam";
export class IamStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Lambda実行ロール(最小権限)
const lambdaRole = new iam.Role(this, "ApiLambdaRole", {
assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
roleName: "api-lambda-role",
});
// DynamoDB読み書き権限(特定テーブルのみ)
lambdaRole.addToPolicy(
new iam.PolicyStatement({
sid: "DynamoDBAccess",
effect: iam.Effect.ALLOW,
actions: ["dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:Query"],
resources: [
`arn:aws:dynamodb:${this.region}:${this.account}:table/users`,
`arn:aws:dynamodb:${this.region}:${this.account}:table/users/index/*`,
],
})
);
// SESメール送信権限(送信元アドレスを制限)
lambdaRole.addToPolicy(
new iam.PolicyStatement({
sid: "SESSendEmail",
effect: iam.Effect.ALLOW,
actions: ["ses:SendEmail", "ses:SendRawEmail"],
resources: ["*"],
conditions: {
StringEquals: { "ses:FromAddress": "noreply@example.com" },
},
})
);
lambdaRole.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole")
);
}
}
Step 4: IAM Access Analyzerの結果をAIでトリアージ
AWS IAM Access Analyzerの検出結果をそのままClaude Codeに渡すと、重要度別の整理と修正案を出してくれます。
aws accessanalyzer list-findings --analyzer-arn arn:aws:access-analyzer:... \
--output json > analyzer-findings.json
claude -p "
以下のIAM Access Analyzerの検出結果を読んで:
1. 重大度別 (HIGH/MEDIUM/LOW) に分類
2. 即座に修正が必要なものを特定
3. それぞれの修正方法を具体的に教えて
$(cat analyzer-findings.json)
"
大量の検出結果でも優先順位をつけて整理してくれるので、対応漏れが格段に減ります。
Step 5: SCPで組織全体のガードレール設計
AWS Organizationsを使っている場合、SCP(Service Control Policy)の設計もClaude Codeが得意です。
claude -p "
本番環境のAWSアカウントに適用するSCPを設計して。以下の要件を満たすこと:
1. 東京・バージニア以外のリージョンを無効化
2. rootアカウントによるAPI操作を禁止
3. CloudTrailの無効化・削除を禁止
4. GuardDutyの無効化を禁止
"
やりがちな落とし穴4選
1. iam:PassRole の過剰権限
// ❌ 危険: どのロールでも渡せる
{ "Action": "iam:PassRole", "Resource": "*" }
// ✅ 安全: 特定ロール + サービス制限
{
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::123456789:role/MyLambdaRole",
"Condition": {
"StringEquals": { "iam:PassedToService": "lambda.amazonaws.com" }
}
}
2. AWS管理ポリシーの乱用
AmazonS3FullAccess は便利ですが過剰です。Lambda がS3から読むだけなら s3:GetObject のみのカスタムポリシーを使いましょう。
3. インラインポリシーの混在
インラインポリシーは再利用不可で追跡困難。管理ポリシーに統一してバージョン管理しましょう。
4. MFA条件の漏れ
管理者ロールへのスイッチには必ずMFAを必須化します。
{
"Condition": {
"BoolIfExists": { "aws:MultiFactorAuthPresent": "true" }
}
}
まとめ
| タスク | Claude Codeに任せられること |
|---|---|
| ポリシー生成 | 用途を説明するだけで最小権限ポリシーを生成 |
| セキュリティレビュー | 問題点・修正案を自動指摘 |
| CDK実装 | TypeScriptのIAMコードを自動生成 |
| Analyzerトリアージ | 検出結果を重大度別に整理 |
| SCP設計 | 組織全体のガードレールを生成 |
月1回、Claude Codeに既存ポリシーをレビューさせる習慣をつけるだけで、セキュリティリスクを継続的に低減できます。IAMのメンテナンスをAIに組み込んでしまいましょう。
より詳細な実装例(SCP全文・ロール設計の全パターン・Access Analyzerの自動修正スクリプト)はブログ記事で解説しています。