网站搜索

如何为用户和组设置访问控制列表 (ACL) 和磁盘配额


访问控制列表(也称为 ACL)是 Linux 内核的一项功能,它允许为文件和目录定义比常规 ugo/rwx 权限指定的访问权限更细粒度的访问权限。

例如,标准的ugo/rwx权限不允许为不同的个人用户或组设置不同的权限。使用 ACL,这相对容易做到,正如我们将在本文中看到的那样。

检查文件系统与 ACL 的兼容性

为了确保您的文件系统当前支持 ACL,您应该检查它们是否已使用 acl 选项挂载。为此,我们将为 ext2/3/4 文件系统使用 tune2fs,如下所示。将 /dev/sda1 替换为您要检查的设备或文件系统:

tune2fs -l /dev/sda1 | grep "Default mount options:"

注意:对于XFS,访问控制列表是开箱即用的。

在下面的ext4文件系统中,我们可以看到/dev/xvda2已经启用了ACL:

tune2fs -l /dev/xvda2 | grep "Default mount options:"

如果上述命令没有表明文件系统已安装支持 ACL,则很可能是由于 /etc/fstab 中存在 noacl 选项。

在这种情况下,请将其删除,卸载文件系统,然后再次安装,或者在将更改保存到 /etc/fstab 后重新启动系统。

Linux 中的 ACL 简介

为了说明 ACL 的工作原理,我们将使用一个名为 developers 的组,并添加用户 walterwhitesaulgoodman(是的,我是《绝命毒师》的粉丝! ) 到它:

groupadd developers
useradd walterwhite
useradd saulgoodman
usermod -a -G developers walterwhite
usermod -a -G developers saulgoodman

在继续之前,我们先验证两个用户是否已添加到开发人员组中:

id walterwhite
id saulgoodman

现在让我们在 /mnt 中创建一个名为 test 的目录,并在其中创建一个名为 acl.txt 的文件 (/mnt/test/acl .txt)。

然后我们将组所有者设置为开发者,并将其默认的ugo/rwx权限递归更改为770(从而授予读取、写入和执行权限)授予文件所有者和组所有者的权限):

mkdir /mnt/test
touch /mnt/test/acl.txt
chgrp -R developers /mnt/test
chmod -R 770 /mnt/test

正如预期的那样,您可以将 /mnt/test/acl.txt 写入为 walterwhitesaulgoodman

su - walterwhite
echo "My name is Walter White" > /mnt/test/acl.txt
exit
su - saulgoodman
echo "My name is Saul Goodman" >> /mnt/test/acl.txt
exit

到目前为止,一切都很好。但是,当我们需要向不属于开发人员组的另一个用户授予对 /mnt/test/acl.txt 的写访问权限时,我们很快就会遇到问题。

标准 ugo/rwx 权限需要将新用户添加到开发人员组,但这将赋予他/她对该组拥有的所有对象的相同权限。这正是 ACL 派上用场的地方。

在 Linux 中设置 ACL

ACL 有两种类型:访问 ACL(应用于文件或目录)和默认(可选)ACL,只能应用于目录。

如果设置了默认 ACL 的目录内的文件没有自己的 ACL,它们将继承其父目录的默认 ACL。

让我们授予用户 gacanepa/mnt/test/acl.txt 的读写权限。在此之前,让我们看看该目录中当前的 ACL 设置:

getfacl /mnt/test/acl.txt

然后更改文件上的 ACL,使用 u: 后跟用户名和 :rw 来指示读/写权限:

setfacl -m u:gacanepa:rw /mnt/test/acl.txt

并再次对该文件运行getfacl进行比较。下图显示了“之前”“之后”

getfacl /mnt/test/acl.txt

接下来,我们需要授予其他人对 /mnt/test 目录的执行权限:


chmod +x /mnt/test

请记住,为了访问目录的内容,普通用户需要该目录的执行权限。

用户 gacanepa 现在应该能够写入该文件。切换到该用户帐户并执行以下命令进行确认:

echo "My name is Gabriel Cánepa" >> /mnt/test/acl.txt

要将默认 ACL 设置为目录(除非被覆盖,否则其内容将继承该目录),请在规则之前添加 d: 并指定目录而不是文件名:

setfacl -m d:o:r /mnt/test
getfacl /mnt/test/

上面的 ACL 将允许不在所有者组中的用户对 /mnt/test 目录的未来内容具有读取权限。请注意更改前后 getfacl /mnt/test 输出的差异:

