镜像安全基线需构建期硬阻断,即发现critical漏洞即终止构建;推荐trivy因其轻量、零配置及ci友好性;按环境分级阻断、分类策略豁免、排除误报;嵌入ci流水线,用--exit-code 1确保失败中断;输出json报告归档审计;配套选用安全基础镜像、非root用户、定期更新漏洞库。

建立镜像安全基线并实现构建期硬阻断,核心是把漏洞检测变成不可绕过的质量门禁。不是“提醒有漏洞”,而是“发现即终止”。Trivy 和 Clair 都能支撑,但 Trivy 因其轻量、零配置、高兼容性与强 CI 友好性,更适合作为默认落地工具。
明确基线标准:定义哪些漏洞必须阻断
安全基线不是越严越好,而是匹配业务风险等级。建议从以下维度收敛:
- 按严重等级分级阻断:生产环境至少对 CRITICAL 级别漏洞强制 exit-code=1;测试环境可放宽至 HIGH 或仅告警
- 按漏洞类型区分策略:OS 层漏洞(如 glibc、openssl)必须修复;语言层未修复漏洞(unfixed)可结合 --ignore-unfixed 临时豁免,但需登记原因
- 排除已知误报或不可利用项:通过 .trivyignore 文件统一管理例外 CVE,每条必须含注释说明(如“CVE-2023-12345:仅影响 Windows 平台,当前镜像为 Alpine Linux”)
嵌入构建流水线:让扫描成为构建必经步骤
硬阻断的关键在于执行时机和返回码控制。推荐在 Docker build 完成后、push 前立即扫描:
- 使用 --exit-code 1 参数确保漏洞触发非零退出码,CI 工具(如 GitHub Actions、GitLab CI)将自动中止后续步骤
- 命令示例:
trivy image --exit-code 1 --severity CRITICAL --ignore-unfixed myapp:dev - 若需同时检查多个级别(如 CRITICAL + HIGH),可用逗号分隔:
--severity CRITICAL,HIGH,但注意避免过度阻断影响交付节奏 - Clair 需先部署服务端(clairctl 或 clair v4 API),调用链更长,建议仅在已有 Clair 生态且需 SBOM 联动审计的场景选用
固化基线结果:生成可审计、可回溯的证据
阻断不是终点,报告才是治理依据:
- 始终用 --format json -o report.json 输出结构化结果,供安全平台采集或人工复核
- 报告中应包含镜像 digest、基础系统版本、漏洞组件名+当前版本+修复建议版本,便于快速定位升级点
- 建议将 report.json 与构建产物一同归档,保留至少 90 天,满足等保、ISO 27001 等合规审计要求
配套加固动作:让基线可持续生效
仅靠扫描无法根治问题,需联动镜像构建策略:
- 优先选用精简、更新活跃的基础镜像(如
debian:slim、alpine:latest),避免使用ubuntu:20.04等 EOL 版本 - Dockerfile 中显式指定非 root 用户(
USER 1001)并 drop 危险 capabilities(--cap-drop=ALL),降低漏洞利用成功率 - 定期运行
trivy image --download-db-only手动更新本地漏洞库,尤其在离线 CI 环境中保障数据时效性











