在混合云环境里,Terraform已经成为定义网络基础设施的主流方式,但书写资源时一个疏忽就可能让负载均衡器对公网全开。tfsec是一款专注于Terraform静态安全分析的命令行工具,它读取本地或仓库内的HCL文件,依照内置的数百条规则识别潜在错误。与需要在云端跑起来的合规扫描不同,tfsec在代码提交阶段就能给出反馈,帮助工程师在部署前消灭低级配置失误。

tfsec的核心工作原理与规则机制
tfsec并不真正执行Terraform计划,而是利用HCL2解析器将配置文件构建成抽象语法树,再遍历每一个资源块、变量和数据源。每一条规则对应一个Go语言编写的检查函数,函数内声明了匹配条件,比如资源类型是否为aws_security_group,以及某个属性值是否等于危险字符串。当遍历到的节点满足规则描述时,工具就输出对应严重级别和修复建议。
规则集覆盖了主流云厂商的基础网络安全项。例如检测aws_security_group_rule里的cidr_blocks是否包含0.0.0.0/0且协议为TCP、端口为22,这类写法意味着SSH对全球开放。tfsec把这种检查抽象成aws-vpc-no-public-ingress之类的编号,用户可以通过命令行参数忽略特定规则或只运行某类检查。由于分析过程纯静态,它不需要云账号凭证,也不会产生任何费用。
除了官方规则,tfsec支持通过JSON或rego策略扩展。企业可以把内部网络分区规范写成自定义规则,比如禁止在生产模块里直接写明文password变量。自定义规则同样挂在语法树遍历流程中,和内置检查一起运行,保证团队标准被强制执行。这种机制让tfsec既适合个人项目,也能融入有严格合规要求的大型组织。
常见网络基础设施配置错误的扫描示例
下面是一段存在典型问题的Terraform代码,安全组允许所有IP访问数据库端口,并且没有开启流量日志。把这段内容保存为main.tf后运行tfsec就能看到告警。
resource "aws_security_group" "db_sg" {
name = "database-sg"
ingress {
from_port = 3306
to_port = 3306
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_db_instance" "main" {
engine = "mysql"
instance_class = "db.t3.micro"
# 未配置存储加密
storage_encrypted = false
}
执行tfsec .命令后,终端会列出类似aws-vpc-no-public-ingress和aws-rds-enable-storage-encryption的结果,指出数据库端口暴露和未加密存储。每条结果都带有文件路径与行号,工程师能快速定位到具体代码块。相比靠代码评审人肉眼找问题,这种确定性的输出大幅降低了漏报率。
另一个高频错误是在aws_lb_listener上直接挂HTTP而非HTTPS,或者把acl写成私有但实际上绑定了公网子网。tfsec对负载均衡、VPC流日志、路由表指向都有对应规则。通过定期扫描模块仓库,团队可以积累一份配置错误清单,反向优化内部的Terraform模板基线。
将tfsec嵌入CI流水线阻断危险提交
要在团队中真正发挥作用,应当把tfsec放在持续集成环节。以GitHub Actions为例,可以在拉取请求 workflow 里加入一步安装并运行tfsec,若发现中高危问题则让任务失败,从而阻止合并。这样写网络基础设施的人必须在本地先过一遍检查,而不是等运维在部署时踩坑。
name: tfsec
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install tfsec
run: curl -s https://raw.githubusercontent.com/aquasecurity/tfsec/master/scripts/install_linux.sh | bash
- name: Run tfsec
run: tfsec . --minimum-severity medium
上面的配置会在每次PR时扫描当前目录,并且只接受 mediums 以上级别的问题导致失败,轻微警告不会阻断流程。如果项目使用GitLab CI,同样只需在.gitlab-ci.yml里加一个stage执行二进制即可。配合--format json参数,还可以把结果发给内部安全平台做趋势统计。
对于已经积累大量历史模块的组织,一次性全量扫描可能产生几百条告警。此时可以先用tfsec --exclude-rule忽略非网络类规则,聚焦安全组、负载均衡和子网路由,再逐步清理。把tfsec的基线配置文件提交到仓库根目录,也能保证所有人使用的规则版本一致,避免本地和流水线结果不一致引发的扯皮。
局限性与配合其他工具的建议
tfsec只做静态分析,它无法得知云上真实状态。例如代码里写的是私有子网,但账号里手动改过路由表,tfsec发现不了这种漂移。因此它应当和terraform plan以及云厂商的配置审计服务搭配。开发阶段用tfsec卡代码,运行阶段用云端配置检查兜底,才能形成闭环。
另外,tfsec的规则有时过于保守,比如某些演示环境确实需要0.0.0.0/0开放。此时不要直接删掉检查,而应在资源上方加# tfsec:ignore:aws-vpc-no-public-ingress注释并写明原因,既保留规则又允许例外。长期看,把网络基础设施的安全配置错误检测左移,能显著减少线上事故,而tfsec是这套左移方案里成本最低的一环。