核心是将加固动作嵌入构建流程,围绕“可信源码→可信构建→可信镜像”闭环展开:选用带完整digest的认证基线镜像,多阶段构建裁剪内容并强制非root运行,构建时嵌入自动扫描与策略拦截,失败即中断,并固化oci标签、只读文件系统等不可变安全属性。

核心是把加固动作嵌入构建流程本身,而不是等镜像生成后再扫描修补。整个过程围绕“可信源码→可信构建→可信镜像”闭环展开,重点在构建阶段固化安全约束、裁剪攻击面、注入合规元数据。
用可信基线启动构建链路
不从 ubuntu:latest 或 python:slim 这类无签名、无版本锁定的镜像起步。改用国家药监局、信通院或 CNCF 认证的基线镜像,例如:
- registry.med.gov.cn/ai-base/python3.9-cuda11.8-med-v2.1.0@sha256:8a3fe1c2
- gcr.io/distroless/static:nonroot(无 shell、无包管理器)
- quay.io/redhat/ubi8-minimal:8.10(企业级签名+定期 CVE 修复)
所有基础镜像必须带完整 digest(如 @sha256:...),禁用 latest 标签,确保每次构建可复现、可验证。
多阶段构建中完成内容裁剪与权限固化
构建阶段只保留编译所需工具,运行阶段仅含二进制、必要证书和配置文件,并强制非 root 运行:
- 第一阶段用 golang:1.22-builder 编译,不安装 git、curl、bash 等调试工具
- 第二阶段基于 distroless 或 alpine,RUN rm -rf /var/cache/apk/* /tmp/*
- 显式创建低权限用户:RUN groupadd -g 1001 appgroup && useradd -r -u 1001 -g appgroup appuser
- 结尾固定声明:USER appuser:appgroup 和 WORKDIR /home/appuser
在构建脚本中嵌入自动扫描与策略拦截
把安全检查变成构建的必经关卡,失败即中断,不生成镜像:
- 用 trivy image --severity CRITICAL,HIGH --format json 扫描当前构建上下文或中间镜像
- 解析输出,若发现 /etc/shadow、暴露 22 端口、含 root 用户 或已知高危 CVE(如 openssl
- 对 Alpine 镜像,用 apk add --no-cache openssl=1.2.2-r0 锁定修复版本;对 Debian,用 apt install -y --allow-downgrades libssl1.1=1.1.1w-0+deb11u1
注入不可变标识与运行时约束
所有安全属性应在构建时写死,避免依赖部署配置补救:
- Dockerfile 中声明标准 OCI 标签:LABEL org.opencontainers.image.created="2026-05-11T05:48:00Z"、org.opencontainers.image.revision="$(git rev-parse --short HEAD)"
- 清除敏感 LABEL:git.commit、build.user 替换为 SHA256 哈希值
- 固化运行参数:STOPSIGNAL SIGTERM、HEALTHCHECK、READONLY=true(通过 buildx 构建时加 --read-only)
- 移除构建历史:docker buildx build --squash 或用 umoci repack 手动重打包,剔除 layer 注释与冗余元数据











