容器安全加固起点是镜像构建阶段:选用可信精简基础镜像(如alpine:3.19或distroless)、多阶段构建仅保留运行必需文件、默认非root用户运行、集成trivy自动扫描与cosign签名、敏感信息运行时注入。

容器运行环境的安全起点不在运行时,而在系统镜像本身。真正有效的加固不是靠加策略堵漏洞,而是从源头删掉攻击者能用的东西——90%以上的容器漏洞根本不出自业务代码,而是来自基础镜像里那些应用压根不用的包。
选对基础镜像,砍掉七成攻击面
通用镜像(如 full Ubuntu 或 CentOS)默认装了四五百个软件包,但一个典型 Web 服务通常只依赖二三十个。多出来的全是风险载体:bash、vim、curl、gcc、man 文档、各种调试工具……它们不被调用,却真实存在于文件系统中,一扫描就报漏洞。
- 优先选用 Alpine Linux(
alpine:3.19)或 Distroless 镜像(如gcr.io/distroless/static-debian12),体积小、组件少、更新快 - 避免使用
latest标签,固定版本号(如alpine:3.19),便于追踪补丁状态 - 官方镜像需验证签名(如 Docker Content Trust 或 Harbor Notary),禁用未经 GPG 签名的第三方镜像
构建阶段做减法,不止是删包
精简不是简单卸载几个命令,而是重构构建逻辑,让最终镜像只含运行时必需项。
- 采用多阶段构建:第一阶段用完整工具链编译,第二阶段仅 COPY 二进制文件到极简运行镜像中
- 安装软件后立即清理缓存:
RUN apk add --no-cache nginx && rm -rf /var/cache/apk/* - 禁止保留构建工具(如 gcc、make)、文档(
/usr/share/doc)、本地化语言包(locale) - 镜像层数控制在 5 层以内,合并 RUN 指令减少冗余层,提升可审计性
运行时身份与权限必须收敛
即使镜像干净,以 root 运行仍等于把钥匙交给攻击者。权限最小化是加固不可跳过的一步。
- 在 Dockerfile 中显式声明非 root 用户:
RUN adduser -u 1001 -D appuser+USER appuser - 禁止 setuid/setgid 文件:
RUN find /usr/bin -perm /6000 -delete 2>/dev/null - 挂载根文件系统为只读:
docker run --read-only,必要写入路径用--tmpfs或单独 volume - 禁用危险 capabilities:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE,按需授权而非默认开放
让加固可验证、可持续
加固不能只靠人工检查,得嵌入构建流水线,形成闭环证据链。
- 每次构建生成 SBOM(软件物料清单),用 Syft 或 Trivy 提取并存档
- 集成漏洞扫描(如 Trivy 或 Clair),CVSS ≥ 7.0 的漏洞自动阻断构建
- 记录构建来源:Git 提交哈希、CI 流水线 ID、基础镜像 digest,全部写入镜像 label
- 私有仓库启用强制签名与拉取时验证,确保上线镜像未被篡改











