一、什麼是ACL
ACL是linux系統中一種被稱爲訪問控制列表的權限控制方法,它是一種權限分配之外的普遍範式。在一般情況下,要確認三個權限組:owner、group和other。而使用ACL則可以增加權限給其他用戶或組別,不再僅僅是在“other”中定義權限,可以允許指定的用戶擁有不同於其所屬組的權限。
ACL支持多種Linux文件系統,包括ext2, ext3, ext4, XFS,
Btfrs, 等。CentOS6及之前的版本,僅操作系統安裝時創建的文件系統纔會默認開啓ACL,手工創建的文件系統,需要手工開啓ACL功能。
二、啓動ACL的方法
mount -o acl /dev/sda7 取消的方式,重新掛載時不指定即可
tune2fs -o acl /dev/sda7 取消的方式 tune2fs -o ^acl /dev/sda7
以上兩種方式開啓的ACL可以通過mount查看是否開啓ACL。
三、ACL權限判斷的順序
先判斷是否是文件的OWNER,如果是,則執行OWNER的權限後結束,如果不是OWNER,則判斷是否是ACL的USER,如果是則執行USER權限後結束,如果不是ACL的USER, 則判斷是否屬於GROUP或ACL GROUP,如果是,則取最大權限(即兩者權限的合集)。如果不屬於任何GROUP,則執行OTHER。
四、命令示例
基礎ACL通過兩條命令管理:setfacl用於增加或者修改ACL,getfacl用於顯示分配完的ACL。
命令語法:1、setfacl -m u:username:—[, u:username:—]file[direct](中括號表示可選擇)作用:設置ACL USER
2、getfacl file[direct] 作用:查看指定文件的ACL設置
示例:首先在/app目錄下創建testdir目錄,並在該目錄下分別創建目錄dir和文件file(便於區分),新創建的文件其用戶和用戶組均爲root,先要將testdir目錄分享給sky用戶,併爲其分配rx權限,結果如下圖所示。
命令語法:setfacl -m g:groupname:— file[direct] 作用:設置ACL GROUP
示例:設置用戶組big對於testdir具有寫的權限,big用戶組中的輔助組成員有mu用戶,結果如下圖所示。
命令語法:setfacl –Rm u:username:— direct/direct[file] 作用:遞歸設置
示例:設置用戶wind對於testdir及其目錄下的文件具有讀寫以及執行的權限,結果如下圖所示。
命令語法:setfacl -m d: u:username:— direct/direct[file] 作用:設置ACL默認權限,僅影響新創建的文件及目錄,不影響當前。
示例:要求guanyu用戶對testdir目錄及所有用戶在其下創建的新文件新目錄均有rwx權限,結果如下圖所示:
命令語法:getfacl -R /direct > filetxt 作用:將目錄下的所有文件的ACL屬性備份到文件(-R在此處仍是遞歸的作用)
示例:將testdir/dir的ACL屬性備份到acltxt文件中,結果如下圖所示。
命令語法:setfacl -x u:username direct[file] 作用:單獨去除一條ACL權限
示例:刪除guanyu用戶的ACL權限
結果顯示刪除成功。
命令語法:setfacl -X aclrm.txt direct[file]
aclrm.txt 內容如下
u:username
g:groupname
結果顯示刪除成功。
命令語法:setfacl -b file 作用:去除該文件上ACL屬性。
結果顯示刪除成功。
命令語法:setfacl -x d:name direct[file] 作用:刪除一條默認權限
setfacl -x g:groupname direct[file] 刪除一條非默認組的權限(不加d即可)
結果顯示刪除成功。
命令語法:setfacl -k direct[file] 作用:刪除全部默認權限
結果顯示刪除成功。
命令語法:setfacl -b direct[file] 作用:刪除ACL屬性
結果顯示刪除成功。
命令語法:
setfacl -R
–set-file=acl.txt direct[file] 作用:通過文件還原ACL屬性的方法1
setfacl –restore
acl.txt 通過文件還原ACL屬性的方法2
結果顯示還原成功。
從以上的結果顯示中,我們會發現有一個mask的值,那麼mask的作用是什麼呢?讓我們來做一個實驗:首先在之前設置的基礎上將testdir的所有者改爲mu用戶,所有組同樣改爲mu,因爲root用戶是超級管理員,其權限最大,爲避免因爲root用戶權限過大而出現影響實驗結果的現象所以將文件所有者改爲普通用戶。然後我們設置mask的值爲wx,其語法命令格式與上述的設置用戶的權限類似:setfacl -m mask:—
file[direct],然後查看不同用戶對於testdir的權限變化,結果如下圖所示。
顯而易見,之前的mask值爲rwx,在將mask值修改爲wx之後我們看到方框標誌的兩部分出現了明顯的不同,sky、wind以及group的權限後面均產生新的權限,而big用戶組因爲其之前的權限與mask相同,所以沒有發生變化。那麼不同用戶的真正權限是保持之前的還是與#effective的提示相同呢,我們可以來具體的測試一下:
首先使用測試文件所有者的權限是否變化,結果如下圖所示。
由此可見,mask的值並未影響到文件所有者的權限。
接下來我們來驗證sky用戶的權限,結果如下圖所示。
結果顯示,sky用戶僅僅可以進入testdir目錄,讀寫權限均沒有,僅有執行權限。這樣是不是驗證#effective顯示的權限就是用戶或用戶組的實際權限,我想我們還是需要一一驗證一下。
此結果顯示的是wind用戶對於testdir的權限,由結果顯示可知,wind用戶對於testdir的權限是wx。最後我們來驗證一下文件所屬組的權限,首先我們將新建一個用戶使其成爲用戶組mu的輔助成員,但對於testdir並沒有其他權限,從而完全繼承mu用戶組的權限以便於驗證,結果如下圖所示。
由結果可以看出用戶xm的權限僅有執行權限,讀寫權限均沒有。
現在,我們已經將受mask值影響的用戶及用戶組的權限一一驗證過,由此可以得出以下結論:
1、mask值對於文件所有者的權限並不產生影響;
2、mask對除了文件所有者之外的用戶或者用戶組產生權限的影響;
3、被影響的用戶或用戶組的最大權限不能超過mask設置的權限,即其真正權限爲自身原設置的權限與mask值的交集。
【補充】1、ACL MASK隨着新的ACL設置會被重置,重置的標準是讓該文件上的所有ACL及文件原GROUP上的權限都有效,所以一般情況下都是將所有的ACL設置完成之後再最後設置mask的值。
2、修改mask值的方法有兩種,除了上述提到過的setfacl -m mask:—
file[direct],還有chmod g=rwx file[direct]這種方法,因爲一旦設置了ACL權限後,原有的文件GROUP不可再更改,但權限並沒有失效,使用chmod即修改ACL MASK,且在使用ll命令查看文件的權限時,在原來group的權限位置上顯示的也是mask的權限值,只有當取消ACL之後纔會顯示真正的group權限。
總結:雖然增加了很多示例,但是希望讀者可以自己也做一些相關的實驗,編者的角度畢竟也是僅僅從個人的學習角度出發,並不能涵蓋所有的方面,有些問題可能解釋的並不完美,同時也存在一些暫時沒有發現的問題。Linux的學習需要學習他人的經驗,但更需要個人的練習以及個人的思考,加油每一個學習linux的朋友!