Linux 檔案 ACL(Access Control List)設定範例(下)

作者:徐秉義(Albert Hsu)

在本文上回介紹 Linux 檔案 ACL 基礎的設定方法與範例,接著在本文下回會介紹較深入的 ACL 功能以及注意事項,包括 ACL 用在目錄的設定、Default ACL 應用、ACL 的 mask 用意、使用 ACL 與備份回存之相關議題、後續新增檔案系統要使用 ACL 的注意事項等等。

ACL 範例(續)

接下來示範 ACL 設定在目錄的情況,所有狀態都承接上一期的內容。

目錄 ACL 用在使用者

由 albert 帳號示範,使用 ACL 方式調整某個目錄:
對 sunny 帳號由原先的唯讀權限改為完全控制;
對 kate  帳號由原先的唯讀權限改成無法讀取。

使用 albert 帳號執行指令「mkdir acl_dir」產生空白目錄、「ls -ld acl_dir」觀察權限值。

依照 Red Hat 預設狀況,此時若用 sunny、kate 身份來存取這個目錄時,應該僅有唯讀權限,而沒有寫入的權利,因為是第三層級 other 權限(r-x)。

使用指令「setfacl -m u:sunny:rwx acl_dir」設定給 sunny 這個 ACL 使用者 rwx 權利。

使用指令「setfacl -m u:kate:---  acl_dir」設定給 kate  這個 ACL 使用者 --- 權利。

設定好之後使用指令「getfacl acl_dir」觀察設定後的結果。

「ls -ld acl_dir」會在 rwxrwxr-x 右邊多了個 + 號。

r

換使用 sunny 身份來存取這個目錄,此時是可以完全控制這個目錄的,例如:
指令「touch ../albert/acl_dir/sunny_file」、「mkdir ../albert/acl_dir/sunny_dir」
指令「ls ../albert/acl_dir/」、「ls -l ../albert/acl_dir/」

r

換使用 kate 身份來存取這個目錄,此時是無法讀取、寫入及進入這個目錄的,例如:
指令「touch ../albert/acl_dir/kate_file」、「mkdir ../albert/acl_dir/kate_dir」
指令「cd ../albert/acl_dir/」
指令「ls ../albert/acl_dir/」、「ls -l ../albert/acl_dir/」皆因權限不足而失敗。

r

Default ACL 應用

使用 albert 帳號執行指令「mkdir acl_dir/sub_dir」產生子目錄、「touch acl_dir/sub_file」產生子資料,「ls -l acl_dir」觀察權限值。

此時會發現,除了第一層的 acl_dir 目錄有設定到 ACL 權限,其餘的子資料與子資料夾都不會繼承 ACL 設定;實質上 ACL 只有在第一層(有設定的那一層)才有效果,實用度會差蠻多的,我們可以利用設定 Default ACL 來提高實際應用時的便利性。

r

使用指令「setfacl -m d:u:sunny:rwx acl_dir」設定此目錄的 Default ACL,設定時的參數在 u:sunny:rwx 前面多了 d: 就是 Default ACL 之意。

使用指令「getfacl acl_dir」觀察設定後的結果(多了 default 相關資訊)。

r

接下來先用 albert 測試在 acl_dir 下產生子資料(或是子資料夾),並觀察繼承 acl_dir 設定的 Default ACL。

使用指令「touch acl_dir/sub_file2」產生子資料,
使用指令「mkdir acl_dir/sub_dir2」產生子資料夾

使用指令「ls -l acl_dir/」觀察到 sub_file2、sub_dir2 在權限的部份有+號,代表有設定 ACL,
使用指令「getfacl acl_dir/sub_dir2」觀察目錄 ACL 詳細資訊。

r

ACL mask 說明

比較要注意到的是使用指令「getfacl acl_dir/sub_file2」觀察檔案 ACL 詳細資訊時,實際有效果(effective)權限必須與 mask 做 AND 運算,這樣檔案產生時不會有執行檔案(權限 rwx 中的 x)的權利,而是只有 rw- 權限。

r

其他實際上運用的問題

