nfs是很常用的网络共享盘方式,访问客户端数量多了之后,为确保安全,会做权限控制,一般都是放开读权限,而控制写权限。
本文将在几种场景下说明 nfs 关于用户写权限的配置。
nfs 服务端即便在 exports 配置文件中配置了 rw,在客户端挂载时,往往也无法正常写入。
这个是因为 nfs 客户端挂载访问时是用 uid 映射的方式访问:
对于 root 用户,默认转换成 nobody 账号,也就是说,客户端不管你是以什么账号访问到 nfs 的挂载路径,在服务端,都是识别类似为 nobody@
对于非 root 用户,则使用其账号访问,即如果 root 用户挂载,但是使用 user1 用户(假设 uid 为1000)访问,则在 nfs 服务端也是识别为 uid 为 1000 的用户访问,如果本地有对应的 uid ,则映射为对应的用户,即:如果服务端 uid 1000 对应为 testuser1,则最后客户端 user1 所对应的权限实际为服务端 testuser1 的权限。
这部分建议查看链接:https://www.cnblogs.com/f-ck-need-u/p/7305755.html
对于 root 账号,可以在 exports 配置文件中添加 no_root_squash 选项即可,这样在客户端访问时,root 账号不会权限不会被冲刷成 nobody / nfsnobody ,直接映射为服务端 root 账号权限。
但是这样的配置权限太大,存在安全风险,实际生产中比较少这么配置。
nfs 并没有类似 no_root_squash 这种针对非 root 普通用户的配置选项,所以需要使用其他的方式配置。
如果要允许所有用户,则在服务端,修改共享目录的基础权限,更改777,即要保证 other 位的需要有 rwx 所有的权限。
这样配置后,并且 exportfs -r 重新读取配置文件生效后,即可有写权限。客户端原先已经挂载的,则需 umount ,再 mount ,即生效。
(注:对于服务端来说,nobody 对于共享目录来说,也是应用 other 位的权限,所以此方法也适用于 root 账号,但影响不大,非root账号在此配置下,对于此共享目录也拥有所有的权限,跟 root 一致。所以,一般也不建议对所有用户开放写权限。)
以下图中操作是在服务端配置。
如果只允许个别非 root 普通用户,则可使用 anonuid 和 anongid 配置项,然后对共享目录配置 acl 权限,根据所授权的 uid 或 gid 配置。
一般需要挂载的客户端比较多,为了便于后续的配置管理,不需要经常调整配置,建议使用 anongid (如501)来配置,然后在客户端创建用户组,其 gid 跟服务端 anongid 一致,对于需要授权的用户账号,将新创建的用户组添加至用户的附属组中。
以下为服务端配置:
以下为客户端配置(服务端使用 anongid 时)