容器启用--read-only参数可实现根文件系统只读,有效防御恶意写入,但必须配套挂载/tmp、/run、/var/run、/var/log等为tmpfs,并按需严格限定可写卷路径与权限,结合降权运行、能力裁剪等措施构成纵深防御。

直接加 --read-only 是最简方式,但必须配套为关键路径提供可写空间,否则容器大概率启动失败或运行异常。只读根分区能有效阻止攻击者向 /etc、/bin、/usr 等系统目录写入恶意二进制、配置或后门文件,是防御容器逃逸的基础防线。
启用只读根文件系统
启动容器时指定 --read-only 参数:
docker run --read-only nginx:alpine- 该参数会让整个根目录(
/)及其子路径(如/tmp、/run、/etc/hostname)均以只读方式挂载 - 验证方法:进入容器执行
mount | grep "on / type",输出中应含ro;或尝试touch /test,提示 Read-only file system 即生效
为必需路径挂载可写 tmpfs
仅设只读会导致 PID 文件写入失败、日志无法生成、临时解压报错等。必须显式挂载以下路径为 tmpfs:
-
--tmpfs /tmp:rw,size=10M—— 通用临时目录 -
--tmpfs /run:rw,size=5M和--tmpfs /var/run:rw,size=5M—— 存放 socket、PID、锁,Nginx、Supervisord 等强依赖 -
--tmpfs /var/log:rw—— 仅当应用坚持本地写日志(非 stdout/stderr),更推荐统一改用标准输出
tmpfs 不落盘、重启即清空,天然契合“临时性”,也规避了持久卷引入的权限扩大风险。
按需挂载可写数据卷(严格限定范围)
仅在真正需要持久化或共享时才挂载,且必须显式声明路径与权限:
- 上传目录:
-v upload-data:/app/uploads:rw(命名卷,推荐) - 运行时数据(如 Redis AOF):
-v redis-cache:/data:rw - 证书或静态资源(只读):
-v cert-volume:/etc/tls:ro—— 必须用:ro明确禁止写入 - 禁止 bind mount 宿主机敏感路径(如
/etc、/root),尤其禁用:z或:ZSELinux 标签
协同最小权限机制构成纵深防御
只读根分区需与其他加固措施配合,才能显著压缩攻击面:
- 丢弃非必要 capabilities:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE(仅保留业务必需) - 以非 root 用户运行:
--user 1001:1001,并在 Dockerfile 中用USER指令固化 - Kubernetes 场景下,在
securityContext统一设置:readOnlyRootFilesystem: true、runAsNonRoot: true、capabilities.drop - 镜像构建阶段就清理包管理器缓存和调试工具,例如:
RUN apt clean && rm -rf /var/lib/apt/lists/*











