如何在 Linux 上配置访问控制列表 (ACL)
在 Linux 上使用权限是一项相当简单的任务。您可以定义用户、组或其他人的权限。当您在通常没有很多用户的桌面 PC 或虚拟 Linux 实例上工作,或者当用户之间不共享文件时,这种方法非常有效。但是,如果您是一个大型组织,为不同的用户运行 NFS 或 Samba 服务器,该怎么办?然后,您将需要挑剔并设置更复杂的配置和权限以满足您的组织的要求。
Linux(以及其他符合 POSIX 标准的 Unix)具有所谓的访问控制列表 (ACL),这是一种超出常见范例的分配权限的方法。例如,默认情况下您应用三个权限组:所有者、组和其他。使用 ACL,您可以为其他用户或组添加权限,这些用户或组不是简单的“其他”或所有者不属于其的任何其他组。您可以允许特定用户 A、B 和 C 具有写权限,而不让他们的整个组具有写权限。
ACL 可用于各种 Linux 文件系统,包括 EXT2、EXT3、EXT4、XFS、Btfrs 等。如果您不确定您使用的文件系统是否支持 ACL,只需阅读文档。
在 Linux 上安装 ACL 工具
首先,我们需要安装管理ACL的工具。
在 Ubuntu/Debian 上:
$ sudo apt-get install acl
在 CentOS/Fedora/RHEL 上:
# yum -y install acl
在 Arch Linux 上:
# pacman -S acl
在文件系统上启用 ACL
出于演示目的,我将使用 Ubuntu 服务器,但其他发行版应该以相同的方式工作。
安装ACL工具后,需要在我们的磁盘分区上启用ACL功能,以便我们可以开始使用它。
首先,我们可以检查 ACL 功能是否已启用:
$ mount

正如您所注意到的,我的根分区启用了 ACL 属性。如果您的没有,您需要编辑 /etc/fstab
文件。在要启用 ACL 的分区的选项前面添加 acl
标志。

现在我们需要重新挂载分区(我更喜欢完全重新启动,因为我不喜欢丢失数据)。如果您为任何其他分区启用了 ACL,则还必须重新挂载它们。
$ sudo mount / -o remount
惊人的!现在我们已经在系统中启用了 ACL,让我们开始使用它。
ACL 示例
基本上,ACL 由两个命令管理:setfacl
用于添加或修改 ACL,getfacl
用于显示分配的 ACL。让我们做一些测试。
我创建了一个名为 freeuser
的假设用户拥有的目录 /shared
。
$ ls -lh /

我想与另外两个用户 test
和 test2
共享此目录,其中一个具有完全权限,另一个仅具有读取权限。
首先,为用户 test
设置 ACL:
$ sudo setfacl -m u:test:rwx /shared
现在用户 test
可以创建目录、文件并访问 /shared
目录下的任何内容。

现在我们将为用户test2
添加只读权限:
$ sudo setfacl -m u:test2:rx /shared
请注意,执行权限是必需的,以便 test2
可以读取目录。

让我解释一下 setfacl 命令的语法:
-m
表示修改ACL。您可以添加新的 ACL,或修改现有的 ACL。u:
表示用户。您可以使用g来设置组权限。test
是用户的名称。:rwx
代表你要设置的权限。
现在让我向您展示如何读取 ACL。
$ ls -lh /shared

正如您所注意到的,正常权限后面有一个 +
(加号)符号。这意味着已经设置了ACL。要实际读取 ACL,我们需要运行:
$ sudo getfacl /shared

最后,如果您想删除 ACL:
$ sudo setfacl -x u:test /shared

如果您想一次性清除所有 ACL 条目:
$ sudo setfacl -b /shared

最后一件事。命令 cp
和 mv
在使用 ACL 处理文件或目录时可以更改其行为。对于cp
,需要添加-p
参数来复制ACL。如果这是不可能的,它会向您显示警告。 mv
将始终移动 ACL,而且如果不可能,它会向您显示警告。
结论
使用 ACL 可以让您对要共享的文件拥有强大的能力和控制力,尤其是在 NFS/Samba 服务器上。此外,如果您管理共享主机,则此工具是必备的。