公司新项目用 ref="/tag/2019/" style="color:#EB6E00;font-weight:bold;">Docker 快速部署,本地跑得飞起,一上测试环境就报 SSL 证书校验失败、端口被拒绝,查半天发现基础镜像里 OpenSSL 版本太老,早就被爆出 CVE-2023-38545 了。这不是个例——很多团队把 FROM ubuntu:22.04 当成默认保险箱,其实它可能自带过期的 libcurl、带硬编码密钥的旧版 busybox,甚至预装了已被弃用的 Python 2.7。
镜像不是‘拿来即用’,得先过安检
就像你不会直接扫个陌生二维码就输密码,拉下来的 Docker 镜像也该扫一扫。官方镜像(比如 nginx:alpine)相对干净,但第三方镜像、自己构建后推到私有仓库的镜像,很可能悄悄混进了高危组件。常见风险包括:已知 CVE 漏洞、过期的系统包、硬编码密码、敏感文件残留(/etc/shadow 被 COPY 进去?)、不合规许可证(比如 GPL 组件混进闭源服务)。
三招快速上手扫描
1. 本地构建时顺手扫
用 Trivy 最省事,Mac/Linux 直接:
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.45.0
trivy image --severity HIGH,CRITICAL nginx:1.25-alpine它会立刻列出所有高危和严重漏洞,连影响路径都标清楚,比如:openssl 3.0.2 → CVE-2022-3602 (CVSS 9.8)。2. CI 流水线里加一道卡口
GitLab CI 或 GitHub Actions 里加一步,构建完镜像立即扫描,超阈值就中断发布:
- name: Scan Docker image
run: |
trivy image --exit-code 1 --severity CRITICAL myapp:latest这样哪怕开发本地忘了扫,流水线也会拦住带严重漏洞的镜像。3. 私有仓库自动守门
用 Harbor 搭私有 Registry?它原生集成 Trivy 扫描器。上传镜像后自动触发扫描,结果直接挂在 Web 界面,点开就能看漏洞详情、修复建议,连 apt upgrade openssl 该升级到哪个版本都写好了。
别只盯着“有没有漏洞”,更要看“怎么修”
扫出来一堆 CVE 别慌。比如 debian:bookworm-slim 报 glibc 2.36-9+deb12u1 有 CVE-2023-4911,其实 Debian 官方已通过 patch 修复,只是没升小版本号——这时候比照 Debian Security Tracker 确认状态,比盲目换基础镜像更靠谱。真正要警惕的是那些多年不更新的镜像,比如某款小众数据库的 latest 标签,实际构建时间停留在 2021 年。
安全不是加个扫描工具就万事大吉,而是让扫描变成和写单元测试一样自然的动作。下次 docker build 完,顺手敲一行 trivy image your-app:dev,花不了十秒,却可能避开一次线上紧急回滚。