NAS NFS ACL(包括NFSv4 ACLPOSIX ACL)是阿里云NAS推出的针对NFS协议文件系统的ACL。您可以通过NFS ACL实现给不同的用户和群组设置不同目录或文件的权限。本文简要介绍POSIX ACLNFSv4 ACL的概念、注意事项及通过控制台开启NFS ACL。

背景信息

企业级用户通过共享文件系统在多个用户和群组之间共享文件时,权限的控制和管理成为了不可缺少的功能。针对不同目录或文件,文件系统管理员需要给不同的用户和群组设置相应的权限,实现访问隔离。针对这个需求,阿里云NAS支持NFS ACL功能(包括NFSv4 ACLPOSIX ACL),ACL是与文件或目录关联的权限列表,由一个或多个访问控制项(ACE)组成。

您可以使用NFSv3协议挂载含有NFSv4 ACL的文件系统,挂载后NFSv4 ACL会被转化为POSIX ACL。同样,您也可以使用NFSv4协议挂载含有POSIX ACL的文件系统,挂载后POSIX ACL会被转化为NFSv4 ACL。然而,由于NFSv4 ACLPOSIX ACL并不完全兼容,并且modeACL之间的互操作也存在一定的不完美性。此外,NAS NFSv3挂载不支持锁,因此建议您在使用NFSv4 ACL功能时尽量只使用NFSv4协议挂载,并设置NFSv4 ACL,而不使用modePOSIX ACL。更多关于NAS NFS ACL的特性,请参见特性

关于如何为NFS协议文件系统开启NFS ACL功能的操作,请参见配置NFS ACL功能

POSIX ACL

POSIX ACLNFSv3协议能够扩展支持的权限控制协议。POSIX ACLmode权限控制进行了扩展,能够对owner、group、other以外的特定用户和群组设置权限,也支持权限继承。

POSIX ACL由一组ACE组成。ACE将单个用户或一组用户对关联对象的访问权限指定为读取、写入、执行权限的组合。

ACE包含一个ACE标记类型、一个可选的ACE标记限定符和一组权限。每组ACE分别由2个半角冒号(:)分隔,格式为default:type:permissions

  • default:目录继承ACE

    标识目录的继承ACE,仅目录支持该类型的ACE。

  • type:ACE标记类型

    POSIX ACLACE6种类型,每种类型都由一个字符表示,且必须只有一种类型。

    标记类型

    标识

    说明

    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 ACLNFSv4协议扩展支持的权限控制协议,提供比POSIX ACL更细粒度的权限控制。

NFSv4 ACLACE格式为:type:flags:principal:permissions

  • type:ACE类型

    NFSv4 ACLACE有四种类型,每种类型都由一个字符表示,且必须只有一种类型。

    类型名

    标识

    说明

    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,不允许少于这个权限。

    • 默认GROUPEVERYONE最小权限为:tncy,不允许少于这个权限。

    文件的NFSv4 ACL权限表

    权限位

    功能介绍

    注意事项

    r

    读文件

    w

    写文件/创建文件

    需要wa同时存在才起效,单独w无效。

    a

    追加写文件

    需要wa同时存在才起效,单独a无效。

    x

    执行文件

    需要rx同时存在才起效,单独x无效。

    d

    删除文件

    d权限无效。用户如果有父目录的wx权限,就可以删除当前文件,不受文件上的d权限影响。

    D

    -

    文件不能设置D权限,nfs4_setfacl D会被客户端过滤掉。

    t

    读文件属性信息

    默认最小权限tncy之一,不允许去除。

    T

    修改文件属性信息

    n

    读文件的named attributes属性信息

    默认最小权限tncy之一,不允许去除。

    N

    修改文件的named attributes属性信息

    NAS NFS不支持设置named attributes。N权限无效。

    c

    读文件的ACL

    默认最小权限tncy之一,不允许去除。

    C

    修改文件的ACL

    o

    修改文件的拥有者(owner)信息

    o权限的当前用户可以把文件拥有者(owner)改为自己,但是不允许改成其他用户,除非当前用户是root。

    y

    允许同步访问

    默认最小权限tncy之一,不允许去除。

    目录的NFSv4 ACL权限表

    权限位

    功能介绍

    注意事项

    r

    查询目录

    w

    创建文件、目录

    w权限无效。w权限功能包含在D权限中,需要Dx同时存在才起效。

    a

    创建子目录

    a权限无效。a权限功能包含在D权限中,需要Dx同时存在才起效。

    x

    进入目录

    d

    删除目录

    d权限无效。用户如果有父目录的wx权限,就可以删除当前目录,不受目录上的d权限影响。

    D

    目录删除子文件、子目录

    需要Dx同时存在才起效,单独D无效。

    t

    读目录属性信息

    默认最小权限tncy之一,不允许去除。

    T

    修改目录属性信息

    n

    读目录的named attributes属性信息

    默认最小权限tncy之一,不允许去除。

    N

    修改目录的named attributes属性信息

    NAS NFS不支持设置named attributes。N权限无效。

    c

    读目录的ACL

    默认最小权限tncy之一,不允许去除。

    C

    修改目录的ACL

    o

    修改文件的拥有者(owner)信息

    o权限的当前用户可以把文件拥有者(owner)改为自己,但是不允许改成其他用户,除非当前用户是root。

    y

    允许同步访问

    默认最小权限tncy之一,不允许去除。

    更多有关NFSv4 ACL的信息,请参见nfs4_acl - Linux man page

POSIX ACL注意事项

  • ACL的设置

    • 使用继承(default)方式让子目录树获得相同的ACL,避免每次创建文件/目录都需要设置ACL。

    • 请谨慎使用递归方式(setfacl -R)设置ACL。针对大的目录树进行递归操作时,可能产生较大的元数据压力影响业务运行。

    • 请在设置ACL前,先规划好用户组及其权限,每个用户可属于一个或多个用户组。如果您要增加、删除、修改用户权限,只需调整用户所在的用户组,只要用户组结构不变就无需修改用户组的ACL。在设置ACL时,尽量使用用户组而非单个用户,通过用户组设置ACL,简单省时,权限清晰易于管理。

    • 如果跨客户端使用POSIX ACL,需要给相同的用户名或群组名设置相同的UIDGID,因为NAS后端存储的是UIDGID。

  • ACL的使用

    • 因为每次系统进行权限检查时,都需要扫描所有ACE,所以尽量减少ACE数量。滥用ACL会造成文件系统性能下降。

  • other的权限设置

    • 建议将other的权限设置到最低,因为other允许的权限对任何用户都适用。如果某个ACE的权限低于other,则可能是个安全漏洞。

    • 建议将other的权限设置到最低,所以在执行相应的代码前先执行umask 777,这样创建文件和目录时传入的mode会变成000,使默认的权限最小化,详情请参见umask与默认mode

    • 启动POSIX ACLother会变为everyone,modeother也会变为everyone。在权限判断时other的权限会作为everyone的权限进行判断。

NFSv4 ACL注意事项

  • ACL的设置

    • 使用UIDGID(例如: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

  1. 登录阿里云NAS控制台

  2. 在左侧导航栏,选择文件系统 > 文件系统列表

  3. 在顶部菜单栏,选择地域。

  4. 文件系统列表页面,找到目标文件系统,单击文件系统ID或者管理

  5. 选择访问控制页签,单击开启,打开NFS ACL功能。NAS_ACL_Open

关闭NFS ACL

访问控制页签,单击关闭(默认状态),停止NFS ACL功能。

NAS_ACL_Close

使用API

开启NFS ACL功能后,您就可以使用POSIX ACLNFSv4 ACL来进行文件或目录权限管理。