JuiceFS POSIX ACL 权限管理上手指南

2024-05-23
于鸿儒(Herald Yu)

ACL(Access Control Lists)即访问控制列表,是一种在类 Unix 系统( Linux、macOS、FreeBSD 等)中实现更精细权限控制的机制。它扩展了传统 Unix 权限模型的功能,提供了更灵活、更详细的权限管理方式。

在传统的 Unix 权限模型中,文件或目录的权限分为三个类别: - 所有者权限 - 所属组权限 - 其他用户权限

这种模型有其简单和易于理解的优点,但在一些需要更细粒度权限控制的场景中,局限性就显现出来了。例如,如果想让某个用户有权访问某个文件,但不希望他属于该文件的组,那么传统的 Unix 权限模型就无法满足这个需求。

这就是 POSIX ACL 出现的原因,通过 POSIX ACL,可以为每个用户或组分配单独的权限,而不仅仅是文件的所有者、所属组或其他用户。

一、在 JuiceFS 中使用 ACL 的要求

JuiceFS 企业版始终支持 ACL 功能,社区版从 JuiceFS v1.2 开始支持 POSIX ACL 功能,本文以社区版为例展开介绍。

JuiceFS 社区版在启用 ACL 功能之前需要关注以下情况:

  1. ACL 功能是关联到文件系统的,开启后暂不支持取消;
  2. 如果对一个文件系统启用 ACL 功能,需要将所有客户端都升级到 v1.2 及以上的新版本,避免旧版客户端干扰权限设置;

二、文件系统准备

首先,确认客户端版本。

$ juicefs version
juicefs version 1.2.0-beta1+2024-04-18.041e931

截止本文发稿,最新版客户端为 JuiceFS v1.2.0-beta2,可以访问 Github Releases 找到匹配 CPU 架构的预编译版本,也可以参考官方文档手动编译所需版本的客户端。

ACL 功能对元数据引擎没有要求,可以在任何 JuiceFS 文件系统上使用,无论它是用新版本客户端还是旧版本客户端创建的。只要使用新版本的客户端,就能在现有的文件系统中启用 ACL 功能。

如果还没有文件系统,可以参考官方文档创建一个文件系统

1. 为新创建的文件系统开启 ACL 功能

在创建文件系统时直接开启 ACL 功能需要使用 v1.2 及以上版本的客户端,在命令中使用 --enable-acl 选项。

juicefs format --enable-acl \
--bucket xxx
--access-key xxx
--secret-key xxx
...
redis://xxx.myserver.com/1 myjfs

2. 为已存在的文件系统启用 ACL 功能

使用 v1.2 及以上版本的客户端,通过 config 命令为文件系统启用 ACL。

juicefs config --enable-acl redis://xxx.myserver.com/1

3. 查看一个文件系统是否已经启用 ACL

这里也同样需要使用 v1.2 及以上版本的客户端,因为旧版本客户端无法输出 ACL 功能相关的信息,例如:

$ juicefs status redis://192.168.1.80/1

