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

作者:徐秉義(Albert Hsu)

在上回介紹 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

溫馨提示:下圖跑 for 迴圈的時候,因為 albert 帳號已經建立,所以有『useradd: user albert exists』訊息。

r

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

r

群組建立

使用指令「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:

溫馨提示:新建立的群組,通常寫在 /etc/group 末端。

r

設定附屬群組

使用指令「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。

r

為求測試簡便而做的調整

本次測試期間,都是將檔案建立在 albert 帳號的家目錄,為了讓測試簡便,需要開放 albert 家目錄給別的帳號讀取(Read)及進入目錄(eXecute)權限

使用指令「su - albert」切換成 albert 身份。

接著用 albert 帳號執行指令「chmod 755 . 」來開放上述權限。

指令「ls -ld . 」觀察設定前後的差異,權限由 drwx------ 變成 drwxr-xr-x,這樣別的帳號才能夠讀取及進入 albert 家目錄。

溫馨提示:上述指令結尾的 . 是『現在所在的目錄』,albert 登入的時候會位於他的家目錄也就是 /home/albert,所以剛剛輸入成「chmod 755 /home/albert」、「ls -ld /home/albert」是有同樣效果的。

r

ACL 範例

接下來先示範 ACL 設定在一般檔案的情況,設定在目錄的範例內容則由下一期來介紹。

溫馨提示:底下都是使用指令「su - 帳號」(例如:「su - sunny」)方式來切換成對應的使用者帳號,如果是用 root 身份切換過去,這樣也不用替使用者設定密碼了。

檔案 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-- 右邊多了個 + 號。

r

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

r

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

r

溫馨提示:上述指令用到的 .. 是『所在目錄的上一層目錄』,例如:sunny 登入時會位於他的家目錄 /home/sunny,此時 .. 這個目錄就是上一層的 /home 目錄,所以剛剛若是輸入「vim /home/albert/acl_file」也是有同樣效果。

setfacl 與 getfacl 指令使用說明

以「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 說明的相當清楚。

r

至於筆者的翻譯方式,以下表格提供參考,有時中文翻譯若不是很貼切,我們就直接使用原文會比較好些。

 

Owner擁有者
Named userACL 帳號
Owner group所屬群組
Named groupACL 群組
Mask遮罩
Others其他帳號

在加入 named user 後的權限比對流程

在尚未使用 ACL 之前,比對的流程如下:

是否為檔案的擁有者,是的話為採 user(owner)那段的權限;

是否為檔案的群組或是附屬群組,是的話為採 group 那段的權限;

上述兩者都不是,但是有系統帳號者,採 other 那段的權限。

有使用 ACL named user 之後的比對流程如下:

是否為檔案的擁有者,是的話為採 user(owner)那段的權限;

是否為檔案的 ACL 使用者,是的話為採 named user(ACL 使用者)設定的權限;

是否為檔案的群組或是附屬群組,是的話為採 group 那段的權限;

上述三者都不是,但是有系統帳號者,採 other 那段的權限。

溫馨提示:UID 為 0(零)是最高權限的帳號(通常叫做 root)不受限於這個比對流程。

如何移除 ACL 設定

介紹完設定 ACL 後接著介紹移除 ACL 的方法,是使用 setfacl 指令 -x 選項,同樣是由 albert 帳號示範如下:

使用指令「setfacl -x u:sunny acl_file」即可移除設定給 sunny 這個 named user 的 ACL 權利。

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

r

針對 kate 這個 named user 要移除 ACL 設定也是同樣的方法,

使用指令「setfacl -x u:kate acl_file」即可移除設定給 kate 這個 named user 的 ACL 權利。

r

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

溫馨提示:關於 ACL 的 mask 會在下一期介紹。

r

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

r

溫馨提示:以上 setfacl 指令的詳細選項請參考「man setfacl」說明文件。

 

Valid XHTML 1.0! Valid CSS! Get Firefox

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