Linux的ACL是文件權限訪問的一種手段。當擁有者所屬組其他人(own,group,other)不能滿足給一個單獨的用戶設置單獨的權限時,ACL的出現就很好的解決了該問題。
比如其他用戶own,不屬於log文件的擁有者也不在log文件的所屬組中,而log文件對於其他人無法訪問,此時想單獨給own用戶開小灶,怎么辦呢?acl就是用來開小灶的,單獨給own用戶設置對log文件的權限,使得僅僅own用戶對於log文件有讀、寫或者執行的權限。
1、查看系統是否支持ACL?如何加載ACL屬性
我的系統根目錄掛載在/dev/mapper/centos-root目錄下,這時候我們就需要查看/dev/mapper/centos-root目錄是否支持ACL
因為我使用的系統是CentOS 7,而CentOS 7默認創建分區並寫入文件系統時附加上ACL屬性,所以我通過dmesg系統啟動信息,直接查到“SGI XFS with ACLs”。通過網上查找,可以使用dumpe2fs -h /dev/mapper/centos-root 來查看是否附加了ACL屬性。
接下來mount -o remount,acl 臨時開啟ACL屬性,vim /etc/fstab可以永久設置開機附加ACL屬性。
/etc/fstab文件用於在系統啟動時,自動將指定的文件系統掛載到指定的目錄。<file system> 表示要掛載的分區或者存儲設備,如U盤 <dir>表示存儲設備要掛載到哪個目錄下 <type>表示要掛載的分區或者存儲設備的文件系統類型,一般為ext2、ext3、ext4、xfs、ntfs......,其他的幾個參數可以依葫蘆畫瓢,當然這里需要在default加上逗號,acl , reboot重啟
2、如果沒有ACL屬性,需要手動安裝ACL包
首先配置國內yum源或者配置本地yum源,如果已經配置請自動過濾。
https://mirrors.huaweicloud.com/ 華為yum源配置地址
yum install libacl acl -y 安裝acl和libacl包,接着再安裝上面的操作設置開機自啟動ACL
3、ACL權限設置
Linux設置文件ACL權限是通過setfacl工具來設置的,通過getfacl工具來獲取ACL訪問控制列表
ls -l工具可以查看到文件所屬的九列權限,同時可以看到九列權限之后一位:如果是點(.)表示僅僅有九列權限,如果是+,表示除九列之外還有ACL權限,這時候就需要通過getfacl工具查看ACL權限
如果文件或者目錄存在ACL權限,那么通過九列權限來判斷用戶對文件是否有訪問權就不能一概而論了。下面解釋一下如何看這張表:
1> 表的前三列以#字號注釋,表示該三行是解釋說明的意思,不起作用
file:后面緊跟文件或者目錄名稱
owner:后面緊跟文件擁有者
group:后面緊跟文件所屬組
2>#字之后的每一行代表一條ACL規則
user::rwx user是用戶的意思(關鍵字);冒號(:)起到分隔的作用,分隔域;第一個冒號之后是用戶名;第二個冒號之后是熟悉的權限:r(讀)、w(寫)、x(執行)、-(無權限)
所以user:tel:rwx 表示用戶tel對目錄log有讀寫進入目錄的權限,盡管從九列來看tel屬於其他用戶,它應該僅僅有讀和進入目錄的權限,但因為log目錄設置了ACL規則,所以以ACL規則為主,而九列對tel用戶不起作用,但是對除tel的其他用戶(other列)還是有r-x的權限的
那么問題來了,user::rwx 兩個冒號之間啥都沒有事什么意思?缺省的是注釋owner:root用戶,所以全稱應該是user:root:rwx,只是在這里缺省了而已。
然后goup::r-x other::r-x 分別表示log目錄對所屬組root組有r-x權限,對其他用戶有r-x權限
其實,user::rwx介紹的ACL權限有點差錯!應該說只要文件或者目錄設置ACL權限,那么就以ACL權限為唯一權限了,本質上可以將九列理解為ACL規則一部分,ACL規則執行的順序是自上而下的執行,當tel用戶從user::rwx執行到user:tel:rwx時,符合規則,對應權限為rwx,那么后面的group::r-x other::r-x更本就沒有執行,ACL規則執行到符合規則的行就不執行后面的規則。
3>setfacl 工具設置ACL規則
setfacl [選項...] filename....
setfacl 命令之后你能說root組(假設root組為普通組,root在Linux中就是上帝,沒有訪問權限,root用戶也可以讀寫執行)有rwx的權限嗎?但實質上,這里的組rwx確是tel組的權限。你的第一眼看見+號,直接getfacl來查看權限,而不是依據九列權限來識別權限。(同時,這條命令看似有點多此一舉,因為tel用戶執行不到group:tel:rw-,但是tel組不一定只有tel用戶)
--modify=acl 修改文件或目錄的ACL規則 --modify的ACL規則可以設置多條,每條用逗號隔離開,setfacl文件也可以多個文件一起來修改
--modify-file=filename 從文件讀取ACL規則,並以此為模板修改文件權限
ACL規則的文件依據getfacl顯示模板,一條規則一行, --modify-file后面可以用絕對路徑也可以用的相對路徑
-x, --remove=acl 從ACL規則列表中移除某項規則
-X, --remove-file=filename 從文件讀取ACL規則並以此為模板批量移除ACL規則 (注意:從文件刪除ACL規則,需要對應到每條規則)
下面使用--remove=acl --remove-file=filename將上面建立的規則清空
-b,--remove-all 移除文件所有擴展的ACL規則
只有使用--remove-all移除acl規則,才能使ls -l log2011..log文件九項權限列之后的+號去除。否則,+號會讓你很慌。
最后一個setfacl參數是-R,--recursive 遞歸操作到所有的子目錄和文件
至於getfacl工具參數,基本上就沒啥好說的,getfacl filename...我想就夠用了
END