如何在 Linux 上管理 ACL
客观的
Linux上ACL(访问控制列表)的管理简介
操作系统和软件版本
操作系统: – Linux 发行版不可知
要求
对正常运行的 Linux 安装进行 root 访问
自由裁量许可制度的知识
支持 ACL(例如 xfs、ext2、ext3、ext4)的文件系统,使用“acl”选项安装
安装“acl”包
困难
中等的
惯例
# – 要求以root权限直接以root用户身份或使用
sudo
命令执行给定的linux命令$ – 要求以常规非特权用户身份执行给定的 Linux 命令
介绍
在本教程中,我们将了解什么是 ACL,以及如何在 Linux 平台上对此类权限进行基本操作。以下说明适用于任何 Linux 发行版。我假设您了解并且习惯使用标准 Linux 自行 ugo/rwx 权限。
那么,什么是 ACL?
ACL 是第二级任意权限,可能会覆盖标准的 ugo/rwx 权限。如果使用正确,它们可以为您提供更好的粒度设置对文件或目录的访问权限,例如,通过授予或拒绝既不是文件所有者也不是组所有者的特定用户的访问权限。
入门
如果您想利用 ACL,您要做的第一件事是确保您想要使用它们的文件系统已使用“acl”选项挂载。要验证后者,您可以运行“tune2fs -l”命令,并将分区作为参数传递。正如您所看到的正在运行(输出被截断):
# tune2fs -l /dev/sda3
在我的系统上给出以下结果,显示 /dev/sda3 上的文件系统在默认安装选项中也有“acl”。
如果您的文件系统尚未使用“acl”选项挂载,您可以重新挂载它并提供所需的选项:
# mount -o remount -o acl /dev/sda1
但是,请注意,以这种方式设置的安装选项不会持久,并且不会在重新启动后保留。如果您想获得持久性,则必须修改 /etc/fstab 中的文件系统挂载选项,静态分配“acl”选项。
我们需要的另一件事是安装 acl 包。该软件包包含各种 ACL 实用程序,例如 getfacl
和 setfacl
程序。
一个测试用例
让我们看看 ACL 能为我们做什么。首先,我们将创建一个名为 text.cfg 的文件,并将其作为 getfacl 命令的参数。让我们看看这个命令的输出显示了什么:
$ touch text.cfg && getfacl text.cfg
正如您所看到的,由于我们没有对文件设置任何 ACL 权限,因此该命令仅显示标准权限值,以及文件所有者和组所有者,两者都具有读写权限。现在,假设我们想要为特定用户(我将故意创建该用户并称他为“虚拟”)提供一组特定的文件权限。我们只需要运行:
$ setfacl -m u:dummy:rw text.cfg
让我们分析一下命令:当然,首先我们有程序的名称 setfacl
,这是非常不言自明的,然后我们传递了 -m
选项(缩写为--modify
),它允许我们更改文件的 ACL,然后是权限描述 u:dummy:rw
。
我们有三个用冒号分隔的“部分”:在第一个部分中,u
代表用户,指定我们要为特定用户设置 ACL。它可能是代表组的 g
,或者代表 others
的 o
。在第二部分中,我们有要为其设置权限的用户的名称,在第三部分中,有要分配的权限。
最后,我们要应用权限的文件的名称。
如果我们现在尝试运行“getfacl”命令,我们可以看到它的输出反映了我们所做的更改:
$ getfacl text.cfg
已为dummy
用户添加了一个条目,显示我们分配给他的权限。除此之外,如果您注意到的话,还出现了 mask
条目。它代表什么 ?与 ACL 关联的掩码限制了可以在文件上为指定组和用户以及组所有者分配的权限集,但对文件所有者和其他人的权限没有影响代码>权限组。
在这种情况下,只能使用setfacl命令分配读写权限。当然,我们可以使用 setfacl 程序本身来更改此选项:
$ setfacl -m mask:r text.cfg
通过上面的命令,我们将掩码设置为仅允许读取权限。现在让我们检查一下 getfacl
的输出:
$ getfacl text.cfg
正如您所看到的,现在不仅报告了我们对掩码所做的更改,还显示了组所有者和指定用户dummy
的有效权限。虽然组所有者和虚拟用户对文件具有读写权限,但通过更改掩码,我们有效地将他们的权限限制为只读。正如命令的输出所示,现在只允许他们读取该文件。
除了使用上面的命令显式更改之外,当我们使用 setfacl 分配或更改权限时,ACL 掩码也会自动重新计算(除非指定了 -n 选项)。让我们演示一下:我们将 dummy
用户的权限更改为 rwx
,然后检查 getfacl 输出:
$ setfacl -m u:dummy:rwx text.cfg && getfacl text.cfg
正如您所看到的,掩码已重新计算,它现在反映了指定用户dummy
的最大权限。显然,由于现在没有先前设置的权限高于掩码,因此无需显示# effective
权限状态。
您还可以使用 ACL 完全拒绝特定指定用户或组对文件的访问。例如,通过运行:
$ setfacl -m u:dummy:- text.cfg
我们实际上拒绝了 dummy
用户对 text.cfg 文件的所有权限。
默认 ACL
default
ACL 是分配给目录的特定类型的权限,它不会更改目录本身的权限,但会在创建的所有文件上默认设置指定的 ACL在它里面。让我们演示一下:首先,我们将创建一个目录并使用 -d
选项为其分配 default
ACL:
$ mkdir test && setfacl -d -m u:dummy:rw test
现在,我们可以检查该目录的 getfacl 的输出:
$ getfacl test
default
权限已正确分配。现在我们可以通过在测试目录中创建一个文件并通过运行 getfacl 检查其权限来验证它们:
$ touch test/file.cfg && getfacl test/file.cfg
正如预期的那样,该文件已自动创建并接收上面指定的 ACL 权限。
当您想要删除所有 ACL 设置时,您始终可以使用 -b
选项运行 setfacl。
本教程涵盖了 ACL 的主要方面,当然还有很多关于它们的内容需要了解,因此我建议一如既往地阅读手册以获取更深入的知识。现在请记住,如果您想删除分配给某个文件的所有 ACL 权限,您只需运行带有 -b
(- 的缩写)的
) 选项。setfacl
即可。 -remove-all