在上回介紹 Linux 檔案的權限管理是『擁有者、群組與附屬群組、其他人』三個層級方式後,這次介紹的是 Linux 檔案 ACL(Access Control List)。
ACL 功能可針對不同的使用者(或是不同的群組)給予不同的權限,這樣使得設定權限功能更加強大且有彈性。
使用於 ACL 的主要指令有「getfacl」與「setfacl」這兩個,getfacl 用來取得檔案 ACL 狀態;setfacl 用來設定檔案 ACL。
在 RHEL5 灌好以後就直接可以使用這兩個指令,來實做 ACL 功能,在此先準備測試的環境如下:
我們會建立六個帳號,albert、william、sunny、lisa、kate 以及 judy,依照 Red Hat Linux 預設的建立方式。
我們會建立三個群組,it、sales 以及 hr 他們的 GID(群組ID)分別為 50000、50001 以及 50002。
我們會設定 albert 與 william 附屬於 it 群組;sunny 與 lisa 附屬於 sales 群組;kate 與 judy 附屬於 hr 群組。
接下來在設定 ACL 權限的期間,是把剛剛建立的 albert、sunny 與 kate 帳號分別用來當成附屬於 it、sales 以及 hr 群組的代表帳號。
我們可以用 useradd 指令執行六次分別建立六個帳號,例如:「useradd albert」來建立 albert 帳號;也可以用 for 迴圈的方式,批次建立六個帳號如下:
for i in albert william sunny lisa kate judy do useradd $i done

可使用 id 指令確認這些帳號是否正確建立;例如:指令「id albert」;也可以使用迴圈的方式批次檢查六個帳號(把先前迴圈的 useradd 改成 id 即可)。

使用指令「groupadd -g 50000 it」建立 it 群組,其群組 ID 為 50000。
使用指令「groupadd -g 50001 sales」建立 sales 群組,其群組 ID 為 50001。
使用指令「groupadd -g 50002 hr」建立 hr 群組,其群組 ID 為 50002。
使用指令「tail /etc/group」觀察群組設定檔案的末端,可以看到建立後的 /etc/group 檔案內容多了三行。
前段省略 ... it:x:50000: sales:x:50001: hr:x:50002:

使用指令「vigr」設定附屬群組,設定好之後用「Esc :wq」存檔離開(這是 vi 存檔離開的方式),問到是否需要編輯 /etc/gshadow 時直接按下 Enter 即可。
/etc/group 修改後的內容如下:
前段省略 ... it:x:50000:albert,william sales:x:50001:sunny,lisa hr:x:50002:kate,judy
改好之後二度觀察 /etc/group 檔案末端以及用 id 指令來驗證改好後的結果,例如:『groups=500(albert),50000(it)』這邊會增加附屬群組 it。

本次測試期間,都是將檔案建立在 albert 帳號的家目錄,為了讓測試簡便,需要開放 albert 家目錄給別的帳號讀取(Read)及進入目錄(eXecute)權限
使用指令「su - albert」切換成 albert 身份。
接著用 albert 帳號執行指令「chmod 755 . 」來開放上述權限。
指令「ls -ld . 」觀察設定前後的差異,權限由 drwx------ 變成 drwxr-xr-x,這樣別的帳號才能夠讀取及進入 albert 家目錄。

接下來先示範 ACL 設定在一般檔案的情況,設定在目錄的範例內容則由下一期來介紹。
首先由 albert 帳號示範,使用 ACL 方式調整某個檔案:
對 sunny 帳號由原先的唯讀權限改為讀取及寫入;
對 kate 帳號由原先的唯讀權限改成無法讀取。
使用 albert 帳號執行指令「touch acl_file」產生空白檔案、「ls -l acl_file」觀察權限值。
依照 Red Hat 預設狀況,此時若用 sunny、kate 身份來編寫這個檔案時,應該僅僅有讀取權限,而沒有寫入以及執行的權利,因為是第三層級 other 權限(r--)。
使用指令「setfacl -m u:sunny:rw- acl_file」設定給 sunny 這個 ACL 使用者 rw- 權利。
使用指令「setfacl -m u:kate:--- acl_file」設定給 kate 這個 ACL 使用者 --- 權利。
設定好之後使用指令「getfacl acl_file」觀察設定後的結果。
「ls -l acl_file」會在 rw-rw-r-- 右邊多了個 + 號。

