首页/系统与基础设施/存储速查/NFS 安全模式与匿名用户映射
NAS 与文件共享50 条

NFS 安全模式与匿名用户映射

NFS 安全模式 sec= 决定谁来做身份认证,root_squash 与 all_squash 决定客户端身份在服务端被降级成谁。二者的组合直接决定了共享目录里文件的属主,也是排查权限不符的第一现场。

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

认证与身份降级是两件事

NFS 里常被混为一谈的两组参数其实分工不同。sec= 决定本次访问用什么凭据:sec=sys 就是无条件相信客户端报上来的 UID/GID,而 sec=krb5 系列要求先通过 Kerberos 拿到票据。squash 系列选项决定服务端拿到这个身份后怎么改:root_squash 把 UID 0 换成匿名,all_squash 则把所有人一律换成匿名。理解了这条分工,共享目录里文件的属主为何是 nobody 就一目了然。

基本信息

适用平台Linux NFS 服务端与客户端(nfs-utils)
认证参数sec=sys(默认)/ krb5 / krb5i / krb5p
降级参数root_squash、no_root_squash、all_squash
匿名身份anonuid / anongid,默认 65534(nobody/nogroup)
核对命令exportfs -v、cat /proc/mounts、ls -ln

常见组合的效果

导出选项客户端 root 在服务端变成适用场景
root_squash(默认)匿名用户 nobody绝大多数共享,尤其多租户与只读分发
no_root_squash仍然是 root受控测试、需要备份工具保留属主
all_squash匿名用户,其他账号也一起降级公共只读仓库、未知身份客户端
all_squash + anonuid/anongid指定 UID/GID(如 1001)希望匿名写入落在固定属主名下
no_all_squash保持原 UID/GID(默认行为)已统一账号体系的内网

导出与挂载示例

导出与挂载示例
# 服务端:读写共享,客户端 root 降级为匿名,其他账号保持原 UID
/data/app 10.0.0.0/24(rw,sync,root_squash,no_all_squash)
# 服务端:公共只读仓库,任何人一律压到 nobody 读
/data/repo *(ro,sync,all_squash,anonuid=65534,anongid=65534)
# 客户端:挂载后立刻确认身份映射结果
mount -t nfs 10.0.0.10:/data/app /mnt/app && ls -ln /mnt/app
sec=krb5 走的是认证,不再是 IP 信任:服务端需要 krb5p/krb5i 对应的主机 keytab 与 nfs/<主机名> 主体,客户端需要 gssd 与 idmapd 在跑。服务端导出与客户端挂载的 sec 值必须匹配,否则挂载阶段就会报 access denied by server 而不是等到读写才失败。

检查映射结果

检查映射结果
exportfs -v                     # 看每条导出生效的 squash 与 sec
getent passwd 65534              # 确认服务端匿名账号是什么
ls -ln /srv/data                 # 看现有文件属主的 UID 数字
tail -n 30 /var/log/messages     # RHEL 系看 nfsd 拒绝记录
journalctl -u nfs-server -n 30   # Debian 系看服务日志

匿名映射的连带影响

一旦所有写入都以 nobody 落盘,服务端目录就需要对 nobody 开放写权限,否则客户端会看到挂载正常却写不进去。反过来,如果 no_all_squash 生效而客户端 UID 在服务端不存在,新建文件会显示成一串数字属主,后续用名称做权限管理的策略就会失效。所以匿名映射不是单独一个开关,它同时要求你重新审视服务端目录的属主与权限位。

易错点

  • 只改 squash 选项不同步调整服务端目录属主:所有写入变成 nobody 后被权限位拒绝,表现为能挂载、能读、不能写
  • 给整个网段配 no_root_squash:客户端 root 等同于服务端 root,可任意改写属主与权限位
  • 客户端 UID 在服务端不存在又用了 no_all_squash:文件属主显示为数字,按名字做的权限策略全部失效
  • 以为 sec=krb5 是纯客户端配置:缺少 keytab、gssd 或 idmapd 时挂载直接失败,且报错信息落在客户端日志里
  • 把 anonuid 指向一个普通业务账号:匿名写入的文件会与该账号真实文件混在一起,后续清理和配额统计都会混乱

数据来源与参考

  • exports(5) 手册页 secure/anonymous 选项说明
  • RFC 7530《NFS Version 4 Protocol》
  • Linux 内核文档 Documentation/filesystems/nfs

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/nfs-secure-mode-anonymous-mapping.html

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