本文介绍NFSv4 ACL和POSIX ACL相关的特性。
NAS NFSv4 ACL特性
ACE类型只支持Allow,不支持Deny、Audit和Alarm。
Deny ACE会极大增加权限设置的复杂性,容易给用户造成混淆而留下安全问题。业界已达成共识应尽量避免使用Deny ACE。不支持Deny ACE的详细介绍,请参见常见问题。
Audit ACE和Alarm ACE在阿里云NAS NFS上不生效。如果需要审计和报警功能,可以在阿里云控制台上进行配置。
未设置ACL的文件或目录会呈现与mode对应的默认ACL。示例如下:
执行
touch file
命令,进入file文件。执行
ls -l file
命令,查看file文件的权限。-rw-r--r--. 1 root root 0 May 6 14:27 file
执行
nfs4_getfacl file
命令,查看file文件当前的ACL权限。# file: file A::OWNER@:rwatTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy
ACE按照一定顺序排列并去重,使ACL显示结果更清晰易懂。
用户增加或修改ACE时,如果ACL中已经存在继承类型完全的ACE,则新的ACE会和旧的ACE的Allow bits进行合并。 例如:
排序时owner、group、everyone对应的ACE总是排在最前面。
您可执行
nfs4_getfacl file
命令,查看file文件ACL权限顺序。# file: file A::OWNER@:rwaxtTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy A::1001:rwaxtTNcCy
为用户1009增加一条读写权限的ACE,按照顺序排序后排在用户1001后面。
执行命令
nfs4_setfacl -a A::1009:X file nfs4_getfacl file
返回示例
# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:waxtTncCy
为用户1009增加执行权限的ACE,系统自动将新增的执行权限合并到用户1009已有的ACE中。
执行命令
nfs4_setfacl -a A::1009:W file nfs4_getfacl file
返回示例
# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:waxtTncCy
为用户1009增加fd继承权限的ACE,系统会将它拆分为只拥有继承能力的ACE和只对本文件起作用的ACE,并将两个ACE与ACL中同继承类型的ACE进行合并。
执行命令
nfs4_setfacl -a A:fd:1009:R file nfs4_getfacl file
返回示例
# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:rwaxtTNcCy A:fdi:1009:r
支持所有继承特性。
假设当前目录dir的权限是owner可写,group可读,everyone不能访问。
执行命令
nfs4_getfacl dir
返回示例
# file: dir A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtcy A::EVERYONE@:tncy
给用户1000增加读写权限并且可继承。
执行命令
nfs4_setfacl -a A:fd:1000:rwx dir nfs4_getfacl dir
返回示例
# file: dir A::OWNER@:rwaDxtTcCy A::GROUP@:rxtcy A::EVERYONE@:tcy A::1000:rwx A:fdi:1000:rwx
在目录dir下创建的文件或目录就自动带有继承的ACE。
在目录dir下创建文件
执行命令
touch dir/file nfs4_getfacl dir/file
返回示例
# file: dir/file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rwx
在目录dir下创建目录
执行命令
mkdir dir/subdir nfs4_getfacl dir/subdir
返回示例
# file: dir/subdir A::OWNER@:rwaDxtTcCy A::GROUP@:rwaDxtcy A::EVERYONE@:rwaDxtcy A:fdi:1000:rwx
说明建议EVERYONE权限尽量小。在执行相应的代码前请先执行
umask 777
,这样创建文件和目录时传入的mode会变成000,可以让默认的权限最小化,详情请参见umask与默认mode。Linux文件和目录的系统调用,默认会传入mode作为参数。按照RFC7530协议标准,需要在继承ACL之后再叠加上mode操作修改ACL,而按照协议如果修改了group的mode,需要保证所有群组的ACE都小于等于group mode的权限。而这会导致群组的继承失效。例如:子文件原本要继承Group A: RWX,但是默认传入的mode是GROUPS: R,则子文件的Group A的ACE会变成Group A: R。为了规避该问题,实际情况下mode不会修改ACL除owner、group、everyone之外的其他群组,语义更简单。需要移除某个群组的权限可以直接删除对应的ACE。
多个机器间的用户名与UID和GID的映射需要自行维护。
目前阿里云NAS NFS鉴权采用的是IP安全组,不支持用户名鉴权。用户设置的NFSv4 ACL在后端存储的是UID和GID的ACE,在NFSv4 ACL客户端显示时会自动加载本地的/etc/passwd将UID和GID转化成用户名和群组名。您需要管理多个机器间的用户名与UID和GID之间的映射,确保同一个用户名或同一群组名映射到相同的UID和GID,以免发生错误。
支持通过Extended Attributes输出NFSv4 ACL。
执行命令
getfattr -n system.nfs4_acl file
返回示例
# file: file system.nfs4_acl=0sAAAABgAAAAAAAAAAABYBhwAAAAZPV05FUkAAAAAAAAAAAAAAABIAhwAAAAZHUk9VUEAAAAAAAAAAAAAAABIAhwAAAAlFVkVSWU9ORUAAAAAAAAAAAAAAAAAAAAEAAAAEMTAwMAAAAAAAAAALAAAAAwAAAAQxMDAwAAAAAAAAAEAAFgGQAAAABTEwMDAxAAAA
支持cp等工具迁移NFSv4 ACL。
阿里云NAS支持使用Redhat NFSv4 ACL迁移工具说明中提到的cp、tar、rsync工具迁移NFSv4 ACL。
下面例子中
cp --preserve=xattr file1 file2
拷贝file1到file2时拷贝了ACL。cp -ar dir1 dir2
拷贝dir1到dir2时拷贝了ACL。说明rsync工具可能由于版本低于3.1.2而不能迁移NFSv4 ACL。
示例一:迁移文件ACL。
执行
nfs4_getfacl file1
命令,查看file1文件的ACL权限。# file: file1 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy
执行
cp --preserve=xattr file1 file2
命令,拷贝file1 ACL至file2。执行
nfs4_getfacl file2
命令,查看file2文件的ACL权限。# file: file2 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy
示例二:迁移目录ACL。
执行
nfs4_getfacl dir1
命令,查看dir1目录的ACL权限。# file: dir1 A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtncy A::EVERYONE@:rxtncy A::1000:rxtncy
执行
cp -ar dir1 dir2
命令,拷贝dir1 ACL至dir2。执行
nfs4_getfacl dir2
命令,查看dir2目录的ACL权限。# file: dir2 A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtncy A::EVERYONE@:rxtncy A::1000:rxtncy
支持NFSv4 ACL和mode之间的互操作,修改ACL可能引起mode的改变,反之亦然。
例如,文件file当前mode为0666,则文件权限和ACL权限示例如下。
执行
ls -l file
命令,查看file文件权限。-rw-rw-rw-. 1 root root 0 May 3 2019 file
执行
nfs4_getfacl file
命令,查看file文件的ACL权限。# file: file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
通过设置mode给owner增加执行权限,相应ACE也会增加执行权限。示例如下:
执行
chmod u+x file
命令,给owner增加执行权限。执行
ls -l file
命令,查看文件权限。-rwxrw-rw-. 1 root root 0 May 3 2019 file
执行
nfs4_getfacl file
命令,确认owner已增加执行权限。# file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
通过设置ACE给group增加执行权限,相应mode也会增加执行权限。
执行
nfs4_setfacl -a A::GROUP@:x file
命令,给group增加执行权限。执行
ls -l file
命令,查看file文件权限。-rwxrwxrw-. 1 root root 0 May 3 2019 file
说明在互操作中ACL的everyone和UNIX mode中的other等价,修改mode other会直接修改ACE EVERYONE,这对权限语义有轻微的影响。例如:当前mode为rw-------,执行
chmod o+r
后,所有人包括owner和group会获得读权限,因为ACE EVERYONE + r;而在纯UNIX mode的模式下owner和group仍然没有读权限。在没有设置过NFSv4 ACL时,mode other仍然保持other的语义。设置过NFSv4 ACL后,mode other将变成everyone的语义并保持everyone语义。强烈建议在使用NFSv4 ACL之后请勿使用mode。
mode与NFSv4 ACL权限的对应关系。
执行chmod命令改变mode时,NFSv4 ACL就会如下表中的对应改变。
other
mode other
NFSv4 ACL EVERYONE on file
NFSv4 ACL EVERYONE on dir
---
A::EVERYONE@:tncy
A::EVERYONE@:tncy
--x
A::EVERYONE@:xtncy
A::EVERYONE@:xtncy
-w-
A::EVERYONE@:watncy
A::EVERYONE@:waDtncy
-wx
A::EVERYONE@:waxtncy
A::EVERYONE@:waDxtncy
r--
A::EVERYONE@:rtncy
A::EVERYONE@:rtncy
r-x
A::EVERYONE@:rxtncy
A::EVERYONE@:rxtncy
rw-
A::EVERYONE@:rwatncy
A::EVERYONE@:rwaDtncy
rwx
A::EVERYONE@:rwaxtncy
A::EVERYONE@:rwaDxtncy
group
mode group
NFSv4 ACL GROUP on file
NFSv4 ACL GROUP on dir
---
A::GROUP@:tncy
A::GROUP@:tncy
--x
A::GROUP@:xtncy
A::GROUP@:xtncy
-w-
A::GROUP@:watncy
A::GROUP@:waDtncy
-wx
A::GROUP@:waxtncy
A::GROUP@:waDxtncy
r--
A::GROUP@:rtncy
A::GROUP@:rtncy
r-x
A::GROUP@:rxtncy
A::GROUP@:rxtncy
rw-
A::GROUP@:rwatncy
A::GROUP@:rwaDtncy
rwx
A::GROUP@:rwaxtncy
A::GROUP@:rwaDxtncy
owner
mode owner
NFSv4 ACL OWNER on file
NFSv4 ACL OWNER on dir
---
A::OWNER@:tTnNcCy
A::OWNER@:tTnNcCy
--x
A::OWNER@:xtTnNcCy
A::OWNER@:xtTnNcCy
-w-
A::OWNER@:watTnNcCy
A::OWNER@:waDtTnNcCy
-wx
A::OWNER@:waxtTnNcCy
A::OWNER@:waDxtTnNcCy
r--
A::OWNER@:rtTnNcCy
A::OWNER@:rtTnNcCy
r-x
A::OWNER@:rxtTnNcCy
A::OWNER@:rxtTnNcCy
rw-
A::OWNER@:rwatTnNcCy
A::OWNER@:rwaDtTnNcCy
rwx
A::OWNER@:rwaxtTnNcCy
A::OWNER@:rwaDxtTnNcCy
执行nfs4_setfacl命令改变NFSv4 ACL时,如果修改的是文件权限,且NFSv4 ACL属性wa不全都存在,则mode不会显示w属性。
执行nfs4_setfacl命令改变NFSv4 ACL时,如果修改的是目录权限,NFSv4 ACL属性waD不全都存在,则mode不会显示w属性。
如果目录NFSv4 ACL有Dx权限,此时mode显示没有w属性,但是目录可以进行子文件子目录创建和删除动作,相当于有mode的wx属性。
nfs4_setfacl时最好使用大写RWX设置权限。大写RWX会自动对应到mode的rwx,避免NFSv4 ACL和mode的兼容问题。
NFSv4 ACL支持比mode更丰富的权限定义,每个权限位有不同的功能。实际上某些权限功能需要多个权限位同时存在才能起效,某些权限位代表的功能需要其他权限位来表达。对于文件和目录,同样的权限位也可能有不同的功能。文件和目录的NFSv4 ACL权限请参见NFSv4 ACL。
说明默认OWNER最小权限为:tTnNcCy,不允许少于这个权限。
默认GROUP和EVERYONE最小权限为:tncy,不允许少于这个权限。
支持NFSv4 ACL和POSIX ACL的互操作。
可以使用NFSv3协议挂载含有NFSv4 ACL的文件系统,挂载后NFSv4 ACL会被转化为POSIX ACL。也可以用NFSv4协议挂载含有POSIX ACL的文件系统,挂载后POSIX ACL会被转化为NFSv4 ACL。
说明由于POSIX ACL和NFSv4 ACL的语义不完全相同。例如:POSIX ACL继承不区分文件和目录,POSIX ACL的权限只有rwx而NFSv4 ACL更丰富。强烈建议只使用NFSv4 ACL或者只使用POSIX ACL,尽量避免混用。
假设用NFSv4 ACL设置了dir0,权限如下。
执行命令,获取dir0的权限。
sudo nfs4_getfacl dir0
返回示例
A::OWNER@:tTnNcCy A::GROUP@:tncy A::EVERYONE@:tncy A:fdi:EVERYONE@:tncy A:fdi:OWNER@:tTnNcCy A:fdi:GROUP@:tncy A:g:19064:rxtncy A:g:19065:rwaDxtTnNcCy A:fdig:19064:rxtncy A:fdig:19065:rwaDxtTnNcCy
POSIX ACL的dir0权限示例如下。
执行命令
sudo getfacl dir0
返回示例
user::--- group::--- group:players:r-x group:adminis:rwx mask::rwx other::--- default:user::--- default:group::--- default:group:players:r-x default:group:adminis:rwx default:mask::rwx default:other::---
假设用NFSv4 ACL设置了dir0/file权限如下。
执行命令
sudo nfs4_getfacl dir0/file
返回示例
A::OWNER@:tTnNcCy A::GROUP@:tncy A::EVERYONE@:tncy A:g:19064:rxtncy A:g:19065:rwaxtTnNcCy
POSIX ACL的dir0/file权限如下。
执行命令
sudo getfacl dir0/file
返回示例
user::--- group::--- group:players:r-x group:adminis:rwx mask::rwx other::---
NFSv4 ACL数量限制。
默认情况下,阿里云NAS支持每个文件系统里不完全相同的ACL的数量上限为10万个,每个ACL中ACE数量上限为500个。
说明使用时请勿滥用ACL和ACE,减少权限判断时占用的时间和资源。
NAS POSIX ACL特性
other的权限适用于所有人。
包括user、group和所有在ACE里出现的用户,等价于NFSv4 ACL的everyone。
说明强烈建议任何情况下只给other赋予最小权限。
例如,myfile文件中有如下ACL。虽然包含alice的ACE中没有写权限,但因为other有写权限,所以用户alice也拥有写权限。示例如下:
执行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::rw- user:alice:r-- group::r-- mask::r-- other::rw-
执行
chmod
命令不会修改非mode的ACE。说明对于设置了POSIX ACL的文件尽量避免修改mode,请使用修改ACL的方式设置权限。
例如,myfile文件中有一条ACE为群组players赋予读写权限。示例如下:
执行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::rw- user:player:rw- group::rw- group:players:rw- mask::rw- other::---
执行
chmod g-w myfile
或chmod u-w myfile
后,并不会修改用户player和群组players的权限。这与POSIX ACL规范相比有差异,但是可以保证修改mode不会影响POSIX ACL设置的非通用用户和群组的权限。示例如下:执行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::r-- user:player:rw- group::r-- group:players:rw- mask::rw- other::---
如果文件中的group和other都没有执行权限(x),那么ACE中的执行权限也不起作用。
这是由客户的Linux系统决定的。虽然NAS服务端返回的是允许执行,但是NAS客户端要求group或者other必须带有执行权限才能真正允许执行。
例如,myfile文件中的group和other都没有执行权限,则用户player也不能执行该文件。示例如下:
执行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::rw- user:player:r-x group::r-- mask::r-x other::r--
如果group有了执行权限,那么用户player也有执行权限。示例如下:
执行命令
getfacl myfile
返回信息
# file: myfile # owner: root # group: root user::rw- user:player:r-x group::r-x mask::r-x other::r--
如果目录上设置了可继承的NFSv4 ACL,那么在NFSv3下此行为可能会不符合POSIX ACL标准。
因为NFSv4 ACL继承可以分为文件继承和目录继承,而POSIX ACL是文件和目录均继承。
说明建议您避免混用NFSv4 ACL和POSIX ACL,一个文件系统只使用一种NFS版本进行挂载。
不支持修改Mask值。
NAS POSIX ACL的Mask值由所有用户和群组的权限或操作产生,并无实际意义,也不会被修改。
多个机器间的用户名与UID和GID的映射需要由您自己维护。
目前阿里云NAS NFS鉴权采用的是IP安全组,不支持用户名鉴权。您设置的POSIX ACL在后端存储的是用户UID和GID的ACE,在POSIX ACL客户端显示时会自动加载本地的/etc/passwd将UID和GID转化成用户名和群组名。您需要管理多个机器间的用户名与UID和GID之间的映射,确保同一个用户名或同一群组名映射到相同的UID和GID,以免发生错误。
支持通过Extended Attributes输出POSIX ACL。
执行命令
getfattr -n system.posix_acl_access file
返回示例
# file: file system.posix_acl_access=0sAgAAAAEAAAD/////AgAFACAEAAAEAAAA/////xAABQD/////IAABAP////8=
支持cp等工具迁移POSIX ACL。
阿里云NAS支持使用Redhat NFSV4 ACL迁移工具说明中提到的cp、tar、rsync迁移POSIX ACL。
下面例子中
cp --preserve=xattr file1 file2
拷贝file1到file2时拷贝了ACL。cp -ar dir1 dir2
拷贝dir1到dir2时拷贝了ACL。说明rsync工具可能由于版本低于3.1.2而不能迁移POSIX ACL。
示例一:迁移文件ACL权限。
执行
getfacl file1
命令,查看file1文件的ACL权限。# file: file1 # owner: root # group: root user::rw- user:player:r-- group::r-- mask::r-- other::r--
执行
cp --preserve=xattr file1 file2
命令,拷贝file1 ACL至file2。执行
getfacl file2
命令,查看file2的ACL权限。# file: file2 # owner: root # group: root user::rw- user:player:r-- group::r-- mask::r-- other::r--
示例二:迁移目录ACL。
执行
getfacl dir1
命令,查看dir1的ACL权限。# file: dir1 # owner: root # group: root user::rwx user:player:r-x group::r-x mask::r-x other::r-x
执行
cp -ar dir1 dir2
命令,拷贝dir1 ACL至dir2。执行
getfacl dir2
命令,查看dir2的ACL权限。# file: dir2 # owner: root # group: root user::rwx user:player:r-x group::r-x mask::r-x other::r-x
POSIX ACL数量限制。
默认情况下,阿里云NAS支持每个文件系统里不完全相同的ACL的数量上限为10万个,每个ACL中ACE数量上限为500个。
说明使用时请勿滥用ACL和ACE,减少权限判断时占用的时间和资源。
常见问题
为什么ACE类型不支持Deny?
ACE在ACL中的位置起决定性作用。
NFSv4 ACL并不强制进行ACE排序,Deny可能被设置在任何位置。假设ACL有两个ACE(A::Alice:r和D::Alice:r),两个ACE的先后顺序会直接决定Alice是否具有读权限。
说明您在设置ACL时,需要非常注意ACE的位置。
ACL中的ACE数量急剧膨胀。
因为没有强制进行ACE排序,ACL列表里的ACE难以合并和去重。长期往ACL里加ACE,可能膨胀到几十上百条ACE,在判断权限控制结果时需要扫描所有ACE,费时费力。
因为mode没有Deny功能,如果使用Deny会使ACL与mode的互操作变得更复杂。
在有Deny的情况下,如果mode发生变化,则可能需要往ACL中添加多条ACE。例如:把mode改成-rw-rw-rw,则需要按顺序在ACL头部添加如下内容。
A::OWNER@:rw D::OWNER@:x A::GROUP@:rw D::GROUP@:x A::EVERYONE@:rw D::EVERYONE@:x
如果没有Deny,ACE可以排序和去重并且不区分everyone和other;如果mode发生变化,修改ACL也非常方便,只需找到owner、group、everyone所在ACE并改成如下内容即可。
A::OWNER@:rw A::GROUP@:rw A::EVERYONE@:rw
NFSv4 ACL和POSIX ACL无法互相转换。
POSIX ACL并不支持Deny,NFSv4 ACL如果包含Deny则无法转化为POSIX ACL。