Use Cases

Claude Code × AWS IAM 完全指南 | 自动生成最小权限策略

用Claude Code优化AWS IAM策略设计。基于最小权限原则自动生成策略、审查现有策略的安全性、CDK实现——全部附有实际代码示例。

IAM策略设计是”不起眼但出错了就很致命”的工作。滥用通配符(*)的过度权限策略是安全事件的温床。但从头开始编写最小权限策略又很耗时。

我在生产环境中运营着结合了Lambda、S3、DynamoDB、CloudWatch的无服务器架构。通过将IAM策略设计与审查委托给Claude Code,将工作时间削减了约70%。本文介绍具体的实践步骤。


3分钟复习IAM基础

策略结构

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Condition": {
        "StringEquals": {
          "s3:prefix": ["uploads/"]
        }
      }
    }
  ]
}
  • Effect: Allow(允许)或 Deny(拒绝)
  • Action: 要允许/拒绝的API操作
  • Resource: 目标资源的ARN(指定越具体越安全)
  • Condition: 附加条件(IP地址限制、MFA必须等)

最小权限原则

“只对必要的资源,只允许必要的操作”是IAM的铁则。

❌ 危险:滥用通配符
Action: "*"
Resource: "*"

✅ 安全:具体指定
Action: ["s3:GetObject", "s3:PutObject"]
Resource: "arn:aws:s3:::my-uploads-bucket/user-files/*"

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
- 不需要通过Condition限制IP(Lambda不需要)
"

生成示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3ReadSourceBucket",
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::user-uploads-prod/*"
    },
    {
      "Sid": "S3WriteThumbnailBucket",
      "Effect": "Allow",
      "Action": ["s3:PutObject"],
      "Resource": "arn:aws:s3:::user-thumbnails-prod/*"
    },
    {
      "Sid": "DynamoDBWriteMetadata",
      "Effect": "Allow",
      "Action": ["dynamodb:PutItem", "dynamodb:UpdateItem"],
      "Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/image-metadata"
    },
    {
      "Sid": "SNSPublishAlert",
      "Effect": "Allow",
      "Action": ["sns:Publish"],
      "Resource": "arn:aws:sns:ap-northeast-1:123456789012:alert-topic"
    },
    {
      "Sid": "CloudWatchLogs",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/*"
    }
  ]
}

Step 2: 审查现有策略的安全性

让Claude Code审查现有策略是否存在问题。

claude -p "
从安全角度审查以下IAM策略。
请具体指出问题点和修改方案。

$(cat policy.json)
"

Claude Code指出的典型问题:

问题1:Resource: "*"允许对S3的完全访问
  → 具体指定目标桶和前缀

问题2:包含s3:DeleteObject但处理上不需要
  → 删除删除操作

问题3:iam:PassRole用通配符资源授权
  → PassRole只允许特定角色ARN(特权升级风险)

问题4:无法确认CloudTrail是否已启用
  → 建议启用IAM操作日志记录

Step 3: 自动化角色设计

跨多个服务的角色设计

claude -p "
为以下架构设计所需的全部IAM角色:

【架构】
- API Gateway → Lambda(认证)
- Lambda → DynamoDB(用户数据读写)
- Lambda → S3(文件保存)
- Lambda → SES(发送邮件)
- CloudWatch Events → Lambda(批处理)
- CodePipeline → S3、CodeBuild、Lambda(部署)

【输出格式】
- 每个角色的名称和用途
- 信任策略(Trust Policy)
- 访问策略
- 以AWS CDK TypeScript代码输出
"

CDK中的角色实现

// lib/iam-stack.ts
import * as cdk from "aws-cdk-lib";
import * as iam from "aws-cdk-lib/aws-iam";
import * as lambda from "aws-cdk-lib/aws-lambda";

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",
      description: "API Lambda用最小权限角色",
    });

    // 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/*`,
        ],
      })
    );

    // S3写入权限(仅特定桶和前缀)
    lambdaRole.addToPolicy(
      new iam.PolicyStatement({
        sid: "S3FileUpload",
        effect: iam.Effect.ALLOW,
        actions: ["s3:PutObject", "s3:GetObject"],
        resources: [
          `arn:aws:s3:::user-files-${this.account}/uploads/*`,
        ],
      })
    );

    // SES发送邮件权限
    lambdaRole.addToPolicy(
      new iam.PolicyStatement({
        sid: "SESSendEmail",
        effect: iam.Effect.ALLOW,
        actions: ["ses:SendEmail", "ses:SendRawEmail"],
        resources: ["*"],
        conditions: {
          StringEquals: {
            "ses:FromAddress": "[email protected]",
          },
        },
      })
    );

    // CloudWatch Logs写入权限
    lambdaRole.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName(
        "service-role/AWSLambdaBasicExecutionRole"
      )
    );
  }
}

Step 4: 审查IAM Access Analyzer的结果

让Claude Code审查IAM Access Analyzer的输出。

# 获取Access Analyzer结果
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 -p "
设计应用于生产环境AWS账户的SCP。
需满足以下要求:

1. 禁用ap-northeast-1(东京)和us-east-1(弗吉尼亚)以外的所有区域
2. 禁止root账户的API操作
3. 禁止禁用或删除CloudTrail
4. 禁止禁用GuardDuty
5. 禁止修改特定IAM角色('OrganizationAdminRole')
"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyUnsupportedRegions",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": ["ap-northeast-1", "us-east-1"]
        },
        "ArnNotLike": {
          "aws:PrincipalARN": [
            "arn:aws:iam::*:role/OrganizationAdminRole"
          ]
        }
      }
    },
    {
      "Sid": "DenyCloudTrailModification",
      "Effect": "Deny",
      "Action": [
        "cloudtrail:DeleteTrail",
        "cloudtrail:StopLogging",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    }
  ]
}

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等AWS托管策略虽然方便,但包含了远超所需的权限。如果Lambda只从S3读取,请使用仅含s3:GetObject的自定义策略。

3. 内联策略与自定义托管策略混用

内联策略无法复用,且难以追踪。统一使用托管策略并进行版本管理。

4. 缺少通过Condition强制MFA

切换到管理员角色时,必须强制要求MFA。

{
  "Condition": {
    "BoolIfExists": {
      "aws:MultiFactorAuthPresent": "true"
    }
  }
}

总结

任务Claude Code的贡献
策略生成只需描述用途即可生成最小权限策略
安全审查指出现有策略的问题点和修改方案
角色设计设计整体架构的角色构成
CDK实现自动生成TypeScript IAM代码
SCP设计生成组织级护栏策略

IAM不是”做完就完事”,需要定期审查。养成每月让Claude Code审查现有策略的习惯,就能持续降低安全风险。

相关文章

参考资料

#claude-code #aws #iam #security #typescript #infrastructure

让你的 Claude Code 工作流更上一层楼

50 个经过实战检验的提示词模板,现在就能复制粘贴到 Claude Code 中使用。

免费

免费 PDF:5 分钟看懂 Claude Code 速查表

只需留下邮箱,我们就会立即把这份 A4 一页速查表 PDF 发送给你。

我们会严格保护你的个人信息,绝不发送垃圾邮件。

Masa

本文作者

Masa

深度使用 Claude Code 的工程师。运营 claudecode-lab.com——一个涵盖 10 种语言、超过 2,000 页内容的科技媒体。