手把手教你用Trivy做Docker镜像漏洞检测扫描
为什么你需要做 Docker 镜像漏洞检测扫描
很多开发者直接从 Docker Hub 拉取镜像就跑起来,
但镜像里可能藏着已知漏洞——比如操作系统包(Ubuntu、
Alpine)或应用依赖存在 CVE(通用漏洞披露)。定期做 Docker 镜像漏洞检测扫描,
是容器安全最基本的一步。 本文用最流行的开源扫描工具 Trivy 带你实操,
全程敲命令就能搞定。
准备工作:装好 Docker 和 Trivy
1. 确保 Docker 已安装
如果你还没装 Docker,先执行:
sudo apt update && sudo apt install docker.io -y # Ubuntu/Debian
sudo systemctl start docker
sudo systemctl enable docker
验证安装:docker --version 看到版本号即为成功。注意:
普通用户执行 docker 命令需要 sudo 或加入 docker 用户组(sudo usermod -aG docker $USER 后重新登录)。
2. 安装 Trivy
Trivy 官方提供一键安装脚本,推荐用以下命令(适用于 Linux 64 位):
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sudo sh -s -- -b /usr/local/bin
验证安装:trivy --version 输出类似 Version: 0.56.0。
如果网络慢,也可以从 GitHub Releases 手动下载二进制到 /usr/local/bin。
实操:拉取一个镜像并执行漏洞扫描
1. 拉取目标镜像
以常见的 nginx:latest 为例:
docker pull nginx:latest
2. 运行第一次扫描
Trivy 会下载漏洞数据库(首次约 1~2 分钟),然后扫描镜像:
trivy image nginx:latest
输出解读:你会看到类似这样的表格:
Total: 87 (UNKNOWN: 0, LOW: 53, MEDIUM: 23, HIGH: 10, CRITICAL: 1)
每一行包含软件包名称、当前版本、修复版本、漏洞编号(CVE)和严重等级。
重点关注 HIGH 和 CRITICAL 的漏洞。
3. 只输出高危漏洞(可选)
trivy image --severity HIGH,CRITICAL nginx:latest
4. 保存报告到文件
trivy image --format json -o scan-result.json nginx:latest
以后可以用 cat scan-result.json 查看详细列表。
避坑指南:新手最易翻车的 4 个地方
- 数据库更新失败:Trivy 首次会从 GitHub 下载漏洞库。如果服务器无法访问
ghcr.io,可以配置镜像加速或手动下载离线包。解决方案:执行trivy image --skip-db-update跳过自动更新,但前提是你已提前备好数据库。 - 扫描速度极慢:常见于大镜像(如 Python 开发镜像)。可以用
--scanners vuln只扫漏洞,不扫密钥和配置。 - 误报率:某些漏洞可能所在的包在实际运行中未被加载。Trivy 已经做了噪声过滤,但建议对结果人工复核。
- 权限问题:如果 Trivy 报告
permission denied,确认 docker 和 trivy 脚本是否用sudo执行。
效果验证:如何确认扫描是否靠谱
1. 对比已知漏洞数据库
从 NVD 或容器镜像官方公告(如 nginx 的 Release Notes)查找近期 CVE,看 Trivy 是否报出。
例如 2024 年 nginx 1.25.x 存在某个 DoS 漏洞,如果 Trivy 报告但你镜像更新到了 1.26.0(已修复),那说明扫描结果正确。
2. 修复后重新扫描
用 docker pull nginx:latest 更新到最新版,再次运行 trivy image nginx:latest,高危漏洞数量应大幅下降。
3. 集成到 CI/CD(进阶)
在 GitLab CI 中加一行 trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE,
一旦发现高危漏洞就直接阻断构建。
写在最后:Docker 镜像漏洞检测扫描不是一次性工作,建议每次拉取新镜像或更新基础镜像后都扫一遍。
Trivy 免费、轻量、社区活跃,足够日常使用。
如果你在扫描时遇到奇怪的报错,优先检查网络和权限,再对照本文的避坑部分排查。