換使用 sunny 身份來編寫這個檔案,此時是可以讀取及寫入這個檔案的,例如:指令「vim ../albert/acl_file」、「echo sunny >> ../albert/acl_file」、「cat ../albert/acl_file」

換使用 kate 身份來編寫這個檔案,此時是無法讀取及寫入這個檔案的,例如:指令「vim ../albert/acl_file」、「echo kate >> ../albert/acl_file」、「cat ../albert/acl_file」皆因權限不足而失敗。

以「setfacl -m u:sunny:rw- acl_file」指令為例,setfacl 的 -m 選項是 modify 的意思,用來增加 ACL 的;接著 u 是 user 的意思,然後是帳號名稱 sunny ,再來是賦予的權限 rw-。
再來是「getfacl acl_file」所輸出的內容(解說於 # 符號後):
# file: acl_file # owner: albert # group: albert user::rw- user:sunny:rw- # 給 sunny 這個 named user 是 rw- 權利 user:kate:--- # 給 kate 這個 named user 是 --- 權利 group::rw- mask::rw- other::r--
英文原文稱上述範例中的 sunny 與 kate 這種 ACL 帳號為 named user 若是設定 ACL 群組則稱為 named group,關於 named user、named group 的『named』這部份似乎沒有比較統一或貼切的中文翻譯方式,不如就繼續使用英文的說法。
筆者在『http://www.suse.de/~agruen/acl/linux-acls/online/』這篇文章中,發現這個表格對於 ACL Entries 說明的相當清楚。

至於筆者的翻譯方式,以下表格提供參考,有時中文翻譯若不是很貼切,我們就直接使用原文會比較好些。
| Owner | 擁有者 |
| Named user | ACL 帳號 |
| Owner group | 所屬群組 |
| Named group | ACL 群組 |
| Mask | 遮罩 |
| Others | 其他帳號 |
在尚未使用 ACL 之前,比對的流程如下:
是否為檔案的擁有者,是的話為採 user(owner)那段的權限;
是否為檔案的群組或是附屬群組,是的話為採 group 那段的權限;
上述兩者都不是,但是有系統帳號者,採 other 那段的權限。
有使用 ACL named user 之後的比對流程如下:
是否為檔案的擁有者,是的話為採 user(owner)那段的權限;
是否為檔案的 ACL 使用者,是的話為採 named user(ACL 使用者)設定的權限;
是否為檔案的群組或是附屬群組,是的話為採 group 那段的權限;
上述三者都不是,但是有系統帳號者,採 other 那段的權限。
介紹完設定 ACL 後接著介紹移除 ACL 的方法,是使用 setfacl 指令 -x 選項,同樣是由 albert 帳號示範如下:
使用指令「setfacl -x u:sunny acl_file」即可移除設定給 sunny 這個 named user 的 ACL 權利。
設定好之後使用指令「getfacl acl_file」觀察設定後的結果。

針對 kate 這個 named user 要移除 ACL 設定也是同樣的方法,
使用指令「setfacl -x u:kate acl_file」即可移除設定給 kate 這個 named user 的 ACL 權利。

因為還有個 ACL 的 mask 設定導致「ls -l acl_file」依然有個 + 號,看不順眼要移掉的話,使用指令「setfacl -x m acl_file」。

先前如果是想要一次移除所有 ACL entries 的話,setfacl 提供 -b 選項用來移除所有 ACL entries,例如:使用指令「setfacl -b acl_file」。
