mcpField
I
infra-as-code-review

infra-as-code-review

github.com/mohitagw15856云与 DevOps1.5k36 次安装5 天前更新
代码仓库

关于 infra-as-code-review

infra-as-code-review 是一项针对基础设施即代码进行结构化审查的技能,面向维护云资源配置的工程团队。提供按严重程度整理的发现与修复建议,并生成可复用的审查清单;未提供代码时则输出清单和报告模板。

主要功能

  1. 01审查 IaC 代码中的安全与可靠性问题
  2. 02按严重程度整理发现
  3. 03给出具体修复建议和代码示例
  4. 04覆盖 12 类基础设施审查项目
  5. 05生成可复用的 IaC 检查清单

适用场景

  1. 01审查基础设施代码变更
  2. 02为 IaC 合并请求设置安全检查
  3. 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[标题]低[类别][文件:行号]未解决

合并前必须采取的措施

仅列出必须在此代码合并前解决的严重和高危发现项:

  1. CRIT-01 [标题] — [一行修复说明]
  2. HIGH-01 [标题] — [一行修复说明]

中危和低危发现项应作为后续问题跟踪,并确定承诺的解决日期。


审查人:[Reviewer];日期:[Date] — 检查清单版本 [1.0]


质量检查

  • 每项发现都包含:严重程度、类别、具体资源名称、文件和行号、当前代码以及修复后的代码
  • 检查清单涵盖全部 12 个类别:IAM、机密信息、静态加密、传输中加密、网络、日志记录、命名/标记、状态、模块结构、环境一致性、成本和漂移
  • 执行摘要表已填写实际计数 — 不是全部为零或占位符
  • “合并前必须采取的措施”部分仅列出严重和高危事项
  • 发现项中的代码片段同时展示有问题的代码和修正后的代码
  • 总体风险评级由最高严重级别的未解决发现项支撑
  • 检查清单项目为二元可检查项 — 不是叙述性观察

反模式

  • 如果发现涉及以任何形式硬编码的凭据或机密,切勿将其标记为低风险——应始终标记为严重
  • 切勿脱离部署上下文单独审查 IaC——必须同时评估网络和 IAM
  • 切勿在叙述性发现中遗漏具体资源名称、文件和行号
  • 切勿跳过“合并前必需操作”摘要——审查者需要清晰的阻塞事项列表,而不只是完整报告
  • 如果数据存储缺少静态加密或传输中加密,即使请求者没有明确指出,也切勿批准相关代码

评论

支持 Markdown