0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code × AWS IAMポリシー自動生成|最小権限設計を10分で完成させる

0
Posted at

はじめに

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の自動修正スクリプト)はブログ記事で解説しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?