特性
本文介绍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
[root@vbox test]# ls -l file -rw-r--r--. 1 root root 0 May 6 14:27 file
[root@vbox test]# nfs4_getfacl file # file: file A::OWNER@:rwatTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy
- ACE按照一定顺序排列并去重,使ACL显示结果更清晰易懂。
用户增加或修改ACE时,如果ACL中已经存在继承类型完全的ACE,则新的ACE会和旧的ACE的Allow bits进行合并。 例如:
- 排序时owner、group、everyone对应的ACE总是排在最前面。
[root@vbox test]# nfs4_getfacl file # file: file A::OWNER@:rwaxtTnNcCy A::GROUP@:rtncy A::EVERYONE@:rtncy A::1001:rwaxtTNcCy
- 为用户1009增加一条读写权限的ACE,按照顺序排序后排在用户1001后面。
[root@vbox test]# nfs4_setfacl -a A::1009:X file [root@vbox test]# nfs4_getfacl file # file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:xtcy
- 为用户1009增加执行权限的ACE,系统自动将新增的执行权限合并到用户1009已有的ACE中。
[root@vbox test]# nfs4_setfacl -a A::1009:W file [root@vbox test]# 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进行合并。
[root@vbox test]# nfs4_setfacl -a A:fd:1009:R file [root@vbox test]# nfs4_getfacl file # file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:tcy A::1001:rwaxtTNcCy A::1009:rwaxtTNcCy A:fdi:1009:r
- 排序时owner、group、everyone对应的ACE总是排在最前面。
- 支持所有继承特性。
- 假设当前目录dir的权限是owner可写,group可读,everyone不能访问。
[root@vbox nfs]# nfs4_getfacl dir # file: dir A::OWNER@:rwaDxtTnNcCy A::GROUP@:rxtcy A::EVERYONE@:tncy
- 给用户1000增加读写权限并且可继承。
[root@vbox nfs]# nfs4_setfacl -a A:fd:1000:rwx dir [root@vbox nfs]# nfs4_getfacl dir # file: dir A::OWNER@:rwaDxtTcCy A::GROUP@:rxtcy A::EVERYONE@:tcy A::1000:rwx A:fdi:1000:rwx
- 在目录dir下创建的文件或目录就自动带有继承的ACE。
[root@vbox nfs]# touch dir/file [root@vbox nfs]# nfs4_getfacl dir/file # file: dir/file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rwx
[root@vbox nfs]# mkdir dir/subdir [root@vbox nfs]# 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。
- 假设当前目录dir的权限是owner可写,group可读,everyone不能访问。
- 多个机器间的用户名与UID/GID的映射需要自行维护。
目前阿里云NAS NFS鉴权采用的是IP安全组,不支持用户名鉴权。用户设置的NFSv4 ACL在后端存储的是UID/GID的ACE,在NFSv4 ACL客户端显示时会自动加载本地的/etc/passwd将UID/GID转化成用户名/群组名。您需要管理多个机器间的用户名与UID/GID之间的映射,确保同一个用户名/群组名映射到相同的UID/GID,以免发生错误。
- 支持通过Extended Attributes输出NFSv4 ACL。
[root@vbox nfs]# 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。[root@vbox nfs]# nfs4_getfacl file1 # file: file1 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy [root@vbox nfs]# cp --preserve=xattr file1 file2
[root@vbox nfs]# nfs4_getfacl file2 # file: file2 A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy A::1000:rtncy [root@vbox nfs]# cp -ar dir1 dir2
- 支持NFSv4 ACL和mode之间的互操作,修改ACL可能引起mode的改变,反之亦然。
例如文件file当前mode为0666。
[root@vbox nfs]# ls -l file -rw-rw-rw-. 1 root root 0 May 3 2019 file [root@vbox nfs]# nfs4_getfacl file # file: file A::OWNER@:rwatTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
- 通过设置mode给owner增加执行权限,相应ACE也会增加执行权限。
[root@vbox nfs]# chmod u+x file [root@vbox nfs]# ls -l file -rwxrw-rw-. 1 root root 0 May 3 2019 file [root@vbox nfs]# nfs4_getfacl file # file: file A::OWNER@:rwaxtTcCy A::GROUP@:rwatcy A::EVERYONE@:rwatcy
- 通过设置ACE给group增加执行权限,相应mode也会增加执行权限。
[root@vbox nfs]# nfs4_setfacl -a A::GROUP@:x file [root@vbox nfs]# ls -l 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给owner增加执行权限,相应ACE也会增加执行权限。
- 支持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,权限如下。
[root@vbox test] 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权限如下。
[root@vbox test] 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权限如下。
[root@vbox test] 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权限如下。
[root@vbox test] 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也拥有写权限。
[root@vbox 3]# 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读写权限。
[root@vbox 3]# 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设置的非通用用户和群组的权限。[root@vbox 3]# getfacl myfile # file: myfile # owner: root # group: root user::r-- user:player:rw- group::r-- group:players:rw- mask::rw- other::---
- 例如:myfile文件中有一条ACE为赋予群组players读写权限。
- 如果文件中的group和other都没有执行权限(x),那么ACE中的执行权限也不起作用。
这是由客户的Linux系统决定的。虽然NAS服务端返回的是允许执行,但是NAS客户端要求group或者other必须带有执行权限才能真正允许执行。
例如myfile文件中的group和other都没有执行权限,则用户player也不能执行该文件。
[root@vbox 3]# getfacl myfile # file: myfile # owner: root # group: root user::rw- user:player:r-x group::r-- mask::r-x other::r--
如果group有了执行权限,那么用户player也有执行权限。[root@vbox 3]# 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是文件和目录均继承。
说明 建议您避免混用NFS4 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。
[root@vbox nfs]# 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。[root@vbox nfs]# getfacl file1 user::--- user:player:r-x group::--- mask::r-x other::--x [root@vbox nfs]# cp --preserve=xattr file1 file2
[root@vbox nfs]# getfacl file2 # file: file2 user::--- user:player:r-x group::--- mask::r-x other::--x [root@vbox nfs]# cp -ar dir1 dir2
- POSIX ACL数量限制。
默认情况下,阿里云NAS支持每个文件系统里不完全相同的ACL的数量上限为10万个,每个ACL中ACE数量上限为500个。说明 使用时请勿滥用ACL和ACE,减少权限判断时占用的时间和资源。
常见问题
- 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
- 在有Deny的情况下,如果mode发生变化,则可能需要往ACL中添加多条ACE。例如把mode改成-rw-rw-rw,则需要按顺序在ACL头部添加如下内容。
- NFSv4 ACL和POSIX ACL无法互相转化。
POSIX ACL并不支持Deny,NFSv4 ACL如果包含Deny则无法转化为POSIX ACL。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论