NFS 的信任模型决定了加固方式
NFS 的访问控制建立在客户端标识上,服务器信任客户端上报的 UID 与 GID,因此 exports 里的来源限定与 root_squash 是第一道也是最重要的防线。正确做法是把导出限定到具体网段、启用 root_squash 阻止客户端 root 直接映射为服务端 root,对只读共享显式写 ro。出现对全网通配符导出时,等于把文件系统交给任何能连到 2049 端口的主机。
基本信息
| 适用平台 | Linux(nfs-utils 或 nfs-kernel-server) |
|---|---|
| 配置文件 | /etc/exports 与 /etc/exports.d/*.exports |
| 关键选项 | ro/rw、sync、root_squash/no_root_squash、all_squash、no_subtree_check |
| 生效方式 | exportfs -ra 重新导出,exportfs -v 查看生效结果 |
| 风险等级 | 高 |
典型使用场景
- 共享存储加固:把导出范围从全网收敛到应用网段
- 合规核查:确认所有导出均启用 root_squash
- 权限最小化:只读共享统一写 ro,避免误写
- 故障排查:客户端挂载失败时对比导出选项与网段
- 变更评估:新增共享前确认来源网段与读写需求
核查与收紧
核查与收紧
exportfs -v # 查看当前生效的导出与选项
cat /etc/exports; ls /etc/exports.d/ 2>/dev/null
# 示例(限定网段、只读可选、启用 root_squash):
# /data 10.0.1.0/24(rw,sync,no_subtree_check,root_squash,no_all_squash)
# /backup 10.0.1.0/24(ro,sync,root_squash)
exportfs -ra # 重新导出,使配置生效
showmount -e localhost # 从本机确认对外暴露的共享列表常用选项读法
| 选项 | 含义 | 正常与异常 |
|---|---|---|
| rw | 读写导出 | 仅在确有写入需求时使用 |
| ro | 只读导出 | 备份与只读数据推荐 |
| root_squash | 客户端 root 映射为匿名 | 基线要求,缺失即高危 |
| no_root_squash | 保留客户端 root 权限 | 等于把 root 权限交出,必须整改 |
| sync | 写入落盘后再应答 | 比 async 更安全,性能换安全 |
exports 里出现 *(rw,no_root_squash) 等于把 root 权限白送:发现即整改,并回溯历史访问记录评估数据影响。
落地要点
- 来源一律写成网段或具体地址,避免使用通配符
- 只读共享显式写 ro,减小误删与勒索加密的影响面
- 导出变更后用 exportfs -v 复核生效结果,而不是只看配置文件
- NFSv3 环境注意端口放行:除 2049 外还涉及 rpcbind 与辅助端口
- 把导出台账纳入变更管理,记录用途、责任人与复核时间
NFSv4 只需 2049 端口且不再依赖 rpcbind;混用版本时按实际版本规划防火墙规则,避免偶发挂载失败。