如何为用户和组设置访问控制列表 (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 如何工作,我们将使用一个名为开发人员的组并向其中添加用户walterwhite和saulgoodman(是的,我是《绝命毒师》的粉丝!):
# 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
正如预期的那样,您可以以walterwhite或saulgoodman 的身份写入/mnt/test/acl.txt:
# 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(除非以其他方式覆盖,否则其内容将继承该 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
然后检查 usrquota 和 grpquota 选项是否存在于 mount 的输出中(见下文突出显示的部分):
# 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
我们将磁盘空间使用量的软限制设为 900,硬限制设为 1000块(1024 字节/块 * 1000 块 = 1024000 字节 = 1 MB )。
我们还可以对该用户可以创建的文件数量设置20和25的软限制和硬限制。
上述命令将启动文本编辑器($EDITOR)和一个临时文件,我们可以在其中设置前面提到的限制:
当用户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
如您所见,由于超出了磁盘配额,写入操作文件失败。由于只有前1000 KB被写入磁盘,因此在这种情况下,结果很可能是文件损坏。
类似地,您可以为开发人员组创建 ACL,以便授予该组成员对/home/projects的 rwx 访问权限:
# setfacl -m g:developers:rwx /home/projects/
并使用以下命令设置配额限制:
# edquota -g developers
就像我们之前对用户gacanepa所做的那样。
可以通过执行将宽限期指定为任意数量的秒数、分钟数、小时数、天数、周数或月数。
# edquota -t
并更新Block grace period 和 Inode grace period下的值。
与块或 inode 使用情况(根据用户或组设置)相反,宽限期是在系统范围内设置的。
要报告配额,您可以使用配额-u [user]
或quota -g [group]
快速列表或repquota -v [/path/to/filesystem]
更详细(详细)和格式良好的报告。
当然,您可能希望用您想要检查的特定用户 / 组名和文件系统来替换[user]
、[group]
和。[/path/to/filesystem]
概括
在本文中,我们解释了如何为用户和组设置访问控制列表和磁盘配额。使用这两种方法,您将能够更有效地管理权限和磁盘使用情况。
如果您想了解有关配额的更多信息,可以参考Linux 文档项目中的配额迷你操作指南。
不用说,您也可以指望我们回答您的问题。只需使用下面的评论表提交您的问题,我们非常乐意为您解答。