Trivy 安装与部署
安装与部署
Trivy 没有运行时依赖,不挑操作系统,Linux、macOS、Windows 都有官方包。下面按「本地开发机 → CI → 离线内网」三条路径给出装法。
- macOS 用 Homebrew,装完直接可用:
brew install trivy trivy --version - Debian / Ubuntu 用 apt 源,需要先加 Aqua 的仓库与 GPG key:
sudo apt-get install -y wget gnupg wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee /etc/apt/sources.list.d/trivy.list sudo apt-get update && sudo apt-get install -y trivy - 不装任何东西,直接用官方镜像,这条在 CI 里最省事。注意要挂载 Docker socket 才能扫本地镜像,或者让它直接去 registry 拉:
docker run --rm aquasec/trivy:latest image nginx:latest docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image my-app:ci - 通用二进制安装,适合无法加包源的环境。从 GitHub Release 下载对应平台压缩包,解压后把二进制丢进
/usr/local/bin;具体版本号以官方 Release 页面为准。tar -xzf trivy_*_Linux-64bit.tar.gz sudo mv trivy /usr/local/bin/ trivy --version - 离线内网部署。默认情况下 Trivy 每次都会检查漏洞库更新,内网出不去就会失败。三种应对方式:跳过更新、把库放到自己托管的 OCI registry、把库文件预先拷进缓存目录。
# 方式一:完全跳过库更新(需自行保证本地库是新的) trivy image --skip-db-update my-app:ci # 方式二:指向内网自建的 OCI registry(推荐,能持续更新) trivy image --db-repository registry.internal/trivy/trivy-db:2 \ --java-db-repository registry.internal/trivy/trivy-java-db:1 \ my-app:ci # 方式三:私有 registry 用 HTTP 或自签证书时 export TRIVY_NON_SSL=true trivy image --insecure-registry registry.internal:5000 my-app:ci # 自定义缓存目录(CI 里用来做缓存复用,避免每次重下) trivy image --cache-dir /ci-cache/trivy my-app:ci
把库同步到内网的标准做法是在一台能出网的机器上跑一次 trivy image --download-db-only 与 --download-java-db-only,把缓存目录打包带走;或者用 trivy plugin / ORAS 之类的工具把 trivy-db 镜像同步进内网 registry。具体同步命令以官方文档为准。
CI 集成模板
GitHub Actions 有官方 action,最省事,它会自己处理库缓存:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'my-registry/my-app:ci'
format: 'table'
severity: 'CRITICAL,HIGH'
exit-code: '1'
ignore-unfixed: true
GitLab CI 直接用镜像,把缓存目录挂在 .trivy-cache 上,跑一次后后续 job 就不用重复下载漏洞库:
trivy-scan:
image:
name: aquasec/trivy:latest
entrypoint: [""]
cache:
key: trivy-db
paths:
- .trivy-cache/
script:
- trivy image --cache-dir .trivy-cache
--severity HIGH,CRITICAL --ignore-unfixed
--exit-code 1 --format table "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
常见报错与排查
| 现象 | 原因 | 处理 |
|---|---|---|
failed to download vulnerability DB | 出不了网,或走了代理但 Trivy 不认 | 设置 HTTPS_PROXY / HTTP_PROXY 环境变量;或改用 --skip-db-update + 自建库 |
no such host | DNS 解析不到 ghcr.io / registry 域名 | 检查 runner 的 DNS 与 hosts;内网改用 --db-repository 指向可达地址 |
| 第一次扫描特别慢 | 要下 trivy-db 与 trivy-java-db,JavaDB 体积尤其大 | 在镜像里预置缓存目录,或 CI 里做 cache |
TOOMANYREQUESTS | 拉 Docker Hub 镜像触发匿名限流 | 配置 DOCKER_CONFIG 用已登录的凭据,或改用自建 registry |
| 私有 registry 报 TLS 错误 | 自签证书不在信任链里 | --insecure-registry 放行该地址(仅限内网可控环境) |
| 扫出来的 OS 漏洞全是 unfixed | 基础镜像用的发行版已 EOL,上游不再发补丁 | 换受支持的基础镜像,或换更小的发行版 |
