如何为用户和组设置访问控制列表 (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 的组,并添加用户 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
正如预期的那样,您可以将 /mnt/test/acl.txt 写入为 walterwhite 或 saulgoodman:
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 )的磁盘空间使用情况。
我们还可以设置 20 和 25 的限制作为该用户可以创建的文件数量的软限制和硬限制。
上面的命令将启动带有临时文件的文本编辑器($EDITOR),我们可以在其中设置前面提到的限制:
当用户达到默认的 900-block 或 20-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。
不用说,您也可以信赖我们来回答问题。只需使用下面的评论表提交它们,我们将非常乐意查看。