要删除特定 ACL,请将上述命令中的 -m 替换为 -x。例如,

setfacl -x d:o /mnt/test

或者,您还可以使用 -b 选项一步删除所有 ACL:

setfacl -b /mnt/test

有关使用 ACL 的更多信息和示例,请参阅 openSUSE 安全指南的第 10 章第 2 节(也可以免费下载 PDF 格式) )。

设置用户和文件系统的 Linux 磁盘配额

存储空间是另一种必须谨慎使用和监控的资源。为此,可以在文件系统的基础上为单个用户或组设置配额。

因此,对给定用户或特定组允许的磁盘使用量进行了限制,您可以放心,您的磁盘不会被粗心(或恶意)的用户填满。

为了在文件系统上启用配额,您必须做的第一件事是使用 /etc/fstab 中的 usrquota 或 grpquota(分别用于用户和组配额)选项挂载它。

例如,让我们在 /dev/vg00/vol_backups 上启用基于用户的配额,并在 /dev/vg00/vol_projects 上启用基于组的配额。

请注意,UUID 用于标识每个文件系统。

UUID=f6d1eba2-9aed-40ea-99ac-75f4be05c05a /home/projects ext4 defaults,grpquota 0 0
UUID=e1929239-5087-44b1-9396-53e09db6eb9e /home/backups ext4 defaults,usrquota 0 0

卸载并重新挂载两个文件系统:

umount /home/projects
umount /home/backups
mount -o remount /home/projects
mount -o remount /home/backups 

然后检查 mount 的输出中是否存在 usrquota 和 grpquota 选项(请参见下面突出显示的内容):

mount | grep vg00

最后,运行以下命令来初始化并启用配额:

quotacheck -avugc
quotaon -vu /home/backups
quotaon -vg /home/projects

也就是说,现在让我们为前面提到的用户名和组分配配额。您稍后可以使用 quotaoff 禁用配额。

设置Linux磁盘配额

首先,我们为用户 gacanepa/home/backups 上设置 ACL,这将授予他对该目录的读取、写入和执行权限:

setfacl -m u:gacanepa:rwx /home/backups/

然后与,

edquota -u gacanepa

我们将制作软 limit=900 和硬 limit=1000 块(1024 字节/块 * 1000 块=1024000 字节=1 MB )的磁盘空间使用情况。

我们还可以设置 2025 的限制作为该用户可以创建的文件数量的软限制和硬限制。

上面的命令将启动带有临时文件的文本编辑器($EDITOR),我们可以在其中设置前面提到的限制:

当用户达到默认的 900-block20-inode 限制时,这些设置将导致向用户 gacanepa 显示警告7天的宽限期。

如果到那时超过配额的情况还没有消除(例如,通过删除文件),软限制将变成硬限制,并且该用户将被阻止使用更多存储空间或创建更多文件。

为了进行测试,我们让用户 gacanepa 尝试在 /home/backups 内创建一个名为 test1 的空 2 MB 文件:

dd if=/dev/zero of=/home/backups/test1 bs=2M count=1
ls -lh /home/backups/test1

可以看到,由于超出磁盘配额,写操作文件失败。由于仅将前 1000 KB 写入磁盘,因此这种情况下的结果很可能是损坏的文件。

同样,您可以为开发人员组创建 ACL,以便为该组的成员提供对 /home/projects 的 rwx 访问权限:

setfacl -m g:developers:rwx /home/projects/

并设置配额限制:

edquota -g developers

就像我们之前对用户 gacanepa 所做的那样。

可以通过执行将宽限期指定为任意数量的秒、分钟、小时、天、周或月。

edquota -t

并更新块宽限期和索引节点宽限期下的值。

与块或索引节点使用(基于用户或组设置)相反,宽限期是在系统范围内设置的。

要报告配额,您可以使用quota -u [user]quota -g [group]来获取快速列表或repquota -v [/path/to /filesystem] 以获得更详细(详细)且格式良好的报告。

当然,您需要将 [user][group][/path/to/filesystem] 替换为特定用户 /您要检查的组名称和文件系统。

概括

在本文中,我们解释了如何为用户和组设置访问控制列表和磁盘配额。使用两者,您将能够更有效地管理权限和磁盘使用情况。

如果您想了解有关配额的更多信息,可以参考 Linux 文档项目中的 Quota Mini-HowTo。

不用说,您也可以信赖我们来回答问题。只需使用下面的评论表提交它们,我们将非常乐意查看。