NFS服务器uid/gid映射

NFS服务器uid/gid映射
案例说明
在云计算环境中,每个虚拟机中的相同用户账号,可能分配的uid/gid都是不同的。如果这些虚拟机想通过一个共享的存储,例如NAS来交换文件,就会遇到一个问题:NFS协议是通过uid来控制文件读写权限的,如果每个vm中用户写入的文件uid和其他vm不同,就无法被其他vm中的应用进程读取或修改。

所以就产生了本文说描述的解决方案,将不同的uid/gid映射成NAS上相同的uid/gid,以提供文件交换功能。

user-mode NFS服务器的uid/gid映射
user-mode NFS服务器支持特别的uid/gid重映射功能,可以将客户端访问不同的uid/gid映射成相同的服务器上的uid/gid,这样在一些特殊的应用场景中,可以实现文件交换。但是,很不幸,现在主要的发行版本使用的是基于内核的NFS服务器,不包含这个uid/gid重映射功能。 [1]

我没有实际测试,根据参考文档,主要有两个要求:

服务器端必须是user-mode NFS
配置文件需要针对每个客户端来分开设置(这点对于海量NFS客户端不现实) - 原文测试使用同一个map_static文件针对多个客户端则只有一个客户端生效
如果使用user-mode NFS服务器,可以简单如下设置客户端uid 501 和 502 都映射成NFS服务器上的uid 500

设置NFS服务器的 /etc/exports

/somedir 10.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 文件如下:

# remote local
uid 501 500
uid 502 500
设置NFS服务器 /etc/nfs.map.mac 文件如下:

# remote local
gid 501 500
gid 502 500
总之,这个方案在现有Linux环境下不容易实施部署。

NFS服务器的anonuid和anongid映射
NFS输出参数 anonuid 和 anongid [2]
anonid 和 anongid 参数是用于设置匿名账号访问的uid和gid。这个参数主要用于PC/NFS客户端,此时,可能希望所有请求都表现为从一个用户访问的。例如,以下配置所有请求都并映射为uid 150,也就是用户joe:

/home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
Note GlusterFS也有类似NFS的anonuid和anongid参数功能,这个功能是 Bug 1043886 - [RFE] Add two more options in ‘gluster volume set’ command server.anonuid and server.anongid 2013年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
chmod 777 /uidtest
NFS服务器启动nfs服务:

/etc/init.d/nfs start
NFS客户端使用了两个客户机test1和test2测试,其中test1服务器上admin用户的uid/gid是501,而test2服务器上admin用户的uid/gid是502

NFS客户端挂载NFS服务器的输出目录:

mount -t nfs 192.168.1.1:/uidtest
此时在NFS客户端test1和test2上看到挂载的NFS服务器输出如下:

192.168.1.1:/uidtest
                    47G  3.0G   42G   7% /uidtest
并且可以看到挂载目录的属性是777,而属主是500:

drwxrwxrwx   5  500  500 4.0K Apr 12 22:21 uidtest
Note NFS服务器端的admin账号的uid/gid是500,这个属主属性表现在所有NFS客户端。
此时不管是test1主机还是test2主机都可以读写挂载的 /uidtest 目录,但是,所有写入到NFS服务器输出卷中的文件,不管是test1还是test2,看到的文件的属主都是500,而不是客户端admin用户作为属主。特别巧妙的是,即使不是admin用户的文件,也可以读写:

-rw-r--r-- 1 500 500   41 Apr 12 22:40 test.txt
drwxr-xr-x 3 500 500 4.0K Apr 12 22:18 test1
drwxr-xr-x 2 500 500 4.0K Apr 12 22:21 test3
NetApp Data ONTAP的anon设置 [3]
NetApp存储操作系统Data ONTAP

Data ONTAP是著名的NAS供应商NetApp的存储设备filer的核心操作系统,实现了专有的称为WAFL文件系统,支持NFS,CIFS的文件网络共享。 [4]

NetApp存储的Data ONTAP系统通过文件管理来支持以下访问协议:

NFS
CIFS
FTP
HTTP
每个协议对于文件访问的控制采用不同的方式,这样用户访问文件时,Data ONTAP使用许可列表来确定是否允许访问。使用的机制包括:

用户账号
用户组或者网络组
客户端协议
客户端IP地址
文件类型
在NFS中的文件访问支持类似前述的 anonuid 设置,称为 anon 参数:

> anon=<uid>|<name> Specifies the effective user ID (or name) of all anonymous or root NFS client users that access the file system path.

猜你喜欢

转载自s7n.iteye.com/blog/2067179
今日推荐