Trivy config 命令完全指南:用trivy config扫描 IaC 与配置文件中的错误配置
【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy
trivy config是 Trivy(统一安全扫描器)中负责对**配置文件 / 基础设施即代码(IaC)**执行错误配置(misconfiguration)扫描的子命令。它支持 Dockerfile、Terraform、CloudFormation、Kubernetes、Helm、Ansible、Azure ARM 等十余种配置类型,既可用内置的 checks bundle 规则开箱即用,也可通过 Rego 策略定制扫描范围。阅读本文后,你将完整掌握trivy config的语法、全部命令行选项的语义与默认值、各选项背后的源码实现逻辑,以及将其嵌入 CI 流水线的典型用法。
本文以官方 CLI 参考文档 docs/guide/references/configuration/cli/trivy_config.md 为骨架,并结合pkg/commands/app.go、pkg/flag/下的实现进行纵深说明。文中所有链接均指向当前仓库。
trivy config 命令是什么
在 trivy 命令总览 中,config是归入Scanning 组(groupScanning)的子命令,其别名(alias)为conf,一句Short描述即可概括其职责:
Scan config files for misconfigurations
基本语法如下:
trivy config [flags] DIR它接收一个目录(DIR)作为参数,对该目录树内的配置文件进行错误配置扫描。与trivy fs等通用文件系统扫描不同,该命令在源码层面被专门收敛为"纯错误配置扫描":
- 在 pkg/commands/app.go#L688-L760 的
NewConfigCommand中,命令创建时通过options.DisabledAnalyzers = append(analyzer.TypeOSes, analyzer.TypeLanguages...)禁用了所有 OS 层与语言层分析器(不再探测系统包、语言依赖与漏洞); - 同时以
options.Scanners = types.Scanners{types.MisconfigScanner}强制只启用 misconfig 扫描器; - 最终以
artifact.Run(cmd.Context(), options, artifact.TargetFilesystem)的形式,把DIR当作文件系统目标交给通用扫描管线执行。
因此,trivy config的输出聚焦于配置缺陷(如非安全的权限、暴露的管理端口、不符合规范的编排资源等),不会混杂容器漏洞与依赖漏洞信息。
注意:trivy config与trivy fs --scanners misconfig的可观测行为高度相似,但它省去了手动指定--scanners misconfig与关闭无关分析器的麻烦。此外,历史版本中形如--scanners config的写法已被废弃,在 pkg/flag/scan_flags.go#L54-L60 中会打印弃用告警并自动将其映射为 misconfig 扫描器。
全部命令行选项详解
下表按功能分组整理了trivy config支持的全部选项,均来自官方参考文档,并标注了其在源码中的定义位置(集中在 pkg/flag/misconf_flags.go、pkg/flag/rego_flags.go、pkg/flag/cache_flags.go、pkg/flag/report_flags.go),以及可供配置文件trivy.yaml使用的键名(ConfigName)。
IaC / 配置类型相关选项
这些选项决定"扫哪些配置类型、如何解析它们",多数定义于 pkg/flag/misconf_flags.go。
| 选项 | 类型 | 说明 |
|---|---|---|
--misconfig-scanners strings | 逗号分隔列表 | 指定参与错误配置扫描的扫描器集合。默认值为azure-arm,cloudformation,dockerfile,helm,kubernetes,terraform,terraformplan-json,terraformplan-snapshot,ansible(对应配置键misconfiguration.scanners)。从源码看,默认值取自analyzer.TypeConfigFiles并剔除通用 YAML/JSON 类型 |
--helm-values strings | 路径列表 | 指定用于覆盖 Helm 模板渲染的values.yaml文件路径,对应 Helm 模板-f/--values |
--helm-set strings | key=value列表 | 在命令行直接指定 Helm values,可多次传入或用逗号分隔多个key1=val1,key2=val2(对应misconfiguration.helm.set) |
--helm-set-file strings | key=path列表 | 指定从文件读取的 Helm values,形如key1=path1,key2=path2 |
--helm-set-string strings | key=value列表 | 类似--helm-set,但强制将 value 视为字符串处理 |
--helm-api-versions strings | 逗号分隔列表 | 指定 Helm 模板渲染时Capabilities.APIVersions可用的 Kubernetes API 版本,语义与helm template --api-versions相同,如policy/v1/PodDisruptionBudget,apps/v1/Deployment |
--helm-kube-version string | 字符串 | 指定Capabilities.KubeVersion,语义与helm template --kube-version相同 |
--tf-vars strings | 路径列表 | 指定覆盖 Terraform 的*.tfvars文件路径 |
--tf-exclude-downloaded-modules | 布尔 | 排除已下载的 Terraform 模块中的错误配置(配置键misconfiguration.terraform.exclude-downloaded-modules)。CI 环境中若无需审查第三方模块,可显著减少输出噪音 |
--cf-params strings | 路径列表 | 指定覆盖 CloudFormation 参数(parameters)文件的路径 |
--ansible-playbook strings | 路径列表 | 指定要扫描的 Ansible playbook 文件路径 |
--ansible-inventory strings | 主机路径/列表 | 指定 Ansible inventory 主机路径或以逗号分隔的主机列表 |
--ansible-extra-vars strings | key=value/@file | 为 Ansible 设置额外变量,支持key=value形式,或@file引用 YAML/JSON 变量文件 |
--raw-config-scanners strings | 允许值:terraform | 额外对"原始配置"执行扫描(即把未适配的结构化配置放入共享状态再评估)。默认空 |
--render-cause strings | 允许值:terraform,ansible | 在 table 报告中展示指定配置类型的渲染后 cause。默认空 |
--config-file-schemas strings | 路径列表 | 指定 JSON 配置文件 schema 路径:用于判断某文件匹配何种配置、并把 schema 传给 Rego check 做类型检查 |
--k8s-version string | 字符串 | 指定 Kubernetes 版本(如1.21.0),用于校验过期的 Kubernetes API。该命令仅保留这一个 k8s 相关选项(见 pkg/commands/app.go#L716-L719) |
Rego 自定义策略与 checks bundle 相关选项
内置规则由 OCI 形态的 checks bundle 下发,同时支持以 Rego 编写自定义策略。这些选项定义于 pkg/flag/rego_flags.go。
| 选项 | 默认值 | 说明 |
|---|---|---|
--checks-bundle-repository string | mirror.gcr.io/aquasecurity/trivy-checks:2 | 拉取 checks bundle 的 OCI 仓库地址(配置键misconfiguration.checks-bundle-repository)。注意:旧选项名--policy-bundle-repository已废弃 |
--skip-check-update | false | 跳过拉取/更新 Rego checks bundle,配合离线环境或固定版本规则使用(别名--skip-policy-update已废弃) |
--config-check strings | 无 | 指定自定义 Rego check 文件的路径,或包含它们的目录(配置键rego.check)。旧别名--policy、--config-policy已废弃 |
--config-data strings | 无 | 指定用于 Rego 规则评估的数据文件/目录,其中的数据会被递归加载(配置键rego.data) |
--check-namespaces strings | 无 | 自定义 Rego 规则所在的名字空间(配置键rego.namespaces),评估时会从这些命名空间加载规则 |
--include-deprecated-checks | false | 是否包含已被弃用的内置 check |
--rego-error-limit int | 10 | Rego 策略评估期间允许的最大编译错误数(配置键rego.error-limit),默认值来自 Rego 引擎的DefaultAllowedRegoErrors |
--trace-rego | false | 为自定义查询开启更详细的 Rego trace 输出(配置键rego.trace),排查自定义策略时非常有用 |
结合 docs/guide/scanner/misconfiguration/custom 与教程 docs/tutorials/misconfiguration/custom-checks.md 可编写自有策略,基本形态为:--config-check ./policy --check-namespaces user。仓库中的 examples/ignore-policies/basic.rego 与 examples/ignore-policies/advanced.rego 提供了可直接参考的 Rego 片段。
文件过滤与跳过选项
| 选项 | 默认值 | 说明 |
|---|---|---|
--skip-files strings | 无 | 按文件名或 glob 模式跳过文件(配置键scan.skip-files) |
--skip-dirs strings | 无 | 按目录或 glob 模式跳过目录(配置键scan.skip-dirs),例如排除vendor、.terraform等目录 |
--file-patterns strings | 无 | 指定需要匹配的配置文件模式,用于自定义"哪些文件算配置文件" |
--include-non-failures | false | 在输出中同时包含通过(无失败)的检查结果,仅配合 misconfig 扫描使用(配置键misconfiguration.include-non-failures) |
--severity strings(-s) | UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL | 要展示的问题级别,可按需缩小为HIGH,CRITICAL等 |
--ignorefile string | .trivyignore | 指定 ignore 文件(格式参考 docs/guide/configuration/filtering.md),可用于按 rule ID 忽略特定检查 |
--ignore-policy string | 无 | 指定用于评估每条漏洞/问题的 Rego 文件路径,实现细粒度豁免策略 |
--skip-version-check | false | 抑制版本更新提示与 Trivy 公告 |
--disable-telemetry | false | 禁止向 Aqua 发送匿名使用数据 |
从 pkg/commands/app.go#L689-L697 可以看出:trivy config在完整 ScanFlagGroup 中只启用了上述--skip-dirs、--skip-files、--file-patterns、--skip-version-check、--disable-telemetry,其余通用扫描标志被有意关闭。
报告与输出选项
| 选项 | 默认值 | 说明 |
|---|---|---|
--format string(-f) | table | 输出格式。允许值:table、json、template、sarif、cyclonedx、spdx、spdx-json、github、cosign-vuln |
--report string | all | 合规报告输出形式,允许值all或summary。源码注释表明未来计划支持非合规报告的 summary 模式 |
--template string(-t) | 无 | 自定义模板(模板文件路径必须以.tpl结尾),需与--format template搭配。仓库内建模板示例见 contrib/html.tpl、contrib/junit.tpl、contrib/sarif.tpl 等 |
--table-mode strings | summary,detailed | 实验性选项:控制table格式中显示哪些表格,允许值summary、detailed。注意源码中若与--format table之外的格式混用会直接报错 |
--output string(-o) | 无 | 将结果写入文件而非 stdout |
--output-plugin-arg string | 无 | 实验性:传给输出插件的参数 |
--exit-code int | 0 | 当发现安全问题且其严重度命中--severity过滤时,进程退出码设为该值(CI 中断门使用) |
--compliance string | 无 | 生成指定合规报告的扫描结果,例如--compliance=cis-v1.5之类内置规范,或@/path/to/spec.yaml自定义规范;更多见 docs/guide/compliance/compliance.md |
关于模板的取舍,源码 pkg/flag/report_flags.go#L220-L236 内置了校验逻辑:当指定--template但格式不是template时打印告警并忽略模板;反之若--format template而未指定模板同样告警。
缓存相关选项
trivy config的命令级默认缓存后端被改为memory(见 pkg/commands/app.go#L706-L707),因此在单次调用中默认不做磁盘缓存。
| 选项 | 默认值 | 说明 |
|---|---|---|
--cache-backend string | memory(该命令级覆盖) | 实验性:缓存后端。例如redis://localhost:6379。注意通用 flag 定义默认值在 pkg/flag/cache_flags.go#L25-L30 中为fs,此处被 config 命令覆盖为memory |
--cache-ttl duration | 无 | 使用 Redis 作为缓存后端时的缓存 TTL |
--redis-tls | false | 使用 Redis 缓存后端时启用 TLS(基于公共证书) |
--redis-ca string | 无 | Redis CA 证书文件路径 |
--redis-cert string | 无 | Redis 客户端证书文件路径 |
--redis-key string | 无 | Redis 客户端私钥文件路径 |
模块与凭据选项
| 选项 | 说明 |
|---|---|
--enable-modules strings | 实验性:启用的 WASM 模块名(需要扫描逻辑扩展时使用,插件体系参见 docs/guide/advanced/modules.md) |
--module-dir string | WASM 模块目录,默认$HOME/.trivy/modules |
--registry-token string | 私有镜像仓库访问令牌(当目标配置引用私有仓库资源时使用) |
--username strings | 用户名,支持逗号分隔多个(安全起见生产环境建议用环境变量替代) |
--password strings | 密码,支持逗号分隔多个;文档明确提示出于安全考虑应使用TRIVY_PASSWORD环境变量 |
--password-stdin | 从标准输入读取密码(不支持逗号分隔多个密码) |
-h, --help | 显示 config 子命令帮助 |
从父命令继承的全局选项
这些选项对所有 Trivy 子命令通用,定义于 pkg/flag/global_flags.go:
| 选项 | 默认值 | 说明 |
|---|---|---|
-c, --config string | trivy.yaml | 指定配置文件路径 |
--generate-default-config | false | 将默认配置写入当前目录的trivy-default.yaml |
-d, --debug | false | 开启调试模式 |
-q, --quiet | false | 抑制进度条与日志输出 |
--timeout duration | 5m0s | 整体超时时间 |
--cache-dir string | /path/to/cache | 缓存目录(示例占位路径,实际随平台而定) |
--cacert string | 无 | PEM 格式 CA 证书路径 |
--insecure | false | 允许不安全的服务器连接 |
-v, --version | false | 显示版本 |
典型用法示例
# 扫描当前目录下的 IaC/配置文件(Dockerfile、Terraform、K8s YAML 等自动识别) trivy config . # 只扫描指定类型的配置并只输出高危及以上 trivy config --misconfig-scanners terraform,kubernetes \ --severity HIGH,CRITICAL . # 以 JSON 输出并写入文件,供后续程序消费 trivy config --format json --output result.json ./infra # 在 CI 中作为质量门禁:发现问题即以退出码 1 结束 trivy config --exit-code 1 --severity HIGH,CRITICAL ./deploy # 渲染 Helm Chart 前先用自定义 values 试扫 trivy config --helm-values values-prod.yaml --helm-kube-version 1.28.0 ./chart # 加载自定义 Rego 检查与数据 trivy config --config-check ./policy --config-data ./data --check-namespaces user . # 跳过自动拉取 checks bundle(离线环境) trivy config --skip-check-update .一次性扫描时,trivy config .默认不落盘缓存(--cache-backend memory);若在 CI 中反复扫描同一目录并希望加速,可显式改用磁盘/Redis 后端,例如--cache-backend redis://localhost:6379。
命令行选项与配置文件、环境变量的对应关系
trivy config的所有选项都可以沉淀到trivy.yaml(默认由-c指定)。源码中每个 flag 都带有ConfigName,例如:
--misconfig-scanners→misconfiguration.scanners--helm-set→misconfiguration.helm.set--tf-vars→misconfiguration.terraform.vars--cf-params→misconfiguration.cloudformation.params--config-check→rego.check--rego-error-limit→rego.error-limit--cache-backend→cache.backend--severity→severity--skip-dirs→scan.skip-dirs
参考 examples/trivy-conf/trivy.yaml 展示的写法,对应到 misconfig 场景的配置片段形如:
severity: - HIGH - CRITICAL exit-code: 1 misconfiguration: scanners: - terraform - kubernetes terraform: vars: - env.tfvars checks-bundle-repository: mirror.gcr.io/aquasecurity/trivy-checks:2 scan: skip-dirs: - .terraform rego: check: - policy namespaces: - user此外,用户名/密码等敏感参数建议通过TRIVY_*环境变量注入(例如TRIVY_PASSWORD),避免在命令行与 CI 日志中明文泄露。通用配置机制的更多细节见 docs/guide/configuration/index.md。
背后执行流程:从命令到扫描
trivy config在源码层是一个"精简配置器 + 复用通用管线"的实现,理解它有助于预测命令行为:
- 组装 flag 组:
NewConfigCommand仅组合全局、缓存、Misconf、Module、Registry、Rego、报告与(裁剪后的)扫描 flag 组,并将缓存后端默认值覆盖为memory(pkg/commands/app.go#L688-L722); - 裁剪报告选项:禁用与本命令无关的
--dependency-tree、--list-all-pkgs、--exit-on-eol、--show-suppressed(pkg/commands/app.go#L699-L704); - 绑定与转换:通过
configFlags.Bind(cmd)绑定 Cobra 标志,再由ToOptions汇总为统一的Options; - 锁定扫描目标:
RunE中把 OS 与语言分析器全部加入DisabledAnalyzers,把Scanners固定为MisconfigScanner(pkg/commands/app.go#L744-L748); - 进入通用文件系统扫描:以
TargetFilesystem调用artifact.Run,复用与trivy fs相同的分析、检测与报告流水线。
因此trivy config的结果结构与trivy fs --scanners misconfig一致,可无缝对接 SARIF、JUnit 等下游工具(模板见 contrib)。
与其他子命令及配套文档的关系
- 本命令的父命令为 trivy(Unified security scanner);
- 错误配置扫描的整体概念与检查规则见 docs/guide/scanner/misconfiguration/index.md;
- 各配置类型(Dockerfile、Kubernetes、Terraform、CloudFormation、Helm、Ansible、Azure ARM 等)的检测细节见 docs/guide/scanner/misconfiguration/config/config.md;
- 自定义 Rego 策略开发参见 docs/guide/scanner/misconfiguration/custom 与教程 docs/tutorials/misconfiguration/custom-checks.md;
- 若同时需要扫描漏洞与密钥,应改用
trivy fs/trivy repo并配合--scanners vuln,secret,misconfig。
小结
trivy config提供了一条聚焦 IaC 与配置文件的扫描路径:一条命令即可覆盖 Dockerfile、Terraform、CloudFormation、Kubernetes、Helm、Ansible、Azure ARM 等主流声明式配置,支持通过 Helm values/tfvars/CF 参数/Ansible 变量注入真实渲染上下文,并允许以 Rego 自定义规则与 JSON schema 扩展检测能力。结合--exit-code、--severity、--format sarif/json等选项,它可直接作为 IaC 上线前的自动化质量门禁;而其"禁用无关分析器、固定 misconfig 扫描器"的实现细节,也决定了它能保持输出聚焦、语义清晰的特点。
【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考