首页/系统与基础设施/存储速查/NFS root squash 与权限安全
NAS 与文件共享50 条

NFS root squash 与权限安全

root squash 让客户端以 UID 0 访问时在服务端被降级为匿名身份,是 NFS 最重要的默认防线。它决定共享目录里新建文件的属主,也决定「以 root 运行的服务写共享盘」会不会失败。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​‌​‌‌‌​‌​‌​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

root squash 做了什么

NFS 请求里带的是客户端声称的 UID。服务端 nfsd 在判定权限前,会把 UID 0(以及某些实现里的其他特权身份)替换成匿名身份,默认是 nobody 的 65534,这就是 root squash。它的作用很直接:即使客户端上的 root 被攻破,攻击者也只能以 nobody 的身份操作共享目录,拿不到服务端文件的属主与权限位。相反,no_root_squash 会把这份能力原样交出去。

基本信息

适用平台Linux/Unix NFS 服务端(nfsd)
默认行为root_squash 开启,匿名身份 65534
相关选项root_squash、no_root_squash、all_squash、anonuid/anongid
生效方式改 /etc/exports 后 exportfs -ra
影响面所有以 UID 0 发起访问的写入与属主变更

开启后的实际表现

操作场景root_squash 生效时需要注意
root 身份写文件新建文件属主为 nobody后续按业务账号管理权限会失效
root 身份 chown被拒绝备份恢复保留属主的场景会失败
普通用户写自己的目录不受影响仍按各自身份判定
root 读取受保护目录可能无权限服务端是否向 others 放行决定结果
配合 all_squash所有人统一压成匿名适合公共只读仓库

配置与核对

配置与核对
# 读写共享,保留默认的 root 降级,并让匿名写入落在固定身份上
/data/app 10.0.0.0/24(rw,sync,root_squash,anonuid=65534,anongid=65534)
# 只读分发:即使对端是 root 也改不动内容
/data/pub 10.0.0.0/24(ro,sync,root_squash)
# 核对生效选项
exportfs -v

验证降级是否生效

验证降级是否生效
sudo touch /mnt/app/probe.txt && ls -ln /mnt/app/probe.txt   # 属主若为 65534 说明已降级
rm -f /mnt/app/probe.txt                                     # 测完清理,避免留下杂物
getent passwd 65534                                          # 确认服务端匿名账号
ls -ld /srv/data                                             # 检查目录是否对匿名身份开放
rw 加 no_root_squash 再配上宽网段,等于把服务端 root 权限交给任何能连上 2049 的主机:对方可以直接改写属主、植入 setuid 程序。确需保留属主的场景(备份、迁移)应改为把来源收窄到单机,或用 Kerberos 做认证后再放宽。
开启 root 降级后最常见的业务投诉是「以 root 跑的服务写不进共享盘」。这不是故障而是预期行为:要么把服务改为以业务账号运行,要么在服务端把目录属主或 ACL 调整到该匿名身份可写,而不是直接关掉 root_squash。

和其他控制手段的关系

root squash 解决的是「身份太强」,不解决「谁能连上来」。它必须和来源限制(导出只允许管理网段)、网络层限制(只在内网放行 2049)一起用。若共享要跨不受信网络,单靠 squash 不够,应改用 sec=krb5 系列,让服务端能验证客户端主机身份,而不是无条件相信 IP 和 UID。

易错点

  • 为了绕开「写不进共享盘」直接改成 no_root_squash:隐患被永久放开,正确做法是调整服务端目录属主或让服务改账号运行
  • 备份或迁移任务依赖保留属主而关闭 squash:迁移结果正确但服务端长期处于可被任意改写的状态
  • 只改导出选项不核对服务端目录权限:root 被降级后目录对 nobody 无写权限,表现仍是写入失败
  • 误以为 squash 能防住所有客户端:它只降级身份,不阻止连接,来源限制与认证方式仍需另行配置
  • 在集群或容器共享场景中多台主机都用 root 写入:所有文件属主统一变成 nobody,后续按部门划分权限的设计无法落地

数据来源与参考

  • exports(5) 手册页 root_squash/all_squash 说明
  • RFC 2624《NFS Version 4 Design Considerations》
  • 红帽官方文档《NFS 导出的安全配置》

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/nfs-root-squash-security.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​‌​‌‌‌​‌​‌​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​