docker容器安全规范需围绕最小权限、最小暴露、可验证、可收敛四原则,分层落实于镜像构建(如非root用户、最小基础镜像)、运行时启动(如cap-drop、seccomp白名单)和宿主机环境(如userns-remap、tls认证)三大环节。

一、镜像构建阶段:从源头收紧
安全始于 Dockerfile,错误在这里埋下,后期很难补救。
-
用最小基础镜像:优先选
alpine或distroless(如gcr.io/distroless/static-debian12),避免带包管理器、shell、调试工具的臃肿镜像。 -
显式创建非 root 用户:不用
USER root,也不依赖隐式用户。示例:RUN addgroup -g 1001 -f appgroup && \ adduser -S appuser -u 1001然后紧接USER appuser:appgroup,并确保所有文件归属正确(COPY --chown=appuser:appgroup)。 -
删除危险权限位:构建完成后运行
RUN find /usr/bin /bin -perm /6000 -type f -exec rm -f {} \;,清除 setuid/setgid 文件。 -
禁用不必要指令:不在 Dockerfile 中使用
RUN apt-get update && apt-get install -y ...这类组合命令;不硬编码密码、密钥;不使用ADD(会自动解压 tar 包,有安全隐患),统一用COPY。
二、容器运行阶段:运行时强制约束
即使镜像本身合规,启动方式不对,也会瞬间失效。
-
丢弃全部默认能力,按需添加:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE(仅需绑定 80/443 端口时);若不需要网络绑定,连NET_BIND_SERVICE也去掉。 -
禁用新特权获取:
--security-opt no-new-privileges防止进程通过execve()提权或加载恶意模块。 -
启用 Seccomp 白名单策略:不依赖默认宽松策略。自定义 JSON 文件只放应用真实需要的 syscall(如
read,write,openat,epoll_wait),禁用ptrace,mount,reboot,setuid等高危调用。启动命令示例:docker run --security-opt seccomp=./seccomp-prod.json ...
-
限制资源与命名空间:
--memory=512m --memory-swap=512m --cpus=1.0-
--read-only(根文件系统只读)+--tmpfs /tmp:rw,size=64m,exec(按需挂载临时可写区) -
--pid=private --ipc=private --uts=private(隔离 PID、IPC、UTS 命名空间)
三、宿主机与守护进程加固
容器跑在宿主机上,Docker daemon 本身是高权限服务,必须守住这道门。
-
启用用户命名空间映射:在
/etc/docker/daemon.json中配置:{ "userns-remap": "default" }并确保/etc/subuid和/etc/subgid已分配非重叠 UID/GID 范围(如docker:100000:65536)。 -
禁用不安全选项:禁止
--privileged、禁止挂载/proc、/sys、/run、/var/run/docker.sock到容器内;默认网桥禁用容器间通信:"icc": false。 -
启用 TLS 认证与访问控制:Docker daemon 启动必须使用
--tlsverify+ 客户端证书校验;限制 docker.sock 权限为root:docker且0660。 -
日志与审计:配置
"log-driver": "json-file"+"log-opts": {"max-size": "10m", "max-file": "3"};开启 auditd 规则监控/var/lib/docker、/etc/docker、/usr/bin/dockerd等关键路径。
四、配套机制不能少
配置只是手段,闭环管理才是关键。
-
镜像签名与内容信任:启用
DOCKER_CONTENT_TRUST=1,只拉取经签名的镜像。 -
漏洞扫描自动化:CI 流程中集成 Trivy 或 Snyk,对每个构建镜像做
trivy image --severity CRITICAL,HIGH myapp:latest,失败则阻断发布。 -
健康检查与非 root 运行验证:Dockerfile 中加
HEALTHCHECK,同时用docker inspect检查Config.User、HostConfig.CapDrop、SecurityOpt字段是否符合预期。











