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

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

例如,标准的ugo/rwx权限不允许为不同的个别用户或组设置不同的权限。通过ACL,这在本文中将会看到,相对容易实现。

使用ACL检查文件系统兼容性

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

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

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

在以下ext4文件系统中,我们可以看到ACL已启用于/dev/xvda2

# tune2fs -l /dev/xvda2 | grep "Default mount options:"
Check ACL Enabled on Linux Filesystem

如果上述命令未指示文件系统已挂载以支持ACL,很可能是由于noacl选项存在于/etc/fstab中。

在这种情况下,删除它,卸载文件系统,然后重新挂载,或者在保存更改到/etc/fstab后简单地重新启动系统。

在Linux中引入ACL

为了说明ACL是如何工作的,我们将使用一个名为developers的组,并将用户walterwhitesaulgoodman(是的,我是《绝命毒师》的粉丝!)加入其中。

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

在我们继续之前,让我们验证这两个用户是否已经被添加到developers组中:

# id walterwhite
# id saulgoodman
Find User ID in Linux

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

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

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

正如预期的那样,您可以以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
Verify ACL Rules on Users

到目前为止一切顺利。然而,当我们需要为不在developers组中的另一个用户授予对的写入访问时,我们很快就会遇到问题。

标准的ugo/rwx权限要求新用户被添加到developers组,但这将使他/她对由该组拥有的所有对象具有相同的权限。这正是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
Set ACL on Linux Users

接下来,我们需要赋予其他用户对/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输出的差异:

Set Default ACL to Linux Directory

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

# setfacl -x d:o /mnt/test

或者,您也可以使用-b选项一次性删除所有ACL:

# setfacl -b /mnt/test

有关ACL的更多信息和示例,请参考第10章第2节openSUSE安全指南(也可免费下载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 

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

# mount | grep vg00
Check Linux User Quota and Group Quota

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

# 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

我们将设置软限制=900和硬限制=1000块(每块1024字节*1000块=1024000字节=1 MB)的磁盘空间使用。

我们还可以将这个用户可以创建的文件数量的软限制=20和硬限制=25设置为20和25。

上述命令将启动文本编辑器($EDITOR),在那里我们可以设置先前提到的限制:

Linux Disk Quota For User

这些设置将在用户gacanepa达到900块20 inode限制时显示警告,为默认的7天宽限期。

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

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

# dd if=/dev/zero of=/home/backups/test1 bs=2M count=1
# ls -lh /home/backups/test1
Verify Linux User Quota on Disk

如您所见,由于磁盘配额已超出限制,写操作文件失败。由于只有前1000 KB被写入磁盘,因此在这种情况下,最有可能会导致文件损坏。

类似地,您可以为开发人员组创建 ACL,以便该组成员对/home/projects具有 rwx 访问权限:

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

并使用以下命令设置配额限制:

# edquota -g developers

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

优雅期限可以通过执行

# edquota -t

并更新块优雅期和 Inode 优雅期下的值来指定任意秒、分钟、小时、天、周或月的时长。

与基于用户或组的块或 Inode 使用情况不同,优雅期是系统范围内设置的。

要报告配额情况,您可以使用quota -u [user]quota -g [group]进行快速列表,或者使用repquota -v [/path/to/filesystem]以获取更详细(冗长)和格式良好的报告。

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

总结

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

《配额简明指南》。

毋庸置疑,您也可以依靠我们来解答问题。只需使用下面的评论表单提交问题,我们将非常乐意帮助您。

Source:
https://www.tecmint.com/set-access-control-lists-acls-and-disk-quotas-for-users-groups/