NFS服务器uid/gid映射
NFS服务器uid/gid映射
案例说明
在云计算环境中,每个虚拟机中的相同用户账号,可能分配的uid/gid都是不同的。如果这些虚拟机想通过一个共享的存储,例如NAS来交换文件,就会遇到一个问题:NFS协议是通过uid来控制文件读写权限的,如果每个vm中用户写入的文件uid和其他vm不同,就无法被其他vm中的应用进程读取或修改。
所以就产生了本文说描述的解决方案,将不同的uid/gid映射成NAS上相同的uid/gid,以提供文件交换功能。
user-modeNFS服务器的uid/gid映射
user-modeNFS服务器支持特别的uid/gid重映射功能,可以将客户端访问不同的uid/gid映射成相同的服务器上的uid/gid,这样在一些特殊的应用场景中,可以实现文件交换。但是,很不幸,现在主要的发行版本使用的是基于内核的NFS服务器,不包含这个uid/gid重映射功能。[1]
我没有实际测试,根据参考文档,主要有两个要求:
服务器端必须是user-modeNFS
配置文件需要针对每个客户端来分开设置(这点对于海量NFS客户端不现实)-原文测试使用同一个map_static文件针对多个客户端则只有一个客户端生效
如果使用user-modeNFS服务器,可以简单如下设置客户端uid501和502都映射成NFS服务器上的uid500
设置NFS服务器的/etc/exports
/somedir10.1.2.1(rw,insecure,map_static=/etc/nfs.map.linux)10.1.2.2(rw,insecure,map_static=/etc/nfs.map.mac)
设置NFS服务器/etc/nfs.map.linux文件如下:
#remotelocal
uid501500
uid502500
设置NFS服务器/etc/nfs.map.mac文件如下:
#remotelocal
gid501500
gid502500
总之,这个方案在现有Linux环境下不容易实施部署。
NFS服务器的anonuid和anongid映射
NFS输出参数anonuid和anongid[2]
anonid和anongid参数是用于设置匿名账号访问的uid和gid。这个参数主要用于PC/NFS客户端,此时,可能希望所有请求都表现为从一个用户访问的。例如,以下配置所有请求都并映射为uid150,也就是用户joe:
/home/joepc001(rw,all_squash,anonuid=150,anongid=100)
NoteGlusterFS也有类似NFS的anonuid和anongid参数功能,这个功能是Bug1043886-[RFE]Addtwomoreoptionsin‘glustervolumeset’commandserver.anonuidandserver.anongid2013年12月17日提出的功能需求,将anonymous用户的uid和gid映射成一个常规的用户uid和gid。并且已经进入master分支功能。(也许3.5.x版本应该具备)
测试NFS服务器的anonuid/anongid
NFS服务器上配置/etc/exports内容如下:
/uidtest*(rw,all_squash,anonuid=500,anongid=500)
NFS服务器上创建/uidtest目录,并设置为777属性(客户端挂载以后会继承NFS服务器的目录权限):
mkdir/uidtest
chmod777/uidtest
NFS服务器启动nfs服务:
/etc/init.d/nfsstart
NFS客户端使用了两个客户机test1和test2测试,其中test1服务器上admin用户的uid/gid是501,而test2服务器上admin用户的uid/gid是502
NFS客户端挂载NFS服务器的输出目录:
mount-tnfs192.168.1.1:/uidtest
此时在NFS客户端test1和test2上看到挂载的NFS服务器输出如下:
192.168.1.1:/uidtest
47G3.0G42G7%/uidtest
并且可以看到挂载目录的属性是777,而属主是500:
drwxrwxrwx55005004.0KApr1222:21uidtest
NoteNFS服务器端的admin账号的uid/gid是500,这个属主属性表现在所有NFS客户端。
此时不管是test1主机还是test2主机都可以读写挂载的/uidtest目录,但是,所有写入到NFS服务器输出卷中的文件,不管是test1还是test2,看到的文件的属主都是500,而不是客户端admin用户作为属主。特别巧妙的是,即使不是admin用户的文件,也可以读写:
-rw-r--r--150050041Apr1222:40test.txt
drwxr-xr-x35005004.0KApr1222:18test1
drwxr-xr-x25005004.0KApr1222:21test3
NetAppDataONTAP的anon设置[3]
NetApp存储操作系统DataONTAP
DataONTAP是著名的NAS供应商NetApp的存储设备filer的核心操作系统,实现了专有的称为WAFL文件系统,支持NFS,CIFS的文件网络共享。[4]
NetApp存储的DataONTAP系统通过文件管理来支持以下访问协议:
NFS
CIFS
FTP
HTTP
每个协议对于文件访问的控制采用不同的方式,这样用户访问文件时,DataONTAP使用许可列表来确定是否允许访问。使用的机制包括:
用户账号
用户组或者网络组
客户端协议
客户端IP地址
文件类型
在NFS中的文件访问支持类似前述的anonuid设置,称为anon参数:
>anon=<uid>|<name>SpecifiestheeffectiveuserID(orname)ofallanonymousorrootNFSclientusersthataccessthefilesystempath.