
如何在 Dockerfile 中嵌入 Trivy 在构建时扫描 rootfs 并设置构建失败门禁【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy如果你希望在docker build阶段就完成镜像安全扫描而不是等镜像推送后再用trivy image检查Trivy 提供了把扫描直接嵌入 Dockerfile 的方式在构建过程中运行trivy rootfs扫描当前构建阶段解开的根文件系统rootfs并通过--exit-code 1让构建在发现安全问题时失败从而形成构建门禁。这种方式同样可以用来替换目前使用 Aqua Microscanner 的 Dockerfile见 Embed in Dockerfile。准备条件一个已存在的 Dockerfile且能用docker build构建方式一要求基础镜像内能安装并使用curl文档示例以alpine:3.7为基础通过apk add curl安装构建机的 Docker 环境可以访问安装脚本下载地址或拉取aquasec/trivy镜像。trivy rootfs的命令形式是trivy rootfs [flags] ROOTDIR其中 ROOTDIR 是要扫描的已解开的文件系统路径见 trivy rootfs 命令参考。在 Dockerfile 场景下扫描的就是当前阶段正在构建的根文件系统/。方式一在 Dockerfile 中通过安装脚本嵌入 Trivy官方文档给出的完整示例如下基础镜像以alpine:3.7为例替换成你自己的基础镜像FROM alpine:3.7 RUN apk add curl \ curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin \ trivy rootfs --exit-code 1 --no-progress /说明-b /usr/local/bin是 install.sh 的 bindir 参数指定 trivy 二进制的安装目录不传时该脚本默认安装到./bin。脚本末尾还接受一个可选的版本 tag缺省时安装最新版trivy rootfs --exit-code 1 --no-progress /在构建阶段扫描根文件系统发现安全问题时以退出码 1 退出--no-progress抑制进度条输出trivy 进程以非零退出码结束时该RUN步骤失败docker build随之失败门禁即生效。文档也明确指出这是一种不安全的curl | sh用法并且这条安装命令会保留在目标镜像中。如果你的 Dockerfile 是多阶段构建可以用下面方式二替代。方式二多阶段构建中从官方镜像引入 Trivy可选多阶段构建方式避免了curl | sh且文档说明该方式下 the image is not changed最终镜像内容不被修改。文档示例其中[...]代表你的 Dockerfile 中已有的其他内容build需要替换为你自己的构建阶段名[...] # Run vulnerability scan on build image FROM build AS vulnscan COPY --fromaquasec/trivy:latest /usr/local/bin/trivy /usr/local/bin/trivy RUN trivy rootfs --exit-code 1 --no-progress / [...]这里通过COPY --fromaquasec/trivy:latest把官方 Trivy 镜像中的二进制复制到扫描阶段vulnscan再执行与方式一相同的trivy rootfs --exit-code 1 --no-progress /扫描。aquasec/trivy是 Trivy 官方 Docker 镜像见 安装说明。调整门禁的判定范围Trivy 默认即使检测到安全问题也以退出码 0 结束--exit-code选项用于在发现问题时返回非零退出码见 Exit Code 说明。--exit-code 1表示只要发现任一安全问题就返回 1。文档同时展示了用--severity控制门禁严格程度的写法例如trivy image --exit-code 0 --severity MEDIUM,HIGH ruby:2.4.0 trivy image --exit-code 1 --severity CRITICAL ruby:2.4.0即第二条命令下只有发现 CRITICAL 漏洞时扫描才会以非零码失败。--severity与--exit-code均为trivy rootfs支持的参数组合到 Dockerfile 中即为RUN trivy rootfs --exit-code 1 --severity CRITICAL --no-progress /另外两个与门禁相关的可选参数--exit-on-eol当操作系统到达 end of service/lifeEOL时以指定退出码结束。官方文档列出的可用目标中包含 Root filesystemtrivy rootfs适合扫描较老基础镜像时补充 EOL 判定--scannerstrivy rootfs默认为[vuln,secret]即默认同时扫描漏洞与密钥泄露。如果你的门禁只关心漏洞可以按需显式指定。漏洞过滤按 Finding ID 的.trivyignore、--ignore-unfixed、Rego 策略等参见 Filtering可按需在trivy rootfs命令上加相应参数。验证构建门禁在 Dockerfile 所在目录执行构建文档示例命令镜像名替换为你自己的$ docker build -t vulnerable-image .判断方式若当前构建阶段的根文件系统存在所选 severity 范围内的安全问题trivy 按--exit-code 1返回非零退出码RUN步骤报错docker build构建失败说明门禁生效若未发现问题扫描正常输出汇总后构建继续完成。以下是 Exit Code 说明中trivy image --exit-code 1 python:3.4-alpine3.9的文档示例输出trivy image模式的表格样式rootfs 模式输出结构类似用于说明发现问题时的输出形态python:3.4-alpine3.9 (alpine 3.9.2) Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0) ------------------------------------------------------------------------------------------------------- | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE | ------------------------------------------------------------------------------------------------------- | openssl | CVE-2019-1543 | MEDIUM | 1.1.1a-r1 | 1.1.1b-r1 | openssl: ChaCha20-Poly1305 | | | | | | | with long nonces | -------------------------------------------------------------------------------------------------------以上为文档示例结果具体漏洞项与数量取决于你扫描的镜像内容不要将其当作固定预期。限制与适用边界方式一的curl | sh安装链路不经过签名校验流程以外的额外保证且安装步骤会保留在镜像中对安全性有要求时优先使用方式二的多阶段构建门禁扫描发生在构建阶段trivy rootfs扫描的是当前阶段解开的根文件系统无法覆盖后续阶段新增的层如果最终镜像由多个阶段叠加应在接近最终的阶段设置扫描步骤使用install.sh时可传入发布版本 tag 固定版本不传则始终安装最新版。【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考