NAS NFS ACL(包括NFSv4 ACL和POSIX ACL)是阿里云NAS推出的针对NFS协议文件系统的ACL。您可以通过NFS ACL实现给不同的用户和群组设置不同目录或文件的权限。本文简要介绍POSIX ACL和NFSv4 ACL的概念、注意事项及通过控制台开启NFS ACL。
背景信息
企业级用户通过共享文件系统在多个用户和群组之间共享文件时,权限的控制和管理成为了不可缺少的功能。针对不同目录或文件,文件系统管理员需要给不同的用户和群组设置相应的权限,实现访问隔离。针对这个需求,阿里云NAS支持NFS ACL功能(包括NFSv4 ACL和POSIX ACL),ACL是与文件或目录关联的权限列表,由一个或多个访问控制项(ACE)组成。
您可以使用NFSv3协议挂载含有NFSv4 ACL的文件系统,挂载后NFSv4 ACL会被转化为POSIX ACL。同样,您也可以使用NFSv4协议挂载含有POSIX ACL的文件系统,挂载后POSIX ACL会被转化为NFSv4 ACL。然而,由于NFSv4 ACL和POSIX ACL并不完全兼容,并且mode和ACL之间的互操作也存在一定的不完美性。此外,NAS NFSv3挂载不支持锁,因此建议您在使用NFSv4 ACL功能时尽量只使用NFSv4协议挂载,并设置NFSv4 ACL,而不使用mode和POSIX ACL。更多关于NAS NFS ACL的特性,请参见特性。
关于如何为NFS协议文件系统开启NFS ACL功能的操作,请参见配置NFS ACL功能。
POSIX ACL
POSIX ACL是NFSv3协议能够扩展支持的权限控制协议。POSIX ACL对mode权限控制进行了扩展,能够对owner、group、other以外的特定用户和群组设置权限,也支持权限继承。
POSIX ACL由一组ACE组成。ACE将单个用户或一组用户对关联对象的访问权限指定为读取、写入、执行权限的组合。
ACE包含一个ACE标记类型、一个可选的ACE标记限定符和一组权限。每组ACE分别由2个半角冒号(:)分隔,格式为default:type:permissions
。
default:目录继承ACE
标识目录的继承ACE,仅目录支持该类型的ACE。
type:ACE标记类型
POSIX ACL的ACE有6种类型,每种类型都由一个字符表示,且必须只有一种类型。
标记类型
标识
说明
ACL_USER_OBJ
user:
文件所有者owner。
ACL_USER
user:uid
自定义用户。例如,
owner: admini
。ACL_GROUP_OBJ
group:
文件所有者组owner。
ACL_GROUP
group:uid
自定义用户组。例如,
group:players
。ACL_MASK
mask:
自定义用户、用户组、自定义用户组的ACE最大权限。
ACL_OTHER
other:
其他用户。
permissions:权限
权限位
说明
r
读权限。
w
写权限。
x
执行文件或进入目录权限。
-
没有权限。
更多有关POSIX ACL的信息,请参见acl - Linux man page。
NFSv4 ACL
NFSv4 ACL是NFSv4协议扩展支持的权限控制协议,提供比POSIX ACL更细粒度的权限控制。
NFSv4 ACL的ACE格式为:type:flags:principal:permissions
。
type:ACE类型
NFSv4 ACL的ACE有四种类型,每种类型都由一个字符表示,且必须只有一种类型。
类型名
标识
说明
Allow
A
允许。
允许的ACL权限。
Deny
D
禁止。
禁止的ACL权限。
Audit
U
审计。
将所有需要权限的访问记录写入日志文件,需要1个或2个成功访问和失败访问标识。仅部分系统支持。
Alarm
L
告警。
对所有需要权限的访问操作生成一个系统告警,需要1个或2个成功访问和失败访问标识。仅部分系统支持。
flags:标识
ACE有三种标识,分别为组、继承和管理。
标识名
标识
说明
group
g
指定用户组。
directory-inherit
d
目录继承ACE。
新创建的子目录将继承ACE。
file-inherit
f
文件继承ACE。
新创建的文件将继承该目录的ACE,同时继承的文件会去掉其继承标志。
新创建的子目录将继承父目录的ACE。如果在父ACE中未同时指定directory-inherit,则inherit-only将添加到继承的ACE中。
inherit-only
i
在权限检查中不考虑ACE,但它是可继承的;但是,从继承的ACE中剥离了“仅继承”标志。
no-propagate-inherit
n
新创建的子目录将继承ACE,同时继承的文件会去掉其继承标志。
successful-access
S
当主体被允许执行权限所涵盖的操作时,触发警报。必须包含一个成功访问和失败访问标识。
failed-access
F
当主体被阻止执行权限所涵盖的操作时,触发审核。必须包含一个成功访问和失败访问标识。
principal:操作对象
对某个文件可以进行操作的对象,包括:OWNER@、GROUP@、EVERYONE@及指定对象。
permissions:权限
说明默认OWNER最小权限为:tTnNcCy,不允许少于这个权限。
默认GROUP和EVERYONE最小权限为:tncy,不允许少于这个权限。
更多有关NFSv4 ACL的信息,请参见nfs4_acl - Linux man page。
POSIX ACL注意事项
ACL的设置
使用继承(default)方式让子目录树获得相同的ACL,避免每次创建文件/目录都需要设置ACL。
请谨慎使用递归方式(
setfacl -R
)设置ACL。针对大的目录树进行递归操作时,可能产生较大的元数据压力影响业务运行。请在设置ACL前,先规划好用户组及其权限,每个用户可属于一个或多个用户组。如果您要增加、删除、修改用户权限,只需调整用户所在的用户组,只要用户组结构不变就无需修改用户组的ACL。在设置ACL时,尽量使用用户组而非单个用户,通过用户组设置ACL,简单省时,权限清晰易于管理。
如果跨客户端使用POSIX ACL,需要给相同的用户名或群组名设置相同的UID或GID,因为NAS后端存储的是UID或GID。
ACL的使用
因为每次系统进行权限检查时,都需要扫描所有ACE,所以尽量减少ACE数量。滥用ACL会造成文件系统性能下降。
other的权限设置
建议将other的权限设置到最低,因为other允许的权限对任何用户都适用。如果某个ACE的权限低于other,则可能是个安全漏洞。
建议将other的权限设置到最低,所以在执行相应的代码前先执行
umask 777
,这样创建文件和目录时传入的mode会变成000,使默认的权限最小化,详情请参见umask与默认mode。启动POSIX ACL后other会变为everyone,mode的other也会变为everyone。在权限判断时other的权限会作为everyone的权限进行判断。
NFSv4 ACL注意事项
ACL的设置
使用UID或GID(例如:UID 1001)设置ACL。
使用继承的方式让子目录树获得相同的ACL,避免每次创建文件或目录都需要设置ACL。
请谨慎使用递归方式(
nfs4_setfacl -R
)设置ACL。针对大的目录树进行递归操作时,可能产生较大的元数据压力影响业务运行。
ACL的使用
因为每次系统进行权限检查时,都需要扫描所有ACE,所以尽量减少ACE数量。滥用ACL会造成文件系统性能下降。
ACL权限设置
强烈建议使用NFSv4 ACL之后请勿使用mode。
nfs4_setfacl
提供了-a、-x、-m等命令行选项去增加、删除、修改ACE的参数,但建议使用nfs4_setfacl -e <file>
可以更直观地进行交互式编辑。NFSv4 ACL对权限划分很细,尤其是写权限细分在绝大多数场景下是不必要的。例如:当一个文件有写权限(w)但没有追加写的权限(a)时,执行写文件操作可能返回错误,在目录下做修改也有类似情况。为了避免意想不到的权限错误,建议使用
nfs4_setfacl
操作写权限时使用大写W,nfs4_setfacl
会将大写W转化为完整的写权限(对文件为wadT,对目录为wadTD)。请在设置ACL前,先规划好用户组及其权限。每个用户可属于一个或多个用户组,如果您要增加、删除、修改用户权限,只需调整用户所在的用户组,只要用户组结构不变就无需修改用户组的ACL。在设置ACL时,尽量使用用户组而非单个用户,通过用户组设置ACL,简单省时,权限清晰易于管理。
NAS NFSv4 ACL只支持Allow不支持Deny,所以建议将everyone的权限设置到最低,因为被everyone允许的权限对任何用户都适用。如果某个ACE的权限低于everyone,则很可能是个安全漏洞。
配置NFS ACL功能
开启NFS ACL功能后,您就可以使用POSIX ACL或NFSv4 ACL来进行文件或目录权限管理。
如果您是使用的NFS v3协议挂载的文件系统,请参见使用POSIX ACL进行权限管理。
如果您是使用的NFSv4协议挂载的文件系统,请参见使用NFSv4 ACL进行权限管理。