一、简单介绍与使用
Trivy是一个用于扫描容器镜像安全漏洞的工具。通过`trivy -h`查看帮助,可以对远端或本地镜像进行安全扫描。
1.docker ps --启动镜像,我这里是本地的
2.docker exec -it <n8n--这里可以换成镜像的name或者ID> sh --进入镜像包内,此处不需要哈,如果你想看可以执行一下,输入exit退出
3.docker pull aquasec/trivy:latest --拉取最新的Trivy
4.docker run --rm aquasec/trivy:latest image n8nio/n8n:latest --扫描命令,必要的时候可以输出一下文件json格式。这里可能要科学上网
二、Report查看
有lib库| 对应漏洞编号 |严重登记 |状态| 当前安装版本| 修复版本| 可以查看漏洞的标题、Go 语言标准库(crypto/x509、os/syscall、net/http)
三、上述结果解读
一、Node.js(node-pkg)漏洞分析 1. 概览 共发现 3 个 LOW 级漏洞,均属于 brace-expansion 包的正则表达式拒绝服务(ReDoS)风险。
二、Go 二进制文件(task-runner-launcher)漏洞分析 1. 概览 共发现 3 个漏洞,严重程度分布:MEDIUM(中风险): 2 个 HIGH(高风险): 1 个 漏洞涉及 Go 标准库(stdlib)和系统调用(os/syscall)。
四、项目应用
如果是项目路径:私有的需要认证username password
docker run \
--rm \
-v C:/Users/xxx/.cache/trivy:/root/.cache/trivy \
-v C:/Users/xxx/reports:/output \
aquasec/trivy:latest \
image \
--username xxx \
--password "xxx" \
--scanners vuln \
--skip-dirs "/.git" \
--skip-dirs "/node_modules" \
--skip-files "*.log" \
--skip-version-check \
-f template \
-t "@/contrib/html.tpl" \
-o /output/report.html \
--timeout 60m \
xxx/xxx:latest
逐部分注解
1. docker run
这是 Docker 用来运行容器的基础命令,用于从指定镜像创建并启动一个容器实例 。
2. --rm
- 作用:容器运行结束后(不管是正常完成扫描还是异常退出),自动删除该容器,避免在 Docker 里残留大量无用的已停止容器,节省磁盘空间和便于管理 。
- 场景:适合一次性的扫描任务,不需要保留容器后续调试等(若要调试可去掉,结合
docker logs
查日志 )。
3. -v C:/Users/xxx/.cache/trivy:/root/.cache/trivy
- 作用:将宿主机器(Windows)上的
C:/Users/xxx/.cache/trivy
目录,挂载到容器内的/root/.cache/trivy
目录 。 - 目的:让 Trivy 把漏洞数据库缓存、扫描中间缓存等文件存储在宿主机器指定位置,下次扫描时可以复用这些缓存(比如漏洞库不用每次重新下载 ),加快扫描速度;也方便在宿主机器查看缓存内容(如果需要调试缓存相关问题 )。
4. -v C:/Users/xxx/reports:/output
- 作用:把宿主机器的
C:/Users/xxx/reports
目录,挂载到容器内的/output
目录 。 - 目的:Trivy 生成的扫描报告(如
reportbackend.html
)会输出到容器内的/output
目录,通过挂载,就能在宿主机器的对应目录找到报告文件,方便查看和后续处理(比如上传到文件服务器、集成到 CI/CD 流水线的报告归档 )。
5. aquasec/trivy:latest
- 作用:指定要运行的 Docker 镜像,这里是 Trivy 的官方镜像,
latest
表示使用最新版本(实际生产环境建议锁定具体版本,避免版本更新带来的兼容性问题 )。
6. image
- 作用:Trivy 的子命令,告诉 Trivy 要执行的是镜像扫描任务(Trivy 还支持扫描文件系统、Git 仓库等,对应有
fs
、repo
等子命令 )。
7. --username xxx
和 --password "xxx"
- 作用:用于认证镜像仓库(比如
xxx/xxx:latest
所在的私有仓库,像 Azure Container Registry ),提供用户名和密码,让 Trivy 能拉取到要扫描的镜像 。 - 场景:如果镜像在私有仓库,必须提供正确的认证信息,否则 Trivy 无法访问镜像进行扫描 。
8. --scanners vuln
- 作用:指定 Trivy 启用的扫描器,这里只启用
vuln
(漏洞扫描器 ),会关闭秘钥扫描(secret
)、许可证扫描(license
等其他扫描器 )。 - 优势:大幅加快扫描速度,因为秘钥扫描需要遍历镜像内大量文件查找敏感信息(如密码、密钥 ),很耗时;如果业务场景不需要检测镜像内的秘钥等内容,只关注漏洞,就推荐用这个参数 。
9. --skip-dirs "/.git" --skip-dirs "/node_modules"
- 作用:指定要跳过扫描的目录,这里跳过
.git
目录(Git 版本控制相关文件,一般无漏洞风险 )和node_modules
目录(前端项目的依赖包目录,通常文件数量极多但漏洞检测价值低,且扫描这些目录会大幅增加耗时 )。 - 优势:减少 Trivy 需要扫描的文件数量,提升扫描效率,避免无意义的文件分析拖慢进度 。
10. --skip-files "*.log"
- 作用:指定要跳过扫描的文件,这里跳过所有后缀为
.log
的日志文件,日志文件一般记录运行时信息,很少包含漏洞相关内容,扫描它们浪费时间 。 - 效果:进一步精简扫描范围,加快整体扫描流程 。
11. --skip-version-check
- 作用:关闭 Trivy 自身的版本检查功能,Trivy 默认会在启动时检查是否有新版本,如果不需要这个提示(比如在自动化扫描流水线中,避免版本检查的网络请求和无关日志 ),就可以用这个参数 。
- 优势:节省一点网络请求时间,让扫描启动更快,也避免控制台输出版本检查的提示信息干扰日志 。
12. -f template
和 -t "@/contrib/html.tpl"
- 作用:
-f template
表示指定报告输出格式为模板化输出;-t "@/contrib/html.tpl"
指定使用 Trivy 内置的html.tpl
模板来生成 HTML 格式的报告 。 - 效果:生成美观、结构化的 HTML 报告,方便直观查看镜像内的漏洞等信息,适合人直接阅读;如果需要机器解析的格式(比如 JSON ),可以把
template
换成json
等其他格式 。
13. -o /output/report.html
- 作用:指定报告输出的文件路径和名称,结合前面的挂载目录,最终报告就会生成到宿主机器的
C:/Users/xxx/reports/report.html
文件中 。
14. --timeout 60m
- 作用:设置扫描的超时时间,这里是 60 分钟(
60m
),如果 Trivy 扫描镜像超过这个时间还没完成,就会终止扫描并报错 。 - 场景:防止因镜像异常复杂或网络等问题,导致扫描无限期挂起,影响后续流程(比如 CI/CD 流水线 );如果镜像确实很大、扫描耗时久,可以适当调大这个值,但也要结合实际资源和需求权衡 。
15. xxx/xxx:latest
- 作用:指定要扫描的 Docker 镜像名称和标签,Trivy 会基于前面的认证信息(
--username
/--password
)去拉取该镜像并进行扫描 。
整体流程梳理
- Docker 启动一个 Trivy 容器,挂载好缓存目录和报告输出目录 。
- Trivy 凭借提供的认证信息,拉取到私有仓库里的
xxx/xxx:latest
镜像 。 - 按照配置,只启用漏洞扫描器,跳过指定的目录(
.git
、node_modules
)和文件(.log
后缀 ),不检查 Trivy 自身版本 。 - 扫描完成后,用 HTML 模板生成报告,输出到挂载目录,供宿主机器查看 。
- 扫描超时时间设为 60 分钟,容器运行结束后自动删除 。