ACL 實務上應用還存在一些問題,以及一些可行的解決方法,整理如下:

搭配 SGID 用在目錄

仔細觀察 sunny 在 acl_dir 產生的子資料夾,檔案的擁有者是 sunny、群組是 sunny,這樣導致 albert 存取此目錄的狀態變成了唯讀(是 Other 權限的關係)。

下圖是 albert 使用指令「ls -l acl_dir」觀察權限
使用指令「touch acl_dir/sunny_dir/albert_file」權限不足遭拒。

r

先前介紹 SGID 用在共享目錄設定,也可以應用在這邊,使用指令「chmod g+s acl_dir」設定這個目錄 SGID 權利。

r

之後用 sunny 身份在 acl_dir 下產生的檔案或目錄,利用 SGID 用在目錄的特性,這樣 albert 也能完全控制(是 Group 權限的關係)。

溫馨提示:SGID 應用在群組共享目錄的設定,請參考第 41 期的內容。

r

還記得 william 與 albert 同樣附屬於 it 群組嗎?這邊的設定若在加上指令「chgrp it acl_dir」這樣同 it 群組的 william 也可以完全控制。

溫馨提示:「chgrp it acl_dir」這個指令可以由 root 下達或是 albert 執行皆可,因為 albert 是 acl_dir 這個目錄的擁有者且附屬於 it 群組。

r

備份(回存)指令能否保留 ACL 設定

打包、拷貝、備份的應用程式像是 tar、rsync、cp、scp、cpio 等等不一定都能保留住 ACL 設定,通常是比較新版的 Linux 支援度會比較好才是,實際應用的時候最好還是先行測試備份回存看看,尤其是備份回存到不同的電腦主機或是不同檔案系統的時候,就更加要額外小心,有些 linux 預設不見得會將 ACL 功能啟用,如果遇到需要手動啟用時,需在 /etc/fstab 的第四個欄位加上 acl 選項(這個 acl 參數是小寫的英文字母),讓欲使用 ACL 功能的檔案系統掛載有 ACL 選項即可。

為了要測試這個狀態,我們給主機新增一顆硬碟 /dev/xvdb(筆者用 Xen 所以磁碟代號是 /dev/xvdb)並且 fdisk 切割、format 成 ext3、將 /dev/xvdb1 掛載到 /alberthsu 目錄且撰寫 /etc/fstab 描述主機狀態如下:(使用到 df、e2label /dev/xvdb1、cat /etc/fstab 等等指令)

r

拷貝有 ACL 設定的資料到『後來』新增的檔案系統會有狀況,例如:指令「cp -a /home/albert/acl_dir/sub_file2 /alberthsu/」出現『preserving permissions for `/alberthsu/sub_file2': Operation not supported』、『preserving ACL for `/alberthsu/sub_file2': Operation not supported』訊息,意思是 ACL 設定沒有存過去,原因是 /dev/xvdb1 這個檔案系統(掛載在 /alberthsu 目錄下)沒有啟用 ACL 功能,也就造成他無法保留 ACL 設定。

r

使用指令「tune2fs -l /dev/xvdb1 | grep 'Default mount'」會觀察到『後來』新增的檔案系統,預設掛載並未使用 acl 選項。

相同的指令用在根目錄 /dev/VolGroup00/LogVol00 會觀察到『acl』選項(英文字母小寫 acl)。

r

要讓後來新增的檔案系統支援 ACL 功能,就編輯 /etc/fstab 在 /dev/xvdb1(LABEL=/alberthsu)相關那一行的第四個欄位,在原先 defaults 後面加上 acl 選項(以逗點分隔並且是小寫的 acl),接著重新開機或是重新掛載 /dev/xvdb1 即可。

r

下圖為重新掛載 /dev/xvdb1 後(指令「mount -o remount /alberthsu」),拷貝資料過去能夠保留 ACL 設定的畫面。

r

 

Valid XHTML 1.0! Valid CSS! Get Firefox

Creative Commons License
This site is licensed under a Creative Commons Attribution 2.5 Taiwan License.