美文网首页
NFS服务的权限和用户映射问题

NFS服务的权限和用户映射问题

作者: 简公孙策 | 来源:发表于2020-03-14 01:49 被阅读0次

    NFS(network file system)是linux系统用来进行文件共享的服务(通常是局域网内使用)

    简单说一下过程

    • 服务器端需要安装两个服务:
      ①、rpcbind服务(RPC:Remote Procedure Call---远程过程调用),因为nfs服务在运行过程中会提供多种服务,开启多个端口,而客户端无从知晓,所以rpcbind就起到一个中介的作用(当然rpc不只可以为nfs服务提供这种功能),来帮助其注册管理其启用的端口。这样客户机访问时,只需要访问rpcbind的端口(默认111)就可以了。rpcbind和nfs都安装好后,先启用rpcbind(该服务器,好多系统都是默认安装好并启用了的),然后启用nfs服务,这样nfs服务启用的端口才会被rpcbind托管,可以通过rpcinfo -p localhost,来查看它代为管理了哪些端口。
      ②、nfs服务
    • 客户端也需要安装rpcbind服务的(有的系统已经默认是安装启用的)。
    • 服务端配置文件:
      1、 共享文件的配置文件/etc/exports(设置共享目录),以行为单位,一行为一条配置,比如
      /data 192.168.1.0/24(ro,root_squash) 192.168.0.6(rw,all_squash)
      将/data目录共享给192.168.1.0网段主机(拥有只读权限)和192.168.0.6主机(拥有读写权限),若是*,代表所有主机都可以。
      root_squash:表示客户机使用root访问时,将被压缩(映射)为匿名用户
      no_root_squash:与root_squash相反
      all_squash:表示客户机所有用户访问时,都被压缩(映射)为匿名用户
      no_all_squash(默认值):与all_squash相反

      (注:该匿名用户默认是nfsnobody(65534),可以手动设置,比如anonuid=555等。) image.png
      2、默认的权限值配置在/var/lib/nfs/etab文件内 image.png
    配置好后,可以通过“showmount -e 服务器地址” 来查看可供挂载的目录,服务器端查看可以将服务器地址写成localhost,客户端查看要写对应的服务器ip地址等。 image.png
    • 设置好配置文件后重启nfs服务:
      service nfs reload 或者
      exportfs -rv ---------- r是重载的意思,v显示详细信息

    • 客户机访问服务器共享目录
      通过挂载的方式:
      首先在客户机上创建一个空目录,比如/rhome(名字任意取),然后将服务器共享目录挂载到该目录上,比如:
      mount.nfs 192.168.0.110:/share /rhome (服务器及其共享目录写在前面,客户机本地目录写在后面),挂载的命令还可以使用mount -t nfs .....


    这里着重讲一下用户映射的原理

      NFS服务虽然不具备用户身份验证的功能,但是NFS提供了一种身份映射的机制来对用户身份进行管理。当客户端访问NFS服务时,服务器会根据情况将客户端用户的身份映射成NFS匿名用户nfsnobody。nfsnobody是由NFS服务在系统中自动创建的一个程序用户账号,该账号不能用于登录系统,专门用作NFS服务的匿名用户账号。

      所谓用户身份映射,是指当客户端访问NFS服务器时,会自动被视作服务器中的nfsnobody用户,并按照该用户的权限设置去执行操作。但是并非所有的客户端都会被映射为nfsnobody用户,在/etc/exports配置文件中提供了以下选项,以决定是否将NFS客户端映射为nfsnobody用户:

    root_squash,当NFS客户端以root用户身份访问时,映射为NFS服务器的nfsnobody用户。
    no_root_squash,当NFS客户端以root身份访问时,映射为NFS服务器的root用户,也就是要为超级用户保留权限。这个选项会留下严重的安全隐患,一般不建议采用。
    all_squash,无论NFS客户端以哪种用户身份访问,均映射为NFS服务器的nfsnobody用户。
    其中默认值是root_squash,即当客户端以root用户的身份访问NFS共享时,在服务器端会自动被映射为匿名账号nfsnobody。
    

      一般情况下,系统中除了为nfs创建的nfsnobdy用户外,还有系统创建的nobody用户(供大多数服务使用)。这两个用户在服务端和客户端都有。
      我们将客户端访问nfs服务器端的用户映射简化分为两种情况,一种是用户被压缩,一种不被压缩。(这里讲的压缩,有点映射的意思)

      当客户端使用用户zhangsan(666)连接服务端时(比如创建文件),实际传递的是其uid,当服务端接收到这个uid时,两种情况:

    ①、用户不被压缩:如果服务器端有这个uid,则显示该uid对应的(登录)名称,否则直接显示该用户uid(但该用户uid并不存在,所以在当再次请求查看该文件信息时,服务器在给用户返回信息之前,会检测到该uid并不存在,所以传给客户端时变成nobody的uid,所以在客户端查看文件时,其实显示所属主是nobody,而在服务器端显示的却是zhangsan的uid,因为文件毕竟是存在服务器上的)。也就是说当用户不被压缩的情况下,要想服务端和客户端显示相同的zhangsan,则必须服务端和客户端要同时拥有相同的zhangsan用户,且uid也要相同。
    ②、用户被压缩:那么客户端访问服务端时,不管客户端是以哪个用户的身份,最后都被压缩成指定的anonuid用户(默认是nfsnobody,当然可以修改配置的)。因为nfsnobody用户在服务端和客户端都有,压缩成该用户就一致起来了。当然我们可以修改配置指定要压缩成的用户id,但是同样要在两端都建立相同的该用户,否则,就会出现情况①中的,一边显示用户uid,一边显示nobody的现象。
    所以,在实际应用中,如果nfs服务器当做数据服务器使用(比如存放图片视频等)的话,为了方便使用,使各个客户端都能简单存取数据,一般采用将用户压缩成指定用户的方式,并且在服务器上将共享目录的所属主和所属组都设置成该用户及其主组。

    image.png image.png

    相关文章

      网友评论

          本文标题:NFS服务的权限和用户映射问题

          本文链接:https://www.haomeiwen.com/subject/mnfushtx.html