ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 權限之外的細部權限設定。ACL 可以針對單一使用者,單一文件或目錄來進行 r,w,x 的權限規範,對於需要特殊權限的使用狀況非常有幫助。
那 ACL 主要可以針對哪些方面來控制權限呢?他主要可以針對幾個項目:
使用者 (user):可以針對使用者來設定權限;
羣組 (group):針對羣組爲對象來設定其權限;
默認屬性 (mask):還可以針對在該目錄下在建立新文件/目錄時,規範新數據的默認權限
如何設定 ACL 的特殊權限呢?特殊權限的設定方法有很多, 我們先來談談最常見的,就是針對單一使用者的設定方式:
# 1. 針對特定使用者的方式: # 設定規範:『 u:[使用者賬號列表]:[rwx] 』,例如針對 vbird1 的權限規範 rx : [root@www ~]# touch acl_test1 [root@www ~]# ll acl_test1 -rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1 [root@www ~]# setfacl -m u:vbird1:rx acl_test1 [root@www ~]# ll acl_test1 -rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1 # 權限部分多了個 + ,且與原本的權限 (644) 看起來差異很大!但要如何查閱呢? [root@www ~]# setfacl -m u::rwx acl_test1 [root@www ~]# ll acl_test1 -rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1 # 無使用者列表,代表設定該文件擁有者,所以上面顯示 root 的權限成爲 rwx 了! |
上述動作爲最簡單的 ACL 設定,利用『 u:使用者:權限 』的方式來設定的啦!設定前請加上 -m 這個選項。 如果一個文件設定了 ACL 參數後,他的權限部分就會多出一個 + 號了!但是此時你看到的權限與實際權限可能就會有點誤差! 那要如何觀察呢?就透過 getfacl 吧!
- getfacl 指令用法
[root@www ~]# getfacl filename 選項與參數: getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這裏就免去了選項的說明啊! # 請列出剛剛我們設定的 acl_test1 的權限內容: [root@www ~]# getfacl acl_test1 # file: acl_test1 <==說明文件名而已! # owner: root <==說明此文件的擁有者,亦即 ll 看到的第三使用者字段 # group: root <==此文件的所屬羣組,亦即 ll 看到的第四羣組字段 user::rwx <==使用者列表欄是空的,代表文件擁有者的權限 user:vbird1:r-x <==針對 vbird1 的權限設定爲 rx ,與擁有者並不同! group::r-- <==針對文件羣組的權限設定僅有 r mask::r-x <==此文件預設的有效權限 (mask) other::r-- <==其他人擁有的權限囉! |
上面的數據非常容易查閱吧?顯示的數據前面加上 # 的,代表這個文件的默認屬性,包括文件名、文件擁有者與文件所屬羣組。 底下出現的 user, group, mask, other 則是屬於不同使用者、羣組與有效權限(mask)的設定值。 以上面的結果來看,我們剛剛設定的 vbird1 對於這個文件具有 r 與 x 的權限啦!這樣看的懂嗎? 如果看的懂的話,接下來讓我們在測試其他類型的 setfacl 設定吧!
# 2. 針對特定羣組的方式: # 設定規範:『 g:[羣組列表]:[rwx] 』,例如針對 mygroup1 的權限規範 rx : [root@www ~]# setfacl -m g:mygroup1:rx acl_test1 [root@www ~]# getfacl acl_test1 # file: acl_test1 # owner: root # group: root user::rwx user:vbird1:r-x group::r-- group:mygroup1:r-x <==這裏就是新增的部分!多了這個羣組的權限設定! mask::r-x other::r-- |
基本上,羣組與使用者的設定並沒有什麼太大的差異啦!如上表所示,非常容易瞭解意義。不過,你應該會覺得奇怪的是, 那個 mask 是什麼東西啊?其實他有點像是『有效權限』的意思!他的意義是: 使用者或羣組所設定的權限必須要存在於 mask 的權限設定範圍內纔會生效,此即『有效權限 (effective permission)』 我們舉個例子來看,如下所示:
# 3. 針對有效權限 mask 的設定方式: # 設定規範:『 m:[rwx] 』,例如針對剛剛的文件規範爲僅有 r : [root@www ~]# setfacl -m m:r acl_test1 [root@www ~]# getfacl acl_test1 # file: acl_test1 # owner: root # group: root user::rwx user:vbird1:r-x #effective:r-- <==vbird1+mask均存在者,僅有 r 而已! group::r-- group:mygroup1:r-x #effective:r-- mask::r-- other::r-- |
您瞧,vbird1 與 mask 的集合發現僅有 r 存在,因此 vbird1 僅具有 r 的權限而已,並不存在 x 權限!這就是 mask 的功能了!我們可以透過使用 mask 來規範最大允許的權限,就能夠避免不小心開放某些權限給其他使用者或羣組了。 不過,通常鳥哥都是將 mask 設定爲 rwx 啦!然後再分別依據不同的使用者/羣組去規範她們的權限就是了。
例題:
將前一小節任務二中 /srv/projecta 這個目錄,讓 myuser1 可以進入查閱,但 myuser1 不具有修改的權力。
答: 由於 myuser1 是獨立的使用者與羣組,而 /srv 是附屬於 / 之下的,因此 /srv 已經具有 acl 的功能。 透過如下的設定即可搞定:
請注意,上述的 1, 3 步驟使用 myuser1 的身份,2步驟纔是使用 root 去設定的! |
上面的設定我們就完成了之前任務二的後續需求喔!這麼簡單呢!接下來讓我們來測試一下,如果我用 root 或者是 pro1 的身份去 /srv/projecta 增加文件或目錄時,該文件或目錄是否能夠具有 ACL 的設定? 意思就是說,ACL 的權限設定是否能夠被次目錄所『繼承?』先試看看:
[root@www ~]# cd /srv/projecta [root@www ~]# touch abc1 [root@www ~]# mkdir abc2 [root@www ~]# ll -d abc* -rw-r--r-- 1 root projecta 0 Feb 27 14:37 abc1 drwxr-sr-x 2 root projecta 4096 Feb 27 14:37 abc2 |
你可以明顯的發現,權限後面都沒有 + ,代表這個 acl 屬性並沒有繼承喔!如果你想要讓 acl 在目錄底下的數據都有繼承的功能,那就得如下這樣做了!
# 4. 針對預設權限的設定方式: # 設定規範:『 d:[ug]:使用者列表:[rwx] 』 # 讓 myuser1 在 /srv/projecta 底下一直具有 rx 的預設權限! [root@www ~]# setfacl -m d:u:myuser1:rx /srv/projecta [root@www ~]# getfacl /srv/projecta # file: srv/projecta # owner: root # group: projecta user::rwx user:myuser1:r-x group::rwx mask::rwx other::--- default:user::rwx default:user:myuser1:r-x default:group::rwx default:mask::rwx default:other::--- [root@www ~]# cd /srv/projecta [root@www projecta]# touch zzz1 [root@www projecta]# mkdir zzz2 [root@www projecta]# ll -d zzz* -rw-rw----+ 1 root projecta 0 Feb 27 14:57 zzz1 drwxrws---+ 2 root projecta 4096 Feb 27 14:57 zzz2 # 看吧!確實有繼承喔!然後我們使用 getfacl 再次確認看看! [root@www projecta]# getfacl zzz2 # file: zzz2 # owner: root # group: projecta user::rwx user:myuser1:r-x group::rwx mask::rwx other::--- default:user::rwx default:user:myuser1:r-x default:group::rwx default:mask::rwx default:other::--- |
透過這個『針對目錄來設定的默認 ACL 權限設定值』的項目,我們可以讓這些屬性繼承到次目錄底下呢