应用安全SASTIaC【免费下载链接】tfsecTfsec is now part of Trivy项目地址https://gitcode.com/gh_mirrors/tf/tfsec点击查看免费下载tfsec 是 Aqua Security 开源的 Terraform 静态安全扫描工具通过对 HCL 代码的静态分析来发现潜在的错误配置与安全风险内置数百条覆盖 AWS、Azure、GCP 等多个云厂商的检查规则并支持模块扫描、表达式求值、Rego 策略与多格式输出。本文以仓库 README.md 为主线结合 命令行实现 与 扫描入口 源码系统讲解安装、使用、忽略规则、配置化、CI 集成以及向 Trivy 迁移的完整路径帮助读者将 tfsec 无缝接入日常 Terraform 开发与 CI 流水线。项目概述与核心能力tfsec 使用静态分析static analysis手段扫描 Terraform 代码检测潜在的错误配置misconfiguration无需实际执行terraform apply即可在代码评审阶段发现问题。其核心能力如下多云覆盖检查规则覆盖几乎所有主流云厂商AWS、Azure、GCP也包括 CloudStack、DigitalOcean、GitHub、Kubernetes、OpenStack、Oracle 等平台。内置海量规则仓库内置数百条开箱即用的检查规则按云厂商组织在 docs/assets/checks 目录下例如 AWS 的aws-s3-enable-bucket-encryption、Azure 的azure-storage-enforce-https、GCP 的google-compute-no-public-ingress等。模块扫描既支持本地模块也支持远程模块可在 test/testdata/external-module 中查看扫描示例。表达式求值不仅识别字面量还能对 HCL 表达式如变量引用求值。Terraform 函数求值支持求值concat()等 Terraform 内置函数相关示例见 _examples。资源间关系分析能够求值 Terraform 资源之间的引用关系例如requiresPresence类的关联检查。兼容 Terraform CDK可与 CDK for Terraform 配合使用。Rego 策略支持可应用并增强用户自定义的 Rego 策略见 docs/guides/rego/rego.md。多种输出格式默认lovely格式另支持 JSON、SARIF、CSV、CheckStyle、JUnit、text、Gif 等。可配置化既可通过 CLI 标志也可通过配置文件进行配置。高性能能够快速扫描大型代码仓库。IDE 插件生态提供 JetBrains、VSCode、Vim 等主流 IDE 插件。安装方式tfsec 提供了多种安装途径可按操作系统与使用场景任选其一。Homebrew / LinuxbrewmacOS 或 Linux 环境可使用 Homebrew 或 Linuxbrew 安装brew install tfsecChocolatey 与 ScoopWindowsWindows 用户可以使用 Chocolatey 或 Scoopchoco install tfsecscoop install tfsecLinux 脚本安装Linux 环境可使用仓库自带的安装脚本 scripts/install_linux.shcurl -s https://raw.githubusercontent.com/aquasecurity/tfsec/master/scripts/install_linux.sh | bashGo install使用 Go 工具链安装go install github.com/aquasecurity/tfsec/cmd/tfseclatest需要特别注意的是使用go install会直接从master分支安装因此通过tfsec --version不会报告正常的版本号。发布包与签名校验也可以直接从 releases 页面下载对应系统的二进制文件。这些二进制文件使用 tfsec 签名密钥D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE签名公钥文件位于 utils/gpg_keys校验步骤详见 SIGNING.md 与 docs/guides/signing.md。基本用法tfsec 会扫描指定目录若未指定目录则默认扫描当前工作目录tfsec .也可以显式传入任意目录tfsec ./tf/prod扫描结束后退出状态码非零表示发现问题为零表示未发现问题。从 internal/app/tfsec/cmd/root.go 的getDetailedExitCode源码可以看到更精细的退出码语义退出码含义0没有失败的检查1存在 CRITICAL / HIGH / MEDIUM 级别的失败检查2存在失败检查但全部为 LOW 级别此外internal/app/tfsec/cmd/root.go 展示了完整扫描流程确定目录 → 校验参数 → 构造扫描器选项 → 扫描文件系统并收集结果与指标 → 按格式输出 → 依据退出码返回。若目录中存在.tfvars文件但未通过--tfvars-file指定tfsec 会给出提示警告。常用命令行参数tfsec 提供了丰富的 CLI 参数完整列表可通过tfsec --help查看定义见 internal/app/tfsec/cmd/flags.go参数短参数说明--format string-f输出格式lovely默认、json、csv、checkstyle、junit、sarif、text、markdown、html、gif支持逗号分隔多格式配合--out指定基础文件名--out string-O输出文件路径指定多格式时文件名会追加格式描述符--exclude string-e逗号分隔的规则 ID 列表从本次运行中排除--exclude-ignores-E逗号分隔的忽略规则列表强制其失效--filter-results string仅返回指定检查的结果支持逗号分隔--minimum-severity string-m最低报告级别取值CRITICAL、HIGH、MEDIUM、LOW之一非法值会被拒绝见 flags.go--soft-fail-s运行检查但抑制错误退出码--tfvars-file strings.tfvars文件路径可多次指定并按顺序求值--var-file strings与--tfvars-file功能一致命名与 Terraform 保持一致--exclude-path strings需要排除的目录路径可多次指定--no-colour/--no-color禁用彩色输出两种拼写都支持--include-passed在结果中同时输出通过检查的项--include-ignored在结果中同时输出被忽略的项--no-ignores不应用任何忽略规则--migrate-ignores将旧版 ignore 代码迁移到新 ID 结构--force-all-dirs不搜索 tf 文件扫描指定目录下的所有内容--workspace string-w指定 workspace用于限定 ignore 生效范围默认default--config-file string指定运行使用的配置文件--config-file-url string从远程 HTTP 位置下载配置文件须为 json 或 yaml--custom-check-dir string显式指定自定义检查目录--custom-check-url string从远程 HTTP 位置下载自定义检查文件须为 json 或 yaml--rego-policy-dir string递归加载 Rego 策略的目录--rego-only仅运行 Rego 策略--print-rego-input打印提供给 Rego 策略的 JSON 形式输入--no-module-downloads不下载远程模块--exclude-downloaded-modules排除.terraform目录中已下载模块的结果--disable-grouping-G禁用相似结果分组--single-thread使用单线程运行检查--ignore-hcl-errors遇到 HCL 解析错误时不报告错误--concise-output减少输出量且不输出统计信息--run-statistics输出当前发现项的统计表--debug/--verbose启用调试详细日志--code-theme string注解代码的主题light或dark默认dark--no-code输出中不包含代码片段--version-v显示版本信息并退出--update更新到最新版本值得一提的是这些参数支持通过环境变量前缀TFSEC注入源码 flags.go 使用 Viper 将TFSEC_前缀的环境变量自动绑定到同名参数-替换为_适合容器与 CI 场景下的无侵入配置。使用 Docker 运行除了在系统上安装运行也可以使用 Docker 容器方式运行 tfsec。仓库提供多种镜像变体对应 Dockerfile、Dockerfile.ci、Dockerfile.scratch镜像名基础镜像说明aquasec/tfsecalpine常规 tfsec 镜像aquasec/tfsec-alpinealpine与aquasec/tfsec完全相同适合希望显式声明基础镜像的用户aquasec/tfsec-cialpine无 entrypoint适合 CI 中需要覆盖命令的场景aquasec/tfsec-scratchscratch基于 scratch 构建的极简镜像仅运行 tfsec运行示例将当前目录挂载到容器并扫描docker run --rm -it -v $(pwd):/src aquasec/tfsec /src忽略警告tfsec:ignore在某些场景下你可能希望忽略特定警告。tfsec 支持在模板中的问题所在行添加包含tfsec:ignore:rule的注释也可以将注释放在问题所在块上一行对于模块内的问题还可以在module 块上方添加注释以忽略该模块内的全部同类问题。例如忽略一条开放的 security group 规则resource aws_security_group_rule my-rule { type ingress cidr_blocks [0.0.0.0/0] #tfsec:ignore:aws-vpc-no-public-ingress-sgr }……或者resource aws_security_group_rule my-rule { type ingress #tfsec:ignore:aws-vpc-no-public-ingress-sgr cidr_blocks [0.0.0.0/0] }如果不确定应把注释放在哪一行直接查看 tfsec 输出中问题对应的行号即可。忽略多条规则可以在同一行内拼接多条忽略规则#tfsec:ignore:aws-s3-enable-bucket-encryption tfsec:ignore:aws-s3-enable-bucket-logging resource aws_s3_bucket my-bucket { bucket foobar acl private }忽略到期时间Expiration Date可以为 ignore 设置yyyy-mm-dd格式的到期时间。当希望确保被忽略的问题不会被遗忘、未来需要重新审视时非常有用#tfsec:ignore:aws-s3-enable-bucket-encryption:exp:2025-01-02上述忽略仅在2025-01-02之前生效到期后自动失效问题将重新被报告。模块级忽略第三方模块内部的问题无法通过修改模块源码的方式忽略此时可以在导入模块的 block 上方添加忽略规则详见 docs/guides/configuration/ignores.md#tfsec:ignore:AWS052:exp:2022-01-01 module db { source terraform-aws-modules/rds/aws ...workspace 限定忽略忽略规则可通过ws:声明限定到特定 workspace只有使用--workspace指定对应名称时才生效# tfsec:ignore:AWS006:exp:2221-01-02 #tfsec:ignore:AWS018:ws:development resource aws_security_group_rule my-rule { type ingress cidr_blocks [0.0.0.0/0] }tfsec --workspaces development .按特定值忽略实验特性当使用for_each且希望只放行部分取值时可以基于提供的值进行忽略locals { rules { http 80 https 443 } } #tfsec:ignore:aws-vpc-no-public-ingress-sgr[from_port443] resource aws_security_group_rule this { for_each local.rules type ingress description test from_port each.value to_port each.value protocol tcp cidr_blocks [0.0.0.0/0] }上例中aws-vpc-no-public-ingress-sgr检查对80端口仍然失败但创建443端口规则时检查通过。旧版 ID 自动迁移早期版本的 tfsec 使用AWS001、AWS002这类旧式 ID。仓库通过 internal/pkg/legacy/map.go 维护旧 ID 到新 ID 的完整映射例如AWS002→aws-s3-enable-bucket-logging、AWS006→aws-vpc-no-public-ingress-sgr而 internal/pkg/ignores/migration.go 实现了--migrate-ignores的自动重写逻辑遍历目录内.tf文件用正则匹配tfsec:ignore:([A-Z]{3}\d{3})并将旧代码替换为新代码。因此升级后旧注释仍会被识别扫描器通过 legacy.FindIDs 提供旧 ID 查询也支持一键批量迁移。禁用检查Disable checks如果希望从运行中排除某些检查可以在命令中追加-e参数并传入逗号分隔的规则 ID 列表tfsec . -e general-secrets-sensitive-in-variable,google-compute-disk-encryption-customer-keys引入 .tfvars 文件的值扫描时可以通过--tfvars-file引入 tfvars 文件中的变量值仓库示例见 _examples/withVars 与 test/testdata/tfvarstfsec . --tfvars-file terraform.tfvars从源码看root.go 会在目录中发现*.tfvars但未显式指定时输出提示而 flags.go 会将 tfvars 路径转换为相对文件系统根路径后通过ScannerWithTFVarsPaths注入扫描器使变量值参与表达式求值。使用配置文件进行集中管理对于需要跨项目统一策略的场景tfsec 支持配置文件详见 docs/guides/configuration/config.md。配置文件放置在扫描根路径下的.tfsec文件夹中命名为config.json、config.yml或config.yaml存在时会被自动加载对应源码逻辑见 flags.go。也可通过--config-file显式指定tfsec --config-file tfsec.yml配置文件的字段定义可直接对照 internal/pkg/config/config.go 中的Config结构体。支持字段如下字段说明minimum_severity最低报告级别取值CRITICAL、HIGH、MEDIUM、LOWseverity_overrides按检查 ID 覆盖默认严重级别include仅扫描指定的检查子集exclude排除指定的检查支持ID:yyyy-mm-dd格式的到期时间exclude_ignores强制失效的 ignore 列表min_required_version要求的最低 tfsec 版本不满足则拒绝运行设置最低严重级别{ minimum_severity: MEDIUM }或 YAML--- minimum_severity: MEDIUM严重级别覆盖内置检查的默认严重级别可能过重或不足可在配置文件中按检查 ID 覆盖{ severity_overrides: { CUS002: ERROR, aws-s3-enable-versioning: LOW } }--- severity_overrides: CUS002: ERROR aws-s3-enable-versioning: HIGH注意从源码 rewriteSeverityOverrides 可以看出所有覆盖值会经过severity.StringToSeverity归一化非法值会落入None级别。仅包含指定检查当新增检查需要在纳入 CI 前先评估时可以在配置文件中通过include限定检查子集该能力已从命令行移除只能通过配置文件设置{ include: [CUS002, aws-s3-enable-versioning] }--- include: - CUS002 - aws-s3-enable-versioning排除指定检查当需要排除的检查越来越多时相比在命令行堆砌-e在配置文件中列出更易维护{ exclude: [CUS002, aws-s3-enable-versioning] }--- exclude: - CUS002 - aws-s3-enable-versioningexclude 支持到期时间到期后检查自动重新启用{ exclude: [CUS002:2022-12-31, aws-s3-enable-versioning] }--- exclude: - CUS002:2022-12-31 - aws-s3-enable-versioning对应的过期判断逻辑在 config.go 的GetValidExcludedChecks中解析:后的日期若已过期则跳过该项排除。最低版本要求如果通过集中托管的配置文件下发到所有构建流程往往还希望约束 tfsec 版本不低于某个值{ min_required_version: v1.1.2 }--- min_required_version: v1.1.2版本校验在 root.go 的minVersionSatisfied中基于语义化版本semver比较实现不满足时直接报错退出。远程加载配置文件配置文件也可通过--config-file-url从远程 HTTP 位置下载须为 json 或 yaml 扩展名tfsec --config-file-url https://github.com/myorg/tfsecconfig/config.json .对应的下载实现位于 flags.go下载后写入临时文件再加载。自定义检查当内置检查无法覆盖组织的合规需求时例如要求所有 EC2 实例必须带CostCentre标签可以使用自定义检查。自定义检查以 JSON 或 YAML 文件形式放在.tfsec目录中任何以_tfchecks.json或_tfchecks.yaml结尾的文件都会被解析并纳入运行详见 docs/guides/configuration/custom-checks.md。一个检查 CostCentre 标签的示例{ checks: [ { code: CUS001, description: Custom check to ensure the CostCentre tag is applied to EC2 instances, impact: By not having CostCentre we cant keep track of billing, resolution: Add the CostCentre tag, requiredTypes: [resource], requiredLabels: [aws_instance], severity: ERROR, matchSpec: { name: tags, action: contains, value: CostCentre }, errorMessage: The required CostCentre tag was missing, relatedLinks: [http://internal.acmecorp.com/standards/aws/tagging.html] } ] }核心字段说明属性说明code自定义检查的标识码如CUS001description检查描述会出现在输出中impact可选未通过检查的后果resolution可选如何满足检查的简要说明requiredTypes检查适用的块类型provider、resource、data、module、variablerequiredLabels资源类型如aws_instance支持*通配符如aws_*severity检查严重级别matchSpec检查的具体匹配规则支持contains、equals、isPresent、notPresent、isEmpty、startsWith、endsWith、notContains、onlyContains、lessThan、greaterThan、regexMatches、isAny、isNone、requiresPresence、inModule、and、or、not等动作errorMessage检查失败时显示的错误消息relatedLinks失败时显示的相关链接列表自定义检查文件可以用tfsec-checkgen工具进行校验与测试go run ./cmd/tfsec-checkgen validate example/custom/.tfsec/custom_checks.jsongo run ./cmd/tfsec-checkgen test-check ./example/cmd_checkgen_test-check/.tfsec/example_tfchecks.json \ --fail ./example/cmd_checkgen_test-check/fail.tf \ --pass ./example/cmd_checkgen_test-check/pass.tf仓库中可参考的完整自定义检查示例见 _examples/custom 与 test/testdata/custom。在 CI 中运行tfsec 天然为 CI 流水线设计。在构建过程中运行且不希望出现彩色输出时可使用--no-colour美国拼写--no-color同样支持。退出码会直接决定构建是否失败发现问题返回非零未发现问题返回零。作为 GitHub Action 使用可以在 GitHub Actions 中通过tfsec/tfsec-sarif-action运行扫描并将 SARIF 结果上传到 Security 标签页详细说明见 docs/guides/github-actions/github-action.mdname: tfsec on: push: branches: - main pull_request: jobs: tfsec: name: tfsec sarif report runs-on: ubuntu-latest steps: - name: Clone repo uses: actions/checkoutmain - name: tfsec uses: tfsec/tfsec-sarif-actionmaster with: sarif_file: tfsec.sarif - name: Upload SARIF file uses: github/codeql-action/upload-sarifv1 with: sarif_file: tfsec.sarif如果 Terraform 代码位于仓库较深的目录可以通过working_directory指定扫描范围- name: tfsec uses: tfsec/tfsec-sarif-actionv0.0.3 with: working_directory: terraform/relevant sarif_file: tfsec.sarif github_token: ${{ secrets.GITHUB_TOKEN }}作为 Azure DevOps Pipelines Tasktfsec 也提供了官方的 Azure DevOps TaskAquaSecurityOfficial.tfsec-official相关问题与功能请求可反馈到对应的 task 仓库。输出格式与 GitHub Security Alertstfsec 支持将结果输出为 JSON、CSV、Checkstyle、SARIF、JUnit 或纯人类可读格式通过--format标志指定多格式可逗号分隔并配合--out写文件第一个格式会额外输出到 stdout。若希望与 GitHub Security Alerts 集成将 tfsec 检查结果纳入安全告警可使用tfsec-sarif-action运行静态分析后将结果上传到安全告警标签页。告警展示效果如下点击分支下的告警条目可以查看实际问题的详细信息支持旧版 Terraform如果需要支持使用 HCL v1 的 Terraform 版本Terraform 0.12可以使用 tfsec 的v0.1.3版本但该版本支持非常有限且检查规则较少。从 tfsec 迁移到 Trivytfsec 已经成为 Trivy 的一部分过去一年中tfsec 为 Trivy 的 IaC 与错误配置扫描能力含 Terraform 扫描奠定了坚实基础。项目后续的工程投入将集中在 Trivy 上tfsec 暂时仍可用但社区被鼓励迁移到 Trivy以获得以下额外收益在同一工具中访问更多语言与特性通过 Trivy 丰富的生态获得更多工具与服务集成获得 Aqua 与 Trivy 社区的商业支持。仓库内的 tfsec-to-trivy-migration-guide.md 提供了完整的对比与迁移说明主要命令对照如下场景Trivytfsec简单扫描trivy config dirtfsec dir传入 tfvarstrivy --tf-vars vars.tf dirtfsec dir --tf-vars-file vars.tf指定报告格式trivy config --format format-type dirtfsec dir --format format-typeTrivy 通过从容器镜像仓库拉取的方式自动保持错误配置策略的更新只有无法拉取时才使用内置策略trivy config 单次扫描生成一份报告如需多份不同格式报告可复用缓存重新生成。参与贡献tfsec 欢迎各类贡献无论大小——文档更新、新增检查或更大的功能皆可。详细指引见 CONTRIBUTING.md。项目由 Aqua Security 开源维护可通过 GitHub Discussions 或 Slack 社区交流讨论。赞分享应用安全SASTIaC【免费下载链接】tfsecTfsec is now part of Trivy项目地址https://gitcode.com/gh_mirrors/tf/tfsec点击查看免费下载相关推荐3分钟让缠论不再神秘通达信自动分析插件终极指南3分钟让缠论不再神秘通达信自动分析插件终极指南 你是否曾面对复杂的K线图表感到迷茫当市场波动时你是否希望有一种工具能帮你快速识别关键的结构转折点今天我金融科技Kubescape与Terraform集成基础设施即代码安全扫描Kubescape与Terraform集成基础设施即代码安全扫描 你是否还在为Terraform部署的Kubernetes资源存在安全隐患而担忧本文将详细介网络安全云原生应用安全运维Lambda-local源码解析深入理解Context对象与事件处理核心实现Lambda local源码解析深入理解Context对象与事件处理核心实现 Lambda local 作为一款强大的本地AWS Lambda函数测试工具其创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?