一个面向 Trivy 的 GitLab CI 组件——Trivy 是一款全功能安全扫描器,涵盖容器镜像、文件系统、仓库、Kubernetes 集群、SBOM 以及许可证合规性。将这些模板直接插入你的流水线,即可获得可重复的扫描、GitLab 原生报告以及便携式工件,几乎无需编写 Shell 脚本。
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
stages:
- test
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
inputs:
job_name: "security:remote"
TRIVY_SCAN_REMOTE_IMAGE: "registry.gitlab.com/group/app:latest"
severity: "CRITICAL,HIGH,MEDIUM"
exit_on_vulnerability: true
stages:
- test
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
inputs:
job_name: "security:local"
TRIVY_SCAN_LOCAL_IMAGES: "dist/"
TRIVY_SCANNERS: "vuln,secret"
exit_on_vulnerability: false
stages:
- test
以下每个模板都列出了组件规范中定义的可用输入及其默认值,随后是一个最小工作示例。
templates/main.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/main@latest
inputs:
job_name: "trivy:basic"
TRIVY_SCAN_REMOTE_IMAGE: "nginx:latest"
templates/target_container.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_container@latest
inputs:
job_name: "trivy:containers"
TRIVY_SCAN_REMOTE_IMAGE: "registry.gitlab.com/group/service:latest"
TRIVY_SCANNERS: "vuln,secret"
exit_on_vulnerability: true
templates/target_filesystem.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_filesystem@latest
inputs:
TRIVY_FS_PATH: "services/api"
TRIVY_SCANNERS: "vuln,misconfig,secret"
templates/target_rootfs.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_rootfs@latest
inputs:
TRIVY_ROOTFS_PATH: "/mnt/root"
TRIVY_SCANNERS: "vuln"
templates/target_repository.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_repository@latest
inputs:
TRIVY_REPO_TARGET: "https://github.com/aquasecurity/trivy"
TRIVY_REPO_BRANCH: "main"
templates/target_vm.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_vm@latest
inputs:
TRIVY_VM_TARGET: "ami-0123456789abcdef0"
TRIVY_AWS_REGION: "us-east-1"
templates/target_kubernetes.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/target_kubernetes@latest
inputs:
TRIVY_K8S_OBJECT: "namespace/prod"
TRIVY_K8S_REPORT: "summary"
templates/scanner_iac_config.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/scanner_iac_config@latest
inputs:
TRIVY_CONFIG_PATH: "examples/iac/terraform"
severity: "CRITICAL,HIGH,MEDIUM"
templates/scanner_license.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/scanner_license@latest
inputs:
TRIVY_SCAN_LOCAL_IMAGES: "test.tar"
TRIVY_LICENSE_FULL: true
templates/sbom_generate_image.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_generate_image@latest
inputs:
TRIVY_SBOM_INPUT: "test.tar"
TRIVY_SBOM_FILENAME: "ci-image-sbom.cdx.json"
templates/sbom_generate_repo.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_generate_repo@latest
inputs:
TRIVY_REPO_TARGET: "."
TRIVY_SBOM_FORMAT: "spdx-json"
templates/sbom_generate_kbom.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_generate_kbom@latest
inputs:
TRIVY_K8S_TARGET: "namespace/default"
scan_kbom: true
templates/sbom_scan_file.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_scan_file@latest
inputs:
TRIVY_SBOM_PATH: "artifacts/trivy/ci-image-sbom.cdx.json"
TRIVY_SCANNERS: "vuln,license"
templates/sbom_scan_rekor.yml示例
include:
- component: $CI_SERVER_FQDN/niclas-zone/ci/trivy/sbom_scan_rekor@latest
inputs:
TRIVY_SCAN_REMOTE_IMAGE: "registry.gitlab.com/group/app@sha256:..."
TRIVY_REKOR_URL: "https://rekor.sigstore.dev"
| 输入 | 描述 | 默认值 |
|---|
job_name | CI 作业名称 | "trivy scanning" |
stage | 流水线阶段 | "test" |
image | 运行 Trivy 的容器镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_NEEDED_STAGE | 在 Trivy 运行前必须完成的阶段 | "build" |
TRIVY_SCAN_REMOTE_IMAGE | 要扫描的远程镜像 | "" |
TRIVY_SCAN_LOCAL_IMAGES | tar/OCI 输入的路径(为空时搜索 .) | "" |
TRIVY_SCANNERS | 逗号分隔的扫描器列表 | "vuln,secret,misconfig" |
severity | 包含的严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现问题时作业失败 | true |
TRIVY_EXTRA_ARGS | 额外的 CLI 参数 | "" |
allow_failure | 允许作业失败而不导致流水线失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | CI 作业名称 | "trivy:scan:containers" |
stage | 流水线阶段 | "test" |
image | Trivy 容器镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SCAN_REMOTE_IMAGE | 远程镜像引用 | "" |
TRIVY_SCAN_LOCAL_IMAGES | 本地扫描的目录/tar | "" |
TRIVY_SCANNERS | 已启用的扫描器 | "vuln,secret,misconfig" |
TRIVY_IMAGE_SRC | 镜像源后端(remote/docker/...) | "" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 严重级别匹配时失败 | true |
TRIVY_IGNORE_UNFIXED | 忽略无修复的问题 | true |
TRIVY_PKG_TYPES | 包类型 | "os,library" |
TRIVY_VULN_TYPE | 已弃用的包类型别名 | "" |
TRIVY_TIMEOUT | 命令超时 | "10m" |
TRIVY_EXTRA_ARGS | 额外的 CLI 参数 | "" |
TRIVY_DB_REPOSITORY | 自定义数据库镜像 | "" |
TRIVY_JAVA_DB_REPOSITORY | 自定义 Java 数据库镜像 | "" |
TRIVY_SKIP_FILES | 文件通配排除 | "" |
TRIVY_SKIP_DIRS | 目录排除 | "" |
allow_failure | 允许失败而不导致流水线失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | CI 作业名称 | "trivy:scan:filesystem" |
stage | 流水线阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_FS_PATH | 要扫描的文件或目录 | "." |
TRIVY_SCANNERS | 已启用的扫描器 | "vuln,secret" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 严重级别匹配时失败 | true |
TRIVY_IGNORE_UNFIXED | 忽略无修复的问题 | true |
TRIVY_PKG_TYPES | 包类型 | "os,library" |
TRIVY_TIMEOUT | 超时 | "10m" |
TRIVY_SKIP_FILES | 要跳过的文件通配 | "" |
TRIVY_SKIP_DIRS | 要跳过的目录 | "" |
TRIVY_EXTRA_ARGS | 额外的 CLI 参数 | "" |
TRIVY_REPORT_BASENAME | 工件基础名称 | "filesystem-scan" |
allow_failure | 允许作业失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:rootfs" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_ROOTFS_PATH | 根文件系统路径 | "/" |
TRIVY_SCANNERS | 扫描器 | "vuln,secret" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时作业失败 | true |
TRIVY_IGNORE_UNFIXED | 忽略无修复 | true |
TRIVY_PKG_TYPES | 包类型 | "os,library" |
TRIVY_TIMEOUT | 超时 | "10m" |
TRIVY_SKIP_FILES | 要跳过的文件 | "" |
TRIVY_SKIP_DIRS | 要跳过的目录 | "" |
TRIVY_EXTRA_ARGS | 额外参数 | "" |
TRIVY_REPORT_BASENAME | 工件基础名称 | "rootfs-scan" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:repo" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_REPO_TARGET | 本地路径或 Git URL | "." |
TRIVY_REPO_BRANCH | 远程分支 | "" |
TRIVY_REPO_COMMIT | 提交哈希 | "" |
TRIVY_REPO_TAG | 标签名 | "" |
TRIVY_SCANNERS | 扫描器 | "vuln,secret" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时作业失败 | true |
TRIVY_IGNORE_UNFIXED | 忽略无修复 | true |
TRIVY_TIMEOUT | 超时 | "10m" |
TRIVY_SKIP_FILES | 要跳过的文件 | "" |
TRIVY_SKIP_DIRS | 要跳过的目录 | "" |
TRIVY_EXTRA_ARGS | 额外参数 | "" |
TRIVY_REPORT_BASENAME | 工件基础名称 | "repo-scan" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:vm" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_VM_TARGET | 本地路径或 ami:/ebs: 标识符 | "" |
TRIVY_AWS_REGION | AMI/EBS 扫描的 AWS 区域 | "" |
TRIVY_SCANNERS | 扫描器 | "vuln" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时作业失败 | true |
TRIVY_IGNORE_UNFIXED | 忽略无修复 | true |
TRIVY_TIMEOUT | 超时 | "20m" |
TRIVY_EXTRA_ARGS | 额外参数 | "" |
TRIVY_REPORT_BASENAME | 工件基础名称 | "vm-scan" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:k8s" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_K8S_OBJECT | 作用域(cluster、namespace/foo 等) | "" |
TRIVY_K8S_REPORT | 报告详细程度(summary/all) | "summary" |
TRIVY_K8S_KUBECONFIG | 自定义 kubeconfig 路径 | "" |
TRIVY_K8S_INCLUDE_NAMESPACES | 要包含的命名空间 | "" |
TRIVY_K8S_EXCLUDE_NAMESPACES | 要排除的命名空间 | "" |
TRIVY_K8S_INCLUDE_KINDS | 要包含的资源类型 | "" |
TRIVY_K8S_EXCLUDE_KINDS | 要排除的资源类型 | "" |
TRIVY_K8S_SKIP_IMAGES | 跳过工作负载镜像扫描 | false |
TRIVY_K8S_DISABLE_NODE_COLLECTOR | 禁用节点收集器 | false |
TRIVY_SCANNERS | 扫描器 | "vuln,misconfig,secret" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时作业失败 | true |
TRIVY_IGNORE_UNFIXED | 忽略无修复 | true |
TRIVY_TIMEOUT | 超时 | "15m" |
TRIVY_K8S_EXTRA_ARGS | 额外参数 | "" |
TRIVY_REPORT_BASENAME | 工件基础名称 | "k8s-scan" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:iac" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_CONFIG_PATH | IaC 目录 | "." |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时失败 | true |
TRIVY_CONFIG_REPORT | 报告详细程度 | "all" |
TRIVY_CONFIG_INCLUDE_NON_FAILURES | 包含通过项 | false |
TRIVY_MISCONFIG_SCANNERS | 错误配置扫描器列表 | "azure-arm,cloudformation,dockerfile,helm,kubernetes,terraform" |
TRIVY_TIMEOUT | 超时 | "10m" |
TRIVY_SKIP_FILES | 要跳过的文件 | "" |
TRIVY_SKIP_DIRS | 要跳过的目录 | "" |
TRIVY_CONFIG_EXTRA_ARGS | 额外参数 | "" |
TRIVY_REPORT_BASENAME | 工件基础名称 | "iac-scan" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:license" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SCAN_REMOTE_IMAGE | 远程镜像引用 | "" |
TRIVY_SCAN_LOCAL_IMAGES | 本地 tar/OCI 或文件系统路径 | "" |
TRIVY_SCANNERS | 扫描器列表 | "license" |
severity | 严重级别 | "CRITICAL" |
exit_on_vulnerability | 严重级别匹配时失败 | true |
TRIVY_LICENSE_FULL | 启用 --license-full | false |
TRIVY_LICENSE_CONFIDENCE | 置信度阈值 | "0.9" |
TRIVY_LICENSE_IGNORED | 要忽略的许可证 | "" |
TRIVY_PKG_TYPES | 包类型 | "os,library" |
TRIVY_TIMEOUT | 超时 | "10m" |
TRIVY_EXTRA_ARGS | 额外参数 | "" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:sbom:image" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SBOM_IMAGE | 远程镜像引用 | "" |
TRIVY_SBOM_INPUT | 本地 OCI/tar 输入 | "" |
TRIVY_SBOM_FORMAT | SBOM 格式 | "cyclonedx" |
TRIVY_SBOM_FILENAME | 输出文件名 | "image-sbom.cdx.json" |
TRIVY_SBOM_EXTRA_ARGS | 额外参数 | "" |
TRIVY_TIMEOUT | 超时 | "10m" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:sbom:repo" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_REPO_TARGET | 路径或远程 Git URL | "." |
TRIVY_REPO_BRANCH | 分支 | "" |
TRIVY_REPO_COMMIT | 提交哈希 | "" |
TRIVY_REPO_TAG | 标签 | "" |
TRIVY_SBOM_FORMAT | 格式 | "cyclonedx" |
TRIVY_SBOM_FILENAME | 输出文件名 | "repo-sbom.cdx.json" |
TRIVY_REPO_SCANNERS | SBOM 创建期间的扫描器 | "vuln,secret" |
TRIVY_REPO_EXTRA_ARGS | 额外参数 | "" |
TRIVY_TIMEOUT | 超时 | "10m" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:sbom:kbom" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_K8S_TARGET | trivy k8s 目标(cluster、namespace/...) | "cluster" |
TRIVY_K8S_CONTEXT | Kubeconfig 上下文 | "" |
TRIVY_K8S_EXTRA_ARGS | 额外参数 | "" |
TRIVY_SBOM_FILENAME | KBOM 文件名 | "kbom.cdx.json" |
TRIVY_TIMEOUT | 超时 | "15m" |
scan_kbom | 对生成的 KBOM 运行漏洞扫描 | true |
TRIVY_SBOM_SCANNERS | KBOM 扫描的扫描器 | "vuln" |
severity | KBOM 扫描的严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时失败 | true |
TRIVY_SBOM_SCAN_EXTRA_ARGS | KBOM 扫描的额外参数 | "" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:sbom" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SBOM_PATH | SBOM 文件路径 | "artifacts/trivy/image-sbom.cdx.json" |
TRIVY_SBOM_REPORT_BASENAME | 输出基础名称 | "sbom-scan" |
TRIVY_SCANNERS | 要运行的扫描器 | "vuln,license" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时失败 | true |
TRIVY_SBOM_SCAN_EXTRA_ARGS | 额外参数 | "" |
TRIVY_TIMEOUT | 超时 | "10m" |
allow_failure | 允许失败 | false |
| 输入 | 描述 | 默认值 |
|---|
job_name | 作业名称 | "trivy:scan:rekor" |
stage | 阶段 | "test" |
image | Trivy 镜像 | "ghcr.io/aquasecurity/trivy:0.68.1" |
TRIVY_SCAN_REMOTE_IMAGE | 已证明的远程镜像 | "" |
TRIVY_REKOR_URL | Rekor API 端点 | "" |
TRIVY_SCANNERS | 扫描器 | "vuln" |
severity | 严重级别 | "CRITICAL,HIGH" |
exit_on_vulnerability | 发现结果时失败 | true |
TRIVY_IGNORE_UNFIXED | 忽略无修复 | true |
TRIVY_TIMEOUT | 超时 | "10m" |
TRIVY_EXTRA_ARGS | 额外参数 | "" |
allow_failure | 允许失败 | false |