SuperAPI AI 工具集

tf-best-practices

智能体与模型

查看项目

更新于 10-15 13:37

技能介绍

用途

tf-best-practices 是一个共享的编写指南与只读策略闸门,用于一个正在生成 AWS Terraform 的阶段。它回答两个问题:写之前——“生成的 terraform/ 必须遵循什么安全姿态?”(姿态规则 + baseline.tf 账户加固规范);写之后——“生成的 terraform/ 是否通过策略?”(确定性的只读裁决 + 机器可读报告)。它不是工作流,而是在调用方 Generate 流程的两个触点进入,中间是调用方自己的 Terraform 编写工作;调用方加载时声明所处触点并读取对应部分。

主要能力

第一部分是编写姿态(写 terraform/ 前加载):让生成的 Terraform 满足 references/security-posture-rules.md 中的姿态要求,这些是“好的 AWS Terraform 长什么样”的规则,遵守可让第二部分的闸门按构造通过。该单元不读取调用方产物,只消费调用方传入的上下文信号。规则分三层:闸门强制(Part 2 静态验证)包括 ALB TLS、无公开数据库、RDS + ElastiCache 静态加密、无公开 DB 端口入站、无公开管理/数据存储端口入站、无通配 IAM;仅编写要求(不可闸门检查但仍需满足)包括 deletion_protection、主密码经 Secrets Manager、S3 加固、Fargate/EKS/ECR 设置、私网子网放置、备份、基线监控;合规条件(调用方声明 soc2/pci/hipaa/fedramp 时发出)包括 VPC 流日志、S3 访问日志、密钥轮换、客户托管 KMS。账户加固 baseline.tf 层(CloudTrail、GuardDuty、Config、Security Hub)仍属调用方自己的生成关注点。

第二部分是策略闸门(写 terraform/ 后运行):对生成目录运行只读检查器。脚本路径相对于插件根解析:python3 "$PLUGIN_ROOT/skills/tf-best-practices/scripts/validate-terraform-policy.py" "$TERRAFORM_DIR" --json "$VERDICT_PATH"。$TERRAFORM_DIR 必填且由调用方提供,本技能从不默认或发现它;--json $VERDICT_PATH 可选,写入机器可读裁决供调用方合并进自己的 validation-report.json。策略检查是更大验证流程(fmt → init → validate → policy)的一个阶段;完整协议包括离线回退行为及策略裁决如何映射进 validation-report.json,记录在 references/terraform-validation.md 中,该协议是描述性的,调用方拥有 fmt/init/validate 执行、修复重试循环和报告写入。

退出码与调用方动作:0 / POLICY_OK 表示姿态满足,继续;1 / POLICY_FAIL 表示存在违规,读取 violations[]、编辑被指名的 .tf 位置并重跑(调用方的重试预算);2 表示用法错误(坏路径/IO),向用户暴露,不得视为通过。裁决形状(--json)包含 check、policy_status、violations 数组,每项含 rule、file、line、severity、summary、fix_hint 等可操作证据,调用方据此编辑,本单元只报告。

当前强制执行的策略规则

每条规则在歧义时失效开放——仅在无歧义、块内字面证据时触发,因此有效栈绝不会被误封(POLICY_FAIL 对调用方是硬完成闸门,误报会阻断真实迁移)。

面向互联网的 ALB TLS 姿态(internal 缺失、false 或变量驱动时视为面向互联网,故障安全):alb_https_listener——必须有 443 上的 HTTPS 监听器,含 certificate_arn 和 forward 动作;alb_http_redirect——HTTP :80 监听器必须重定向到 HTTPS,绝不能转发到目标;内部 ALB(internal = true)豁免。Elastic Beanstalk 的 ALB 对这些规则不可见:ALB 规则检查独立的 aws_lb_listener 块,而 EB LoadBalanced 环境从 aws_elastic_beanstalk_environment 设置块提供其 ALB,静态检查器不读取,因此纯 EB 设计空泛地通过 ALB 规则;EB 监听器/TLS 姿态因此仅为编写要求,非闸门强制。