{
  "Setting": {
    "Name": "myjfs",
    "UUID": "fdc09170-3e1b-43be-bc64-c30e6031a7b9",
    "Storage": "minio",
    "Bucket": "http://192.168.1.80:9123/myjfs",
    "AccessKey": "herald",
    "SecretKey": "removed",
    "BlockSize": 4096,
    "Compression": "none",
    "EncryptAlgo": "aes256gcm-rsa",
    "KeyEncrypted": true,
    "TrashDays": 1,
    "MetaVersion": 1,
    "MinClientVersion": "1.1.0-A",
    "DirStats": true,
    "EnableACL": false
  },
...

当一个文件系统启用了 ACL 功能以后,其状态信息中记录的最低客户端版本也会发生变化。

{
  "Setting": {
    "Name": "myjfs",
    "UUID": "fdc09170-3e1b-43be-bc64-c30e6031a7b9",
    "Storage": "minio",
    "Bucket": "http://192.168.1.80:9123/myjfs",
    "AccessKey": "herald",
    "SecretKey": "removed",
    "BlockSize": 4096,
    "Compression": "none",
    "EncryptAlgo": "aes256gcm-rsa",
    "KeyEncrypted": true,
    "TrashDays": 1,
    "MetaVersion": 1,
    "MinClientVersion": "1.2.0-A",
    "DirStats": true,
    "EnableACL": true
  },

三、相关的的工具

在 Linux 中,主要使用以下工具来管理和配置 ACL:

  1. getfacl:用于获取文件或目录的 ACL 信息;
  2. setfacl:用于设置文件或目录的 ACL;

部分 Linux 发行版中并没有默认安装这些工具,对与 Debian 和 Ubuntu 系统,可以使用 sudo apt-get install acl 命令来安装。对于 Red Hat、Almalinux、Rocky Linux 等系统,可以使用 sudo dnf install acl 命令来安装。

四、使用 ACL 管理 JuiceFS 中的文件权限

1. POSIX 文件权限

在 Linux 系统中,文件或目录的权限是以用户或组为单位进行管理的。

如下图,当使用 ls -l 命令列出一个目录中文件的信息时,每条记录的第 1 项都是一个 10 位长度类似 -rw-r--r-- 的文本,它代表着“用户、组、其他”对该“文件”所拥有的权限:

  • 第 1 位,代表文件的类型。”-” 代表普通文件,“d” 代表目录,“l” 代表符号连接,“s” 代表套接字。
  • 第 2~4 位,代表文件所有者的权限,它按顺序分别是 r 读、w 写、x 执行,如果没有某一项权限则用 - 表示。
  • 第 5~7 位,代表文件所有者组的权限,它按顺序分别是 r 读、w 写、x 执行,如果没有某一项权限则用 - 表示。
  • 第 8~10 位,代表其他用户对该文件的权限,它按顺序分别是 r 读、w 写、x 执行,如果没有某一项权限则用 - 表示。

例如,-rw-r--r-- 则代表这是一个普通文件,它的所有者具有读写权限,所有者组和其他用户只具有读权限。

从上图列出的权限信息可以看到,这些文件的所有者是 herald,所有者组是 admin。如果此时想给一个名为 tom 的用户也赋予 README.md 文件的读写权限,要么把它设置为所有者(但 herald 就失去了所有权),要么就把 tom 添加到 admin 用户组并给整个用户组开放写权限(但这样会打破 admin 组的只读权限,组内所有用户都会同时拥有读写权限),另外也可以给“其他”用户分配读写权限(但这会把权限开口放的更大)。

很显然,常规的 Linux 权限模式难以满足细粒度的文件权限控制,而 ACL 则能轻松满足这种需求。

2. 使用 ACL 分配权限

为文件和目录设置 ACL 权限主要使用 getfacl 和 setfacl 这两个工具,前者用户列出 ACL 权限信息,后者则用于设置 ACL 权限。

1. 为文件设置 ACL 权限

仍然以 README.md 文件的权限设置为例,首先查看它的 ACL 权限设置情况:

getfacl 列出了文件的 ACL 信息,前三行依次是文件名、所有者、组,紧跟着的三行是该文件当前的权限设置情况,不难发现,它与 ls -l 命令列出来的完全一致。也就是说在没有设置 ACL 权限时,这里显示的就是 POSIX 默认的权限设置。

现在使用 setfacl 给不属于 admin 组的用户 tom 赋予 README.md 文件的读写权限,为用户设置 ACL 权限的语法为 setfacl -m u:username:permissions filename_or_directoryname

如上图,首先使用 id 命令确认这个用没有在 admin 用户组;然后使用 setfacl 为该用户赋予 rw 读写权限;设置完毕以后,再次使用 getfacl 列出文件的 ACL 设置情况。

此时可以看到,文件权限部分新增了两行:

  1. user:tom:rw- 是新增的 ACL 权限设置,代表用户 tom 对该文件有读写权限;
  2. mask::rw- 是 ACL 为该文件自动添加的权限掩码,它的作用是为(group class 所有)ACL 项设置的最大有效权限上限。

现在,用户 tom 对 README.md 文件已经具有编辑权限,可以通过 sudo -u tom nano README.md 修改并保存文件进行验证。

在笔者的系统中,admin 用户组中有一个名为 jerry 的用户,现在以它的身份编辑该文件,如下图,它没有写权限。

这说明 ACL 的权限设置没有影响到文件默认的权限设置。

同样的,也可以为指定的用户组赋予对该文件的读写权限,为用户组设置 ACL 权限的语法为 setfacl -m g:user-group:permissions filename_or_directoryname

如上图,为 www-data 用户组赋予了 README.md 文件的读写权限,该组中的所有用户对这个文件都拥有读写权限,而文件默认的 POSIX 权限定义的 admin 用户组仍然是只读权限。 可以根据实际需要,为任意数量的用户或用户组灵活定义对某个文件的任意权限。

2. 为目录设置 ACL 权限

与为文件设置 ACL 权限一样,使用 getfacl 获取目录的 ACL 信息,使用 setfacl 为目录设置 ACL 权限。

如上图,笔者通过在 JuiceFS 的挂载点上解压文件产生了一个新的目录,通过 getfacl 读取目录的 ACL 信息,然后使用 setfacl 为用户 tom 赋予这个目录的“读、写、执行”(rwx)权限。

从图中可以看到,目录的权限设置中默认都有执行(x)权限,如果没有这个权限就无法进入这个目录。沿着这个思路,我们就可以从目录访问权限的角度来设置 ACL 权限,比如,禁止 www-data 用户组访问这个目录,就可以这样设置 sudo setfact -m g:www-data:wr- directory

同样的,可以用这种方式为任意用户、组分配目录的访问权限。 如果希望让目录中所有文件和目录都采用该 ACL 规则,可以使用 -R 选项。例如,setfacl -R -m u:tom:wrx your-directory

3. 为目录设置默认 ACL 权限

在使用中会发现,对一个目录设置的 ACL 权限只会对目录本身起作用。比如给 tom 分配目录的 rwx 权限,但对目录中的文件却没有写权限,这说明 ACL 权限设置默认是不会向下传播的。

想让一个目录的 ACL 权限向下传播,也就是让目录中新增的文件自动附带预定义的 ACL 权限,则需要使用默认权限设置。方法很简单,只需要在设置时使用 -d 选项即可。

设置后,在目录的 ACL 信息中会增加一系列 default 权限定义。该目录下新增的任何文件,都会自动附加这些默认的定义。以上面的例子来说,tom 可以像所有者一样,对该目录中新增的文件/目录具有读写执行的完整权限。

需要注意的是,上图展示的默认 ACL 权限设置并不影响目录中已有文件的权限。如果希望让已有文件也采用该 ACL 规则,可以使用 -R 选项。例如,setfacl -R -m u:tom:wrx your-directory

4. 删除 ACL 权限

当需要删除文件或目录上定义的 ACL 规则时,可以使用 -x 选项,如下图:

另外,如果需要一次性递归删除目录中所有文件的 ACL 设置,可以使用 setfacl -R -b your-directory

五、注意事项

拷贝时保留 ACL 权限

cp、rsync 等工具文件拷贝工具默认不会保留文件的 ACL 设置,如果需要保留文件或目录的 ACL 权限,应该在操作之前了解相关工具的参数。 比如:

# cp 用 -a 或 --archive
cp -a 源文件 目标位置

# rsync 用 -X 或 --acl
rsync -avX 源文件 目标位置

总结

本文以 JuiceFS 文件系统的视角介绍了 POSIX ACL 基本用法、与 POSIX 默认权限的区别,以及日常使用中的注意事项。对 getfacl 和 setfacl 这两个常用命令在文件、目录以及默认 ACL 权限设置的方面提供了详尽的示例。希望本文介绍的内容能够为读者有一些帮助,同时欢迎加入 JuiceFS 微信群,与大家一起了解更多 JuiceFS 以及分布式文件系统相关内容。

Author

于鸿儒(Herald Yu)
Juicedata tech writer

最新博客

使用 JuiceFS 快照功能实现数据库发布与端到端测试

2024-11-15
JuiceFS 云服务用户 Jerry,他们通过使用 JuiceFS snapshot 功能,创新性地实现了数据的版本控制。Jerry,是一家位于北美的科技公司,利用人工智能和机器学习技术,简化用户…

海柔仿真系统存储实践:混合云架构下实现高可用与极简运维

2024-11-08
海柔科技仿真平台的数据特征包括:大量小文件、并发写入、跨云架构等。经过对比 Longhorn、Ceph 等多种系统后选择了 JuiceFS

好未来:多云环境下基于 JuiceFS 建设低运维模型仓库

2024-11-06
好未来基于 JuiceFS 开发了一个模型仓库,支持用户训练过程存储 checkpoint,并且控制面支持用户从各个云环境上传并统一管理模型。通过 JuiceFS CSI 组件,好未来将模型仓库挂载…

JuiceFS CSI:Mount Pod 的平滑升级及其实现原理

2024-10-30
JuiceFS CSI Driver 在 v0.25.0 版本中,实现了 Mount Pod 的平滑升级,即在应用不停服的情况下升级 Mount Pod。