简介

更新时间:
复制 MD 格式

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 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 区域开启 NFS ACL 开关。在弹出的开启NFS ACL确认对话框中确认提示信息:开启后支持设置 owner、group、other 以外的特定用户和群组权限,other 语义变为 everyone,应把 other 权限设置到最低。单击确定完成开启。

关闭NFS ACL

访问控制页签,关闭 NFS ACL 开关,停止NFS ACL功能。

弹窗提示关闭 NFS ACL 后,所有 owner、group、other 以外的权限将被清除,other 将从 everyone 语义回到 mode other 语义。单击确定完成关闭操作。

使用API

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