Docker容器安全需从镜像构建、运行时配置和宿主机协同三层面加固:构建时用distroless或精简Alpine镜像、固定摘要、多阶段构建、删临时文件与工具、CVE扫描;运行时设非root用户、只读根文件系统、精确capability授权;生命周期需语义化版本、cosign签名验证、定期清理;宿主机启用SELinux/GRSEC、资源限制、自定义网络与防火墙协同防护。

Docker容器本身不自带安全防护能力,安全必须从镜像构建、运行时配置和宿主机协同三个层面主动加固。
构建可信基础镜像
默认的alpine或debian:slim虽小,但未经安全审计。应优先选用官方distroless镜像(如gcr.io/distroless/static),或基于Alpine Linux并启用apk --no-cache安装软件。禁止使用:latest标签,固定镜像摘要(@sha256:...)防止依赖漂移。
- 用Dockerfile多阶段构建,编译环境与运行环境分离,最终镜像只含二进制和必要配置
- 删除/tmp、/var/cache等临时文件,移除curl、bash等非必需工具,降低攻击面
- 使用trivy或grype对镜像做CVE扫描,CI中设阈值阻断高危漏洞镜像推送
运行时最小权限控制
容器默认以root用户运行,一旦逃逸即获得宿主机root权限。必须显式指定非特权用户,并禁用危险能力。
- 在Dockerfile中添加USER 1001:1001,配合RUN addgroup -g 1001 -f appgroup && adduser -S appuser -u 1001
- 启动容器时加参数:--read-only挂载根文件系统为只读,--tmpfs /tmp:rw,size=10m提供必要可写空间
- 用--cap-drop=ALL --cap-add=NET_BIND_SERVICE精确授权,禁用SYS_ADMIN、DAC_OVERRIDE等高危capability
镜像生命周期管理
镜像不是一次构建永久可用,需建立版本、签名、清理闭环机制。
- 按语义化版本(v1.2.3)打标签,避免:dev、:test等模糊标识
- 用cosign对镜像签名:cosign sign --key cosign.key myreg.example/app:v1.2.3,运行前用cosign verify校验
- 定期清理无标签镜像和悬空层:docker image prune -f;生产环境禁用docker build,统一由CI流水线构建并推送到私有仓库
宿主机与网络协同防护
容器安全不能脱离宿主机环境。内核参数、cgroup限制和网络策略是最后一道防线。
- 宿主机启用GRSEC或SELinux(如container_t上下文),限制容器进程访问宿主机资源
- 用--memory=512m --cpus=1.0 --pids-limit=100硬性限制资源,防DoS类攻击
- 禁用--network=host,用自定义bridge网络+--iptables=false配合宿主机firewalld或nftables精细控制进出流量










