tmpfs挂载权限由显式选项控制,关键参数包括rw/ro、noexec(禁执行)、nosuid(禁提权)、mode(设初始权限);典型安全组合为--tmpfs /tmp:rw,noexec,nosuid,size=64m,配合--read-only可实现纵深防护。
明确tmpfs挂载时的权限控制参数
tmpfs本身不继承宿主机文件系统权限,所有权限由挂载选项决定。关键参数包括rw(可读写)、ro(只读)、noexec(禁止执行)、nosuid(忽略setuid/setgid位)和mode(设置目录初始权限)。这些必须在--tmpfs中显式声明,否则默认为rw,relatime,存在执行风险。
用noexec和nosuid阻断常见攻击路径
多数恶意利用依赖在临时目录中写入并执行二进制文件或提权脚本。添加noexec,nosuid能直接切断这类链路:
- noexec:阻止/tmp、/run等路径下任何可执行文件运行,即使写入成功也无法执行
- nosuid:使写入的SUID程序无法提升权限,防止普通用户绕过权限限制
- 典型组合示例:--tmpfs /tmp:rw,noexec,nosuid,size=64m
通过mode精确设定目录访问权限
对于需多进程协作的路径(如/var/run),用mode=1777可模拟标准/tmp行为——所有用户可读写,但仅创建者可删除自身文件(sticky bit);对敏感服务目录(如/run/nginx),则应收紧为mode=750或mode=700,限制组或其他用户访问:
- --tmpfs /run:rw,noexec,nosuid,mode=755(通用服务运行时)
- --tmpfs /app/secrets:rw,noexec,nosuid,mode=700(仅容器内主进程可访问)
配合只读根文件系统形成纵深防护
tmpfs权限控制需与--read-only协同使用才真正有效:
- 单独设noexec不能阻止向/etc或/usr/bin写入恶意文件——这些路径仍可能被挂载为可写volume
- 启用--read-only后,只有显式挂载的tmpfs路径才可能写入,此时再加noexec,nosuid,mode就能精准约束每处可写点
- 验证命令:docker exec -it sh -c "mount | grep tmpfs" 查看是否含noexec,nosuid标志