托管数据库暴露与加密(aws_db_instance、aws_rds_cluster):rds_not_public——不得设置 publicly_accessible = true(缺失/变量 → 失效开放);rds_encryption_at_rest——必须设置 storage_encrypted = true,缺失或字面 false 触发(RDS 默认不加密),变量驱动失效开放,S3 不检查(自 2023 年 1 月起默认 SSE-S3)。

ElastiCache 加密(aws_elasticache_replication_group、Redis aws_elasticache_cluster):elasticache_encryption_at_rest——复制组必须设置 at_rest_encryption_enabled = true,缺失或字面 false 触发,变量驱动失效开放;elasticache_cluster_encryption——Redis 引擎的 aws_elasticache_cluster(单节点:engine = "redis",无 replication_group_id)必须同时设置 at_rest_encryption_enabled = true 和 transit_encryption_enabled = true,任一缺失或字面 false 触发,变量驱动失效开放;engine = "memcached" 集群(及变量驱动/缺失 engine)豁免——Memcached 不支持这些属性。

安全组入站:db_sg_no_public_ingress——覆盖 5432/3306 的内联 aws_security_group 入站不得允许 0.0.0.0/0 或 ::/0;sg_no_public_admin_ingress——内联入站不得将精选的永不公开管理/数据存储端口(22、3389、6379、11211、27017、9200/9300、5601)向 0.0.0.0/0 或 ::/0 开放,Web(80/443)和应用/游戏端口不标记,DB 端口由上一规则处理;两者独立检查 cidr_blocks 和 ipv6_cidr_blocks,因此良性的 IPv4 列表不会掩盖开放的 IPv6;两者对独立的 aws_security_group_rule / aws_vpc_security_group_ingress_rule 资源失效开放(不关联)。

IAM 最小权限(aws_iam_policy、aws_iam_role_policy、aws_iam_group_policy、aws_iam_user_policy):no_wildcard_iam——Allow 语句不得使用 Action/Resource "";唯一窄例外是孤立的 elasticbeanstalk:CreateStorageLocation 语句且 Resource = "",因为 AWS 不支持该操作的资源级权限;aws_iam_policy_document 数据源和 assume-role 信任策略失效开放。

使用方式

检查器是零依赖静态 HCL 读取器(无 terraform init、无 provider 下载),即使注册表不可达也能运行;它用花括号深度匹配嵌套块,因此写入嵌套 forward { ... } 块的有效 HTTPS 监听器不会被误判失败。夹具(也是检查器回归套件)位于 fixtures/terraform-policy/:bad-http-forward/ 是面向互联网的 ALB 转发明文 HTTP,MUST POLICY_FAIL;internal-alb-only/ 是内部 ALB 走 HTTP,MUST POLICY_OK(内部允许 HTTP);good-https-redirect/ 是正确模式,POLICY_OK。这些是故意不合规的测试数据(从不部署),通过 .checkov.yaml skip-path 排除在仓库级 checkov 扫描之外;不要“加固”它们,否则会破坏断言失败路径的测试。验证命令:从 skills/tf-best-practices/ 运行 uv run --python 3.12 --with pytest python -m pytest scripts/test_validate_terraform_policy.py -q。

适用场景

适用于调用方在 Generate 阶段生成 AWS Terraform 时的写前姿态约束与写后策略校验,消费者包括 gcp-to-aws(散文式 Generate)和 heroku-to-aws(DSL Generate),契约与源无关,各调用方在自己的 Generate 惯用法中接线两个触点——gcp-to-aws 作为散文步骤,heroku-to-aws 作为片段步骤加一个由解释器强制的失效关闭 _postconditions 断言。

限制

本单元是裁决生产者,绝不是变更者,其整个写入面仅为被要求输出的 JSON 裁决。不得编辑、格式化或重写任何 .tf 文件(修复归调用方);不得读写 .phase-status.json 或任何运行状态文件(解释器拥有);不决定阶段能否完成,也不提示用户(调用方策略)。所有陈述与源云无关(纯 AWS Terraform),任何 GCP/Heroku 检测或产物读取是调用方职责;规则需要调用方已知事实(如声明的合规框架)时,调用方将其作为调用方上下文信号传入。策略检查仅为更大验证流程的一个阶段,fmt/init/validate 执行、修复重试循环和报告写入均由调用方拥有。收费、价格、具体平台支持范围等信息暂未提供。