Docker容器安全基线配置必须落实“最小化、最小权限、可验证、可隔离”:使用alpine:3.20等精简镜像,多阶段构建仅保留二进制;Dockerfile显式创建非root用户(adduser -S appuser)并USER切换;--cap-drop=ALL后按需--cap-add;--read-only根文件系统,写入路径用tmpfs;--memory=512m --cpus=1.0硬限制;--pid=private --ipc=private隔离命名空间;禁用--privileged和/docker.sock挂载;启用seccomp default.json与userns-remap。

写 Docker 容器安全基线配置,核心是把“最小化、最小权限、可验证、可隔离”落到具体指令和约束上。不是堆砌规则,而是让每条配置都有明确防御目标和落地方式。
基础镜像与构建阶段加固
从源头控制攻击面:
- 始终使用精简基础镜像,如
alpine:3.20或debian:bookworm-slim,避免ubuntu:latest或python:3.11这类带完整包管理器和调试工具的镜像 - Dockerfile 中禁用缓存安装(
apk add --no-cache/apt-get install -y --no-install-recommends),防止残留临时文件或未清理的依赖 - 删除构建阶段不需要的工具:比如编译完 Go 程序后,不要保留
gcc、git;Python 构建后移除pip和setuptools - 多阶段构建强制分离构建环境与运行环境,最终镜像只含二进制或字节码,不含源码、编译器、shell
运行时用户与能力控制
杜绝容器内 root 权限滥用:
- 在 Dockerfile 显式创建非 root 用户并切换:
RUN addgroup -g 1001 -f appgroup && adduser -S appuser -u 1001USER appuser:appgroup - 禁止特权模式:
--privileged绝对禁用;必要时用--cap-drop=ALL再按需加回(如--cap-add=NET_BIND_SERVICE) - 挂载卷默认设为只读:
-v /config:/app/config:ro;写入目录单独声明且限制路径范围(如/app/data,不挂载根或/etc) - 启用 seccomp 默认策略(Docker 自带
default.json),必要时自定义限制系统调用(如禁用ptrace、mount)
资源与网络硬性约束
防 DoS、防横向渗透:
- 强制设置内存与 CPU 上限:
--memory=512m --memory-swap=512m --cpus=1.0;OOMKill 不应成为唯一防护手段 - 禁用共享命名空间:
--pid=private --ipc=private --uts=private,避免 PID/IPC/UTS 命名空间逃逸 - 生产环境不用默认 bridge 网络;所有服务部署在独立自定义 bridge 网络中,并通过
docker network connect --link或 compose 的internal: true控制互通 - 对外端口仅暴露必需端口(
-p 8080:8080),内部通信走网络别名,不暴露--network host
敏感信息与运行上下文隔离
切断凭据泄露与宿主机越权路径:
- 绝不通过
ENV或COPY注入密钥;统一用docker run --secret(Swarm)或docker compose --env-file+ 外部密钥管理器(如 HashiCorp Vault) - 严禁挂载
/var/run/docker.sock—— 即使只读也等同于授予容器 root 权限;改用受控 API 代理或专用 sidecar - 设置
read-only: true根文件系统,仅对明确需要写的路径用tmpfs或可写卷(-v /tmp:/tmp) - 启用用户命名空间映射:
"userns-remap": "default"配置在/etc/docker/daemon.json,实现容器 UID 与宿主机 UID 隔离


















