存取控制清單(也稱為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,支持Access Control Lists是內置的。
在以下ext4文件系統中,我們可以看到ACL已經為/dev/xvda2啟用:
# tune2fs -l /dev/xvda2 | grep "Default mount options:"

如果上述命令未指示文件系統已掛載以支持ACL,則很可能是由於noacl選項存在於/etc/fstab中。
在這種情況下,請將其刪除,卸載文件系統,然後重新掛載,或者在保存更改到/etc/fstab後重新啟動系統。
在Linux中引入ACL
為了說明ACL的工作原理,我們將使用名為developers的群組,並將用戶walterwhite和saulgoodman(是的,我是《絕命毒師》的粉絲!)添加進去。
# groupadd developers # useradd walterwhite # useradd saulgoodman # usermod -a -G developers walterwhite # usermod -a -G developers saulgoodman
在繼續之前,讓我們驗證這兩個用戶是否已經被添加到developers群組中:
# id walterwhite # id saulgoodman

現在讓我們在/mnt下創建一個名為test的目錄,並在其中創建一個名為acl.txt的文件(/mnt/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
預期地,您可以作為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

到目前為止一切順利。然而,當我們需要為不在developers群組中的另一個用戶授予對/mnt/test/acl.txt的寫入訪問權限時,我們將很快看到問題。
標準的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

接下來,我們需要給其他人在/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使用的更多信息和示例,請參閱第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
然後檢查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),並帶有一個臨時文件,我們可以在其中設置前面提到的限制:

這些設置將導致在用戶gacanepa達到900-block或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
并更新块宽限期和Inode宽限期下的值。
与基于用户或组的块或Inode使用情况不同,宽限期是系统范围内设置的。
要报告配额情况,您可以使用quota -u [user]或quota -g [group]快速列出,或使用repquota -v [/path/to/filesystem]获取更详细(详细)和格式良好的报告。
当然,您会想要用特定的用户/组名称和要检查的文件系统替换[user],[group]和[/path/to/filesystem]。
摘要
在本文中,我们解释了如何为用户和组设置访问控制列表和磁盘配额。同时使用两者,您将能够更有效地管理权限和磁盘使用情况。
如果你想要了解更多關於配額的資訊,你可以參考在The Linux Documentation Project中的配額小指南。
當然,你也可以依賴我們來回答問題。只需要在下面的評論表格中提交問題,我們將很樂意為你解答。
Source:
https://www.tecmint.com/set-access-control-lists-acls-and-disk-quotas-for-users-groups/