使用時須留意重要細節
Linux檔案ACL設定範例(下)

2009-08-25
上一期文章介紹了Linux檔案ACL(Access Control List)基礎的設定方法與範例,本期將接著介紹較深入的ACL功能和注意事項,包括ACL應用在目錄的設定、Default ACL應用、ACL的mask用意、使用ACL與備份回存之相關議題、後續新增檔案系統使用ACL時的注意事項等等。
承接上一期內容,接下來示範ACL設定在目錄的情況,所有狀態讀者可參考網管人第42期「Linux檔案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」右邊多了個+號。

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

如果藉由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/」,皆因權限不足而失敗。

Default ACL應用

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

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

使用指令「setfacl -m d:u:sunny:rwx acl_dir」設定此目錄的Default ACL,設定時的參數在u:sunny:rwx前面多了d:,就是Default ACL之意。接著,使用指令「getfacl acl_dir」觀察設定後的結果,發現多了default相關資訊。

接下來,先用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詳細資訊。

ACL mask說明

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

其他實際上運用的問題

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

搭配SGID應用在目錄

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

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

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

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

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

備份(回存)指令能否保留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」等指令)。

拷貝有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設定。

使用指令「tune2fs -l /dev/xvdb1 | grep 'Default mount'」會觀察到「後來」新增的檔案系統,預設掛載並未使用acl選項。而相同的指令使用在根目錄「/dev/VolGroup00/LogVol00」,則會觀察到「acl」選項(英文字母小寫acl)。

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

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


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!