daemon.json 是 Docker 守护进程安全基线的起点,需通过显式配置 icc=false、userns-remap="default"、--no-new-privileges=true、cap-drop、log-opts 与 data-root 等协同收紧网络、权限、运行时和存储维度,默认行为不可依赖。
docker 的 daemon.json 是守护进程安全基线的起点,不是靠单个开关就能“一键加固”,而是通过一组协同生效的配置项,从网络、权限、运行时、日志等维度系统性收紧默认行为。关键在于显式声明安全策略,而非依赖默认值。
明确禁用高危能力(Capabilities 白名单)
Docker 默认会 `drop` 多数危险 capability(如 `NET_ADMIN`、`SYS_MODULE`),但未在配置中显式声明,就等于把安全托付给版本实现细节。生产环境必须主动定义白名单:{
"default-runtime": "runc",
"runtimes": {
"runc": {
"path": "runc",
"runtimeArgs": [
"--no-new-privileges=true"
]
}
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"userns-remap": "default"
}更进一步,可在容器启动时用 --cap-add/--cap-drop 控制,但 daemon 层建议配合 --no-new-privileges=true 运行时参数,阻止进程在运行中提权。
启用用户命名空间隔离(UserNS Remap)
这是最有效的基础隔离手段之一:让容器内 root 映射为宿主机上一个非特权 UID 范围(如 `100000–165535`),彻底切断容器 root 对宿主机真实 root 权限的直接关联。- 编辑
/etc/docker/daemon.json,添加:"userns-remap": "default"
- 重启服务:
sudo systemctl restart docker - 系统会自动创建
dockremap用户,并在/etc/subuid和/etc/subgid中分配子 ID 段 - 注意:绑定挂载的宿主机目录需提前
chown到映射 UID(如chown 100000:100000 /host/data),否则容器无法写入
限制网络暴露与通信控制
默认开启容器间互通(`icc: true`)和 iptables 自动管理,容易扩大攻击面:- 关闭默认容器互联(除非业务强依赖):
"icc": false
- 禁用 Docker 自动操作 iptables(交由 firewalld 或手动规则统一管控):
"iptables": false
- 配置 DNS,避免容器使用不可控的公网解析:
"dns": ["114.114.114.114", "8.8.8.8"], "dns-search": ["local"]
强化日志与存储安全边界
防止日志膨胀失控或敏感数据落盘到系统盘:- 限制单个容器日志大小与轮转数量(避免填满根分区):
"log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } - 将 Docker 全量数据(镜像、容器、卷)移出系统盘,降低风险扩散:
"data-root": "/data/docker"
- 确保
/data/docker所在文件系统启用noexec、nodev等挂载选项(需在/etc/fstab中配置)
不复杂但容易忽略。


















