关于 infra-as-code-review
infra-as-code-review 是一项针对基础设施即代码进行结构化审查的技能,面向维护云资源配置的工程团队。提供按严重程度整理的发现与修复建议,并生成可复用的审查清单;未提供代码时则输出清单和报告模板。
主要功能
- 01审查 IaC 代码中的安全与可靠性问题
- 02按严重程度整理发现
- 03给出具体修复建议和代码示例
- 04覆盖 12 类基础设施审查项目
- 05生成可复用的 IaC 检查清单
适用场景
- 01审查基础设施代码变更
- 02为 IaC 合并请求设置安全检查
- 03没有代码样本时准备审查模板
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mohitagw15856/ pm-claude-skills --skill infra-as-code-review安装后在 Claude Code 中输入/infra-as-code-review确认已加载。
详细介绍
基础设施即代码审查
针对特定的 IaC 代码,按照安全性、可靠性和运维质量标准进行结构化审查。输出有两个用途:一是为当前代码提供可执行的审查报告,其中按严重性列出发现的问题并给出具体的修复步骤;二是提供可复用的检查清单,供团队用于今后的每项 IaC 变更。如果用户提供了实际代码,请分析代码,并在发现问题表格中列出真实问题。如果未提供代码,请生成检查清单和发现问题报告模板。
必需输入
如果用户尚未提供,请询问以下信息:
- IaC 工具 — Terraform、CloudFormation、Pulumi、Ansible 或 CDK
- 云服务提供商 — AWS、GCP、Azure 或多云
- 代码配置的资源 — 简要说明(例如,“为 payments 服务配置 VPC、EKS 集群和 RDS 实例”)
- 使用的安全策略或命名标准 — 需要检查的现有组织标准;如果没有,请采用合理的默认标准
- IaC 代码本身 — 粘贴或描述代码;如果未提供,只生成检查清单模板,并说明需要代码才能识别问题
输出格式
IaC 审查报告:[配置的资源]
审查者: [姓名 / Claude] IaC 工具: [Terraform / CloudFormation / Pulumi / Ansible / CDK] 云服务提供商: [AWS / GCP / Azure] 代码位置: [仓库路径或 PR 链接] 审查日期: [日期] 总体风险: [严重 / 高 / 中 / 低]
执行摘要
| 严重性 | 发现数量 | 本次审查中已解决 | 遗留风险 |
|---|---|---|---|
| 严重 | [n] | [n] | [是/否 — 说明] |
| 高 | [n] | [n] | [是/否 — 说明] |
| 中 | [n] | [n] | [是/否 — 说明] |
| 低 | [n] | [n] | [是/否 — 说明] |
| 总计 | [n] | [n] |
建议: [批准 / 修改后批准 / 阻止 — 用一句话说明理由]
发现的问题
严重问题
CRIT-01:[问题标题]
| 字段 | 详情 |
|---|---|
| 严重性 | 严重 |
| 类别 | [IAM / 密钥 / 加密 / 网络 / 状态 / 命名 / 成本] |
| 资源 | [resource_type.resource_name] |
| 文件 / 行号 | [path/to/file.tf:42] |
| 风险 | [可能发生什么 — 具体说明攻击途径或故障模式] |
当前代码:
# [paste the problematic snippet]
resource "aws_s3_bucket" "data" {
bucket = "my-bucket"
acl = "public-read" # PROBLEM: public read access
}
修复方案:
resource "aws_s3_bucket" "data" {
bucket = "my-bucket"
}
resource "aws_s3_bucket_public_access_block" "data" {
bucket = aws_s3_bucket.data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
重要性: [用一句话说明该具体风险可能造成的业务影响 — 数据泄露、违反合规要求等。]
CRIT-02:[下一个严重问题 — 重复以上结构]
高风险问题
HIGH-01:[问题标题]
| 字段 | 详情 |
|---|---|
| 严重性 | 高 |
| 类别 | [类别] |
| 资源 | [resource_type.resource_name] |
| 文件 / 行号 | [path/to/file.tf:line] |
| 风险 | [具体风险描述] |
当前代码:
# [problematic snippet]
修复方案:
# [fixed snippet]
中风险问题
MED-01:[问题标题]
| 字段 | 详情 |
|---|---|
| 严重性 | 中 |
| 类别 | [类别] |
| 资源 | [resource_type.resource_name] |
| 文件 / 行号 | [path/to/file.tf:line] |
| 风险 | [具体风险描述] |
修复方案: [使用文字说明或代码片段 — 根据该问题选择更清晰的表达方式]
低风险问题
LOW-01:[问题标题]
| 字段 | 详情 |
|---|---|
| 严重性 | 低 |
| 类别 | [类别] |
| 资源 | [resource_type.resource_name] |
| 文件 / 行号 | [path/to/file.tf:line] |
| 建议 | [说明需要改进的内容及原因] |
可复用的 IaC 审查检查清单
每次 IaC 拉取请求都使用此检查清单。检查每一项;只有在该项确实不适用于所配置的资源时,才标记为 N/A。
1. IAM 和访问控制
- IAM 策略中没有通配操作(
"*")——策略遵循最小权限原则 - IAM 策略中没有通配资源(
"*"),除非通过注释明确说明合理性 - IAM 角色使用条件键限制范围(例如,
aws:RequestedRegion、sts:ExternalId) - 没有硬编码或以明文变量形式存储的 IAM 访问密钥或凭证
- EC2 / 计算实例使用实例配置文件,而非硬编码凭证
- S3 存储桶策略不允许公开访问,除非该存储桶明确用于存放公开资产
- 跨账户信任策略指定具体账户 ID,而非
"*" - 服务账号(GCP)/托管标识(Azure)遵循命名规范,并记录其用途
2. 密钥管理
- 任何
.tf、.yaml或.json文件中都没有以明文存储的密钥、密码、令牌或 API 密钥 - 变量默认值中没有密钥
- 密钥从 Secrets Manager / Parameter Store / Vault 获取,而非通过计划时传入的环境变量获取
- 所有包含密钥的输出值和变量都设置了
sensitive = true(Terraform) - 状态后端已加密——没有包含敏感数据的未加密状态文件
-
.gitignore或同等配置排除*.tfvars、terraform.tfstate以及任何可能包含解析后密钥的文件
3. 静态加密
- 存储资源(S3、EBS、RDS、DynamoDB、GCS、Azure Blob)已启用静态加密
- 在策略要求的场景中使用客户管理密钥(CMK/KMS),而非仅使用 AWS/GCP/Azure 管理的密钥
- 所有 CMK 均已启用 KMS 密钥轮换
- 数据库快照已启用加密
- 未通过
encrypted = false或同等设置禁用加密
4. 传输中加密
- 负载均衡器终止 TLS——仅支持 HTTP 的侦听器会重定向至 HTTPS,或不存在
- 最低 TLS 版本为 1.2;已明确禁用 TLS 1.0 和 1.1
- RDS / 数据库连接要求使用 SSL(
require_ssl = true或同等参数) - 在网络并非完全私有时,内部服务间调用使用 TLS
- S3 存储桶策略包含针对非 TLS 请求的
Deny(aws:SecureTransport: false)
5. 网络和公开访问
- 安全组 / 防火墙规则不允许来自
0.0.0.0/0的入站流量,面向公众的服务在 80/443 端口上除外 - SSH(端口 22)和 RDP(端口 3389)未向
0.0.0.0/0开放 - 数据库位于私有子网中,无法直接通过互联网路由访问
- RDS 实例设置了
publicly_accessible = false,除非有明确要求并记录在案 - VPC 已启用流日志
- 网络 ACL 和安全组采用分层防护(纵深防御)
- 已在账户级和存储桶级启用 S3 存储桶公开访问阻止
6. 日志记录、监控和审计
- 已在所有区域启用 CloudTrail / Cloud Audit Logs / Azure Monitor
- 包含敏感或受监管数据的存储桶已启用 S3 访问日志记录
- 已启用 RDS 增强监控或同等功能
- 已为关键指标(CPU、磁盘、错误率)定义 CloudWatch 警报或同等配置
- 已定义日志保留期限——日志不会无限期保留,也不会在 7 天内删除
7. 命名和标签标准
- 所有资源均遵循团队命名规范:
[env]-[team]-[resource-type]-[identifier] - 所有支持添加标签的资源均包含必需标签:
-
Environment(例如 prod / staging / dev) -
Team或Owner -
Service或Application -
CostCenter(如财务策略要求) -
ManagedBy: terraform(或同等 IaC 工具标签)
-
- 没有使用默认名称的资源(例如
default-vpc、launch-wizard-1)
8. 状态管理和后端
- 已配置远程状态后端 — 仓库中没有本地状态
- 状态后端使用锁定机制(S3 后端使用 DynamoDB 等)
- 状态后端存储桶/存储已启用版本控制
- 状态后端存储桶/存储已启用访问日志记录
- 每个环境使用工作区或独立状态文件 — prod 和非 prod 之间不共享状态
-
terraform.tfstate和*.tfstate.backup已添加到.gitignore
9. 模块和资源结构
- 模块使用明确固定的版本号 — 不使用浮动的
source = "git::...?ref=main" - 在
required_providers中固定提供程序版本 — 不使用不受约束的>= x.y - 在
required_version中固定 Terraform 版本 - 模块职责清晰且单一 — 不使用一个模块来配置所有内容
- 没有复制粘贴造成的重复 — 重复模式使用模块或循环(
for_each、count) - 输出仅暴露下游使用者需要的内容 — 不产生不必要的大量输出
10. 环境一致性
- Prod 和非 prod 环境使用相同的模块代码,并通过环境变量进行参数化
- 实例规格和副本数量通过变量随环境变化 — 不使用单独的代码分支
- 非 prod 不会为了“节省成本”而禁用安全控制(关闭加密、日志记录)
11. 成本影响
- 大型实例类型(例如
r5.16xlarge)或存储分配有注释说明其合理性 - 已考虑跨区域或跨 AZ 架构的数据传输成本
- 已注明长期运行资源是否符合预留实例或承诺使用折扣的资格
- 已为负载变化的工作负载配置自动扩缩 — 不为突发流量配置固定的超大规模资源组
- 存储有时限数据(日志、备份)的 S3 存储桶已设置生命周期策略
12. 漂移风险
- 没有在缺少导入文档的情况下,通过 IaC 管理通常会在控制台中修改的资源
- 在生产环境的有状态资源(数据库、状态存储桶)上设置了
lifecycle { prevent_destroy = true } - 谨慎使用
ignore_changes,并为每个实例添加说明原因的注释 - 作为 PR 流程的一部分,针对实时环境运行 plan — 不存在未经审查的漂移
发现项摘要表
| ID | 标题 | 严重程度 | 类别 | 文件 | 状态 |
|---|---|---|---|---|---|
| CRIT-01 | [标题] | 严重 | [类别] | [文件:行号] | 未解决 |
| HIGH-01 | [标题] | 高 | [类别] | [文件:行号] | 未解决 |
| MED-01 | [标题] | 中 | [类别] | [文件:行号] | 未解决 |
| LOW-01 | [标题] | 低 | [类别] | [文件:行号] | 未解决 |
合并前必须采取的措施
仅列出必须在此代码合并前解决的严重和高危发现项:
- CRIT-01 [标题] — [一行修复说明]
- HIGH-01 [标题] — [一行修复说明]
中危和低危发现项应作为后续问题跟踪,并确定承诺的解决日期。
审查人:[Reviewer];日期:[Date] — 检查清单版本 [1.0]
质量检查
- 每项发现都包含:严重程度、类别、具体资源名称、文件和行号、当前代码以及修复后的代码
- 检查清单涵盖全部 12 个类别:IAM、机密信息、静态加密、传输中加密、网络、日志记录、命名/标记、状态、模块结构、环境一致性、成本和漂移
- 执行摘要表已填写实际计数 — 不是全部为零或占位符
- “合并前必须采取的措施”部分仅列出严重和高危事项
- 发现项中的代码片段同时展示有问题的代码和修正后的代码
- 总体风险评级由最高严重级别的未解决发现项支撑
- 检查清单项目为二元可检查项 — 不是叙述性观察
反模式
- 如果发现涉及以任何形式硬编码的凭据或机密,切勿将其标记为低风险——应始终标记为严重
- 切勿脱离部署上下文单独审查 IaC——必须同时评估网络和 IAM
- 切勿在叙述性发现中遗漏具体资源名称、文件和行号
- 切勿跳过“合并前必需操作”摘要——审查者需要清晰的阻塞事项列表,而不只是完整报告
- 如果数据存储缺少静态加密或传输中加密,即使请求者没有明确指出,也切勿批准相关代码