如何通过在Docker中设置容器只读根文件系统来有效降低逃逸风险?
- 内容介绍
- 文章标签
- 相关推荐
本文共计795个文字,预计阅读时间需要4分钟。
直接加+--read-only+是最基础且关键的一步,但仅做这一步往往会使容器根本无法启动——因为大量应用需要+/tmp、+/run、+/var/run+写临时文件或PID。真正降低逃逸风险,依赖的是只读+精确释放可写路径的组合策略。
用 --read-only 启动容器,强制根文件系统只读
这是防御的第一道墙。启用后,整个 / 下所有路径(包括 /etc、/bin、/usr)都不可写,攻击者无法替换二进制、注入动态库、篡改配置文件或向系统目录写入恶意脚本。
- 命令示例:
docker run --read-only nginx:alpine - 验证方式:进入容器执行
mount | grep 'on / type',看到ro标志即生效 - 注意:此时
touch /test或apt update会直接报 Read-only file system
为必需路径挂载 tmpfs,提供内存级可写空间
只读 ≠ 完全不能写,而是要把写操作严格限制在无持久化、易清理、受控的区域。tmpfs 是最佳选择:数据仅驻留内存,容器退出即清空,不落盘、无残留,天然防持久化后门。
- 必须挂载的路径:
/tmp(通用临时目录)、/run和/var/run(存放 socket、PID、锁文件) - 带大小限制更安全:
--tmpfs /tmp:rw,size=10M --tmpfs /run:rw,size=5M - 避免默认无上限:不设
size=时,tmpfs 可能吃光宿主机内存
按需挂载可写 volume,且明确控制读写权限
如果应用确实需要持久化写入(如上传目录、缓存、数据库数据),必须显式用 -v 或 --mount 挂载,并禁止对其他路径开放写权限。
- 命名卷推荐用于应用数据:
-v app-uploads:/app/uploads:rw - 挂载证书或配置等敏感内容时务必只读:
-v cert-volume:/etc/tls:ro - 绑定宿主机目录要格外谨慎,加
:z或:Z处理 SELinux 上下文(如适用) - 切记:未显式挂载的任何路径,哪怕只是
/app/logs,仍继承全局只读属性
配合其他最小权限措施,形成纵深防御
只读根文件系统是重要一环,但单独使用效果有限。建议同步收紧其他攻击面:
- 丢弃非必要 capabilities:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE - 禁止容器内提权:
--security-opt no-new-privileges - 指定非 root 用户运行:
--user 1001:1001,并确保镜像中该用户有对应权限 - Kubernetes 环境下,在
securityContext中统一声明readOnlyRootFilesystem: true
本文共计795个文字,预计阅读时间需要4分钟。
直接加+--read-only+是最基础且关键的一步,但仅做这一步往往会使容器根本无法启动——因为大量应用需要+/tmp、+/run、+/var/run+写临时文件或PID。真正降低逃逸风险,依赖的是只读+精确释放可写路径的组合策略。
用 --read-only 启动容器,强制根文件系统只读
这是防御的第一道墙。启用后,整个 / 下所有路径(包括 /etc、/bin、/usr)都不可写,攻击者无法替换二进制、注入动态库、篡改配置文件或向系统目录写入恶意脚本。
- 命令示例:
docker run --read-only nginx:alpine - 验证方式:进入容器执行
mount | grep 'on / type',看到ro标志即生效 - 注意:此时
touch /test或apt update会直接报 Read-only file system
为必需路径挂载 tmpfs,提供内存级可写空间
只读 ≠ 完全不能写,而是要把写操作严格限制在无持久化、易清理、受控的区域。tmpfs 是最佳选择:数据仅驻留内存,容器退出即清空,不落盘、无残留,天然防持久化后门。
- 必须挂载的路径:
/tmp(通用临时目录)、/run和/var/run(存放 socket、PID、锁文件) - 带大小限制更安全:
--tmpfs /tmp:rw,size=10M --tmpfs /run:rw,size=5M - 避免默认无上限:不设
size=时,tmpfs 可能吃光宿主机内存
按需挂载可写 volume,且明确控制读写权限
如果应用确实需要持久化写入(如上传目录、缓存、数据库数据),必须显式用 -v 或 --mount 挂载,并禁止对其他路径开放写权限。
- 命名卷推荐用于应用数据:
-v app-uploads:/app/uploads:rw - 挂载证书或配置等敏感内容时务必只读:
-v cert-volume:/etc/tls:ro - 绑定宿主机目录要格外谨慎,加
:z或:Z处理 SELinux 上下文(如适用) - 切记:未显式挂载的任何路径,哪怕只是
/app/logs,仍继承全局只读属性
配合其他最小权限措施,形成纵深防御
只读根文件系统是重要一环,但单独使用效果有限。建议同步收紧其他攻击面:
- 丢弃非必要 capabilities:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE - 禁止容器内提权:
--security-opt no-new-privileges - 指定非 root 用户运行:
--user 1001:1001,并确保镜像中该用户有对应权限 - Kubernetes 环境下,在
securityContext中统一声明readOnlyRootFilesystem: true

