NFS只读安全配置需ro与squash协同:显式设ro、禁用no_root_squash、按场景选root_squash或all_squash,配anonuid/anongid,加固目录权限、防火墙及验证挂载行为。

在Linux下配置NFS共享时,仅设ro不能真正保障安全——客户端仍可能通过UID/GID越权操作,或因no_root_squash残留导致root提权。必须将只读导出与Squash映射协同使用,才能堵住权限逃逸路径。
明确只读导出的最小必要配置
只读不是靠“不写rw”就生效,而是要从服务端强制约束:
- 在
/etc/exports中为每个共享目录显式指定ro,不可依赖默认值 - 限制客户端范围,避免用
*:例如/srv/nfs/docs 192.168.10.0/24(ro,sync,no_subtree_check) - 禁用
insecure(除非客户端明确要求非特权端口),防止低编号端口绕过防火墙规则 - 不加
no_root_squash——该选项在只读场景下完全无意义,且是高危开关
按场景选对Squash映射类型
映射不是越“严”越好,需匹配实际访问模型:
- root_squash(默认启用):适合内部可信网络,仅压缩客户端root,普通用户保留原UID/GID,便于审计归属
- all_squash:适合对外公开只读资源(如软件仓库镜像、文档站),所有访问者统一映射为匿名身份,彻底剥离用户痕迹
- 搭配
anonuid=65534 anongid=65534,确保映射目标为nfsnobody(RHEL/CentOS系)或nobody(Debian/Ubuntu系),避免映射到真实业务账户
配套系统级加固不可跳过
NFS配置只是入口,底层文件权限和运行态控制同样关键:
- 导出目录自身权限设为
755,属主建议设为nfsnobody:nfsnobody,而非root - 执行
exportfs -ra重载后,用showmount -e localhost确认输出参数中确实含ro和root_squash(或all_squash) - 防火墙仅放行
2049/tcp(NFS主端口),若未固定端口则还需开放111/tcp+udp(rpcbind),其他RPC动态端口应屏蔽 - 检查
/var/lib/nfs/etab,确认最终生效的导出参数不含no_root_squash或insecure
上线前必须验证的三项行为
挂载后不做验证,等于没配:
- 客户端用普通用户挂载,执行
ls可列出内容,但touch test报Permission denied - 客户端用
sudo mount挂载后,尝试创建文件,仍报错;查看服务端该文件属主应为nfsnobody,而非root - 若启用了
all_squash,不同客户端用户(包括root)创建的文件,在服务端均显示同一UID/GID











