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审查现有策略的习惯,就能持续降低安全风险。
相关文章
参考资料
免费 PDF:5 分钟看懂 Claude Code 速查表
只需留下邮箱,我们就会立即把这份 A4 一页速查表 PDF 发送给你。
我们会严格保护你的个人信息,绝不发送垃圾邮件。
本文作者
Masa
深度使用 Claude Code 的工程师。运营 claudecode-lab.com——一个涵盖 10 种语言、超过 2,000 页内容的科技媒体。
相关文章
Claude Code × Amazon Bedrock 完整指南 | 在AWS上将Claude投入生产环境
使用Claude Code充分利用Amazon Bedrock的完整指南。从IAM认证、流式传输、Lambda集成、RAG实现到成本优化——基于Masa的实际生产实施经验。
Claude Code × AWS CodePipeline/CodeBuild 完全指南 | 自动构建CI/CD流水线
使用Claude Code通过AWS CodePipeline和CodeBuild自动构建CI/CD。包含流水线设计、buildspec.yml生成、测试自动化、CDK基础设施定义的实战代码解说。
Claude Code × AWS CloudWatch 完整指南 | 日志分析·告警设置·仪表盘自动构建
用 Claude Code 提升 AWS CloudWatch 效率。包含日志模式分析、自动告警配置、指标仪表盘构建及故障排查的实战代码解析。