1、什麼是 ACL 權限?

比如有如下場景:

某大牛在QQ羣內直播講解Linux系統的權限管理,講解完之後,他在一個公有的Linux系統中創建了一個 /project 目錄,裏面存放的是課後參考資料。那麼 /project 目錄對於大牛而言是所有者,擁有讀寫可執行(rwx)權限,對於QQ羣內的所有用户他們都分配的一個所屬組裏面,也都擁有讀寫可執行(rwx)權限,而對於 QQ 羣外的其他人,那麼我們不給他訪問/project 目錄的任何權限,那麼 /project 目錄的所有者和所屬組權限都是(rwx),其他人權限無。

問題來了,這時候直播有旁聽的人蔘與(不屬於QQ羣內),聽完之後,我們允許他訪問/project目錄查看參考資料,但是不能進行修改,也就是擁有(r-x)的權限,這時候我們該怎麼辦呢?我們知道一個文件只能有一個所屬組,我們將他分配到QQ羣所在的所屬組內,那麼他擁有了寫的權限,這是不被允許的;如果將這個旁聽的人視為目錄/project 的其他人,並且將/project目錄的其他人權限改為(r-x),那麼不是旁聽的人也能訪問我們/project目錄了,這顯然也是不被允許的。怎麼解決呢?

Linux權限管理之ACL權限解讀_用户組

我們想想windows系統裏面給某個文件分配權限的辦法:

Linux權限管理之ACL權限解讀_用户組_02

如上圖,我們想要讓某個用户不具備某個權限,直接不給他分配這個目錄的相應權限就行了。那麼對應到Linux系統也是這樣,我們給指定的用户指定目錄分配指定的權限,也就是 ACL 權限分配。

2、查看分區 ACL 權限是否開啓:dump2fs

我們看某個文件(Linux系統中目錄也是文件,一切皆是文件)是否支持 ACL 權限,首先要看文件所在的分區是否支持 ACL 權限。

①、查看當前系統有哪些分區:df -h

Linux權限管理之ACL權限解讀_用户名_03

②、查看指定分區詳細文件信息:dumpe2fs -h 分區路徑

下面是查看 根分區/ 的詳細文件信息

Linux權限管理之ACL權限解讀_用户組_04

3、開啓分區 ACL 權限①、臨時開啓分區 ACL 權限
mount -o remount,acl /

重新掛載根分區,並掛載加入 acl 權限。注意這種命令開啓方式,如果系統重啓了,那麼根分區權限會恢復到初始狀態。

②、永久開啓分區 ACL 權限

一、修改配置文件 /etc/fstab

Linux權限管理之ACL權限解讀_用户名_05

上面是修改根分區擁有 acl 權限

UUID=490ed737-f8cf-46a6-ac4b-b7735b79fc63 /                       ext4    defaults,acl        1 1

二、重新掛載文件系統或重啓系統,使得修改生效

mount -o remount /
4、設定 ACL 權限:setfacl 選項 文件名

Linux權限管理之ACL權限解讀_用户名_06

①、給用户設定 ACL 權限:setfacl -m u:用户名:權限 指定文件名②、給用户組設定 ACL 權限:setfacl -m g:組名:權限 指定文件名

注意:我們給用户或用户組設定 ACL 權限其實並不是真正我們設定的權限,是與 mask 的權限“相與”之後的權限才是用户的真正權限,一般默認mask權限都是rwx,與我們所設定的權限相與就是我們設定的權限。mask 權限下面我們會詳細講解

範例:所有者root用户在根目錄下創建一個文件目錄/project,然後創建一個QQ羣所屬組,所屬組裏面創建兩個用户zhangsan和lisi。所有者和所屬組權限和其他人權限是770。

然後創建一個旁聽用户 pt,給他設定/project目錄的 ACL 為 r-x。

Linux權限管理之ACL權限解讀_文件名_07

目錄 /project 的所有者和所屬組其他人權限設定為 770。接下來我們創建旁聽用户 pt,並賦予 acl 權限 rx

Linux權限管理之ACL權限解讀_文件名_08

為了驗證 pt 用户對於 /project 目錄沒有寫權限,我們用 su 命令切換到 pt 用户,然後進入 /project 目錄,在此目錄下創建文件,看是否能成功:

Linux權限管理之ACL權限解讀_用户名_09

上面提示權限不夠,説明 acl 權限賦予成功,注意如下所示,如果某個目錄或文件下有 + 標誌,説明其具有 acl 權限。

Linux權限管理之ACL權限解讀_用户組_10

5、查看 ACL 權限:getfacl 文件名

Linux權限管理之ACL權限解讀_文件名_11

6、最大有效權限 mask

前面第4點我們講過,我們給用户或用户組設定 ACL 權限其實並不是真正我們設定的權限,是與 mask 的權限“相與”之後的權限才是用户的真正權限,一般默認mask權限都是rwx,與我們所設定的權限相與就是我們設定的權限。

我們通過 getfacl 文件名 也能查看 mask 的權限,那麼我們怎麼設置呢?

setfacl -m m:權限 文件名

Linux權限管理之ACL權限解讀_文件名_12

7、刪除 ACL 權限

①、刪除指定用户的 ACL 權限

setfacl -x u:用户名 文件名

②、刪除指定用户組的 ACL 權限

setfacl -x g:組名 文件名

③、刪除文件的所有 ACL 權限

setfacl -b 文件名
8、遞歸 ACL 權限

通過加上選項 -R 遞歸設定文件的 ACL 權限,所有的子目錄和子文件也會擁有相同的 ACL 權限。

setfacl -m u:用户名:權限 -R 文件名
9、默認 ACL 權限

如果給父目錄設定了默認的 ACL 權限,那麼父目錄中所有新建的子文件會繼承父目錄的 ACL 權限。

setfacl -m d:u:用户名:權限 文件名