核心是打破“默认即安全”误区:Docker默认以root运行、保留14项capability、根文件系统可写、网络宽松,实为攻击面起点;应强制非root用户启动、cap_drop=ALL后按需cap_add、启用--read-only与--tmpfs、设内存/CPU/进程硬限制,并只读挂载/proc、/sys。

直接加固容器运行时的默认安全配置,核心是打破“默认即安全”的误区。Docker 默认以 root 运行、保留 14 项 capability、根文件系统可写、网络互通宽松——这些都不是加固状态,而是攻击面起点。真正有效的运行时加固,是用明确约束替代默认放行。
非 root 用户启动容器
这是最基础且不可妥协的一环。root 权限等于把容器内所有操作权限交到应用进程手上,一旦应用存在漏洞,攻击者可直接提权或横向渗透。
- 在 Dockerfile 中创建低权限用户并切换: RUN adduser -u 1001 -D appuser && chown -R appuser /app USER appuser
- 避免使用 USER root 或省略 USER 指令
- 确保日志目录、临时路径等写入点已提前 chown 给该用户,否则启动失败
Capability 最小化:先清空再加白
Docker 默认授予 CHOWN、NET_BIND_SERVICE、SETUID 等 14 项能力,但多数应用根本用不到。与其逐个禁用高危项,不如从零开始授权。
- 运行时强制丢弃全部能力:cap_drop: ["ALL"]
- 按需添加单个能力,例如仅需绑定 80 端口就加:cap_add: ["NET_BIND_SERVICE"]
- 绝对禁用 --privileged,避免启用 SYS_ADMIN、NET_ADMIN 等高危 capability
- 配合 security_opt: ["no-new-privileges:true"],防止进程后续通过 execve 提权
只读根文件系统 + 受控写入点
让容器无法修改自身代码、配置或依赖,大幅降低恶意持久化与篡改风险。
- 启用根文件系统只读:read_only: true(Docker Compose)或 --read-only(CLI)
- 仅对必要路径挂载可写卷,如日志目录:-v /app/logs:/app/logs
- 临时目录用内存卷替代磁盘写入:--tmpfs /tmp:rw,noexec,nosuid,size=50M
- 敏感系统路径强制只读挂载:-v /proc:/proc:ro -v /sys:/sys:ro
资源硬限制与命名空间隔离
防止单个容器耗尽宿主机资源,也限制攻击者利用资源滥用进行 DoS 或逃逸试探。
- 内存上限:--memory=512m
- CPU 配额:--cpus=1.0 或 --cpu-shares=512
- 进程数限制:--pids-limit=100
- 禁用新用户命名空间(增强宿主机防护):--userns=host 或设置内核参数 user.max_user_namespaces=0


















