首先咱們來了解下權限,在Linux裏常規的權限有r(讀)w(寫)x(執行),特殊權限有SUID,SGID,Sticky權限,分別做用在文件(或目錄)的全部者,所屬組,和其餘(既不是全部者,也不是所屬組的其餘用戶)上。在沒有acl以前,咱們只能對文件或目錄進行全部者,所屬組,或其餘用戶進行受權。這樣受權不是很靈活,好比我想在不影響原有的權限外單獨給某一個用戶受權,該怎麼作呢?acl就提供了這樣的功能,打破了傳統受權的不靈活性。acl實現了靈活的權限管理,除了文件的全部者,所屬組,和其餘人受權外,它還能夠對更多的用戶設置權限。ACL功能依賴文件系統,centos7默認建立的xfs和ext4文件系統,這兩個文件系統都具備ACL功能,在7以前的版本,若是是手工建立的ext4文件系統,須要使用到ACL功能就須要手動添加。添加命令以下,有關SUID,SGID,Sticky權限介紹請參考:http://www.javashuo.com/article/p-aannuici-by.htmlhtml
tune2fs -o acl /dev/sdb1 mount -o acl /dev/sdb1 /mnt/test
說明:tune2fs命令是針對ext系列文件系統命令,在xfs文件系統上不能查看文件系統參數,只能在ext系列文件系統上使用。web
接下來介紹兩個命令的使用,getfacl、setfaclcentos
getfacl:查看文件的acl權限列表bash
用法:ui
Usage: getfacl [-aceEsRLPtpndvh] file ...
經常使用選項: centos7
-a, --access 僅顯示文件訪問控制列表
-d, --default 只顯示默認的訪問控制列表
-c, --omit-header 不顯示註釋頭
-e, --all-effective 打印全部有效權限
-E, --no-effective 打印無效權限orm
-R, --recursive 遞歸到子目錄htm
[root@test ~]$setfacl -dm u:qiuhom:rwx xx [root@test ~]$ [root@test ~]$getfacl xx # file: xx # owner: root # group: root user::rwx user:tom:rwx group::r-x mask::rwx other::r-x default:user::rwx default:user:qiuhom:rwx default:group::r-x default:mask::rwx default:other::r-x [root@test ~]$getfacl -a xx # file: xx # owner: root # group: root user::rwx user:tom:rwx group::r-x mask::rwx other::r-x [root@test ~]$getfacl -d xx # file: xx # owner: root # group: root user::rwx user:qiuhom:rwx group::r-x mask::rwx other::r-x [root@test ~]$getfacl -c xx user::rwx user:tom:rwx group::r-x mask::rwx other::r-x default:user::rwx default:user:qiuhom:rwx default:group::r-x default:mask::rwx default:other::r-x [root@test ~]$getfacl -e xx # file: xx # owner: root # group: root user::rwx user:tom:rwx #effective:rwx group::r-x #effective:r-x mask::rwx other::r-x default:user::rwx default:user:qiuhom:rwx #effective:rwx default:group::r-x #effective:r-x default:mask::rwx default:other::r-x [root@test ~]$getfacl -E xx # file: xx # owner: root # group: root user::rwx user:tom:rwx group::r-x mask::rwx other::r-x default:user::rwx default:user:qiuhom:rwx default:group::r-x default:mask::rwx default:other::r-x [root@test ~]$getfacl -R xx # file: xx # owner: root # group: root user::rwx user:tom:rwx group::r-x mask::rwx other::r-x default:user::rwx default:user:qiuhom:rwx default:group::r-x default:mask::rwx default:other::r-x # file: xx/aac # owner: root # group: root user::rw- user:tom:rwx group::r-- mask::rwx other::r-- # file: xx/aad # owner: root # group: root user::rw- user:tom:rwx group::r-- mask::rwx other::r-- # file: xx/abc # owner: root # group: root user::rw- user:qiuhom:rwx user:tom:rwx group::r-x mask::rwx other::r-- # file: xx/aab # owner: root # group: root user::rw- user:tom:rwx group::r-- mask::rwx other::r-- [root@test ~]$
setfacl :設置文件的acl權限列表blog
用法:繼承
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
經常使用選項:
-m: --modify=acl 修改文件的當前的acl(在沒有設置ACL的文件上使用就表示添加ACL)
[root@test ~]$ll total 4 -r--r----- 1 root root 18 Oct 29 18:07 test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- group::r-- other::--- [root@test ~]$setfacl -m u:qiuhom:rwx test.txt [root@test ~]$ll total 4 -r--rwx---+ 1 root root 18 Oct 29 18:07 test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:qiuhom:rwx group::r-- mask::rwx other::--- [root@test ~]$setfacl -m u:qiuhom:w test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:qiuhom:-w- group::r-- mask::rw- other::--- [root@test ~]$
說明:在設置添加acl的文件後,用ls -l 能夠看到權限位最後多了一個+,這個加號表示該文件有acl權限。getfacl命令是專門查看文件的acl詳情。
-M, --modify-file=file 批量設置指定文件裏的acl權限。
[root@test ~]$ls test.txt [root@test ~]$cat >xx.acl u:qiuhom:rw g:root:rx ^C [root@test ~]$cat xx.acl u:qiuhom:rw g:root:rx [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:qiuhom:-w- group::r-- mask::rw- other::--- [root@test ~]$setfacl -M xx.acl test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:qiuhom:rw- group::r-- group:root:r-x mask::rwx other::--- [root@test ~]$
說明:在用-M指定文件的時候,文件內容是一行對應一條acl權限,內容只須要咱們但願設置的用戶或組的acl權限。
-x, --remove=acl 刪除指定的acl權限
[root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:qiuhom:rw- group::r-- group:root:r-x mask::rwx other::--- [root@test ~]$setfacl -x u:qiuhom test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- group::r-- group:root:r-x mask::r-x other::--- [root@test ~]$
說明:刪除acl權限 只指定用戶或者組,不須要指定對應的權限
-X, --remove-file=file 刪除指定文件內容的acl權限
[root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:tom:rw- user:jerry:--x group::r-- group:root:r-x mask::rwx other::--- [root@test ~]$cat > xxx.acl u:tom u:jerry g:root ^C [root@test ~]$cat xxx.acl u:tom u:jerry g:root [root@test ~]$setfacl -X xxx.acl test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- group::r-- mask::r-- other::--- [root@test ~]$
說明:和批量增長acl同樣,這個指定的文件裏面只須要喜愛須要刪除acl就好,一行一個acl權限。和單端刪除acl同樣,不須要寫明對應的權限。
-b, --remove-all 清空文件的acl權限列表
[root@test ~]$setfacl -m u:tom:rwx test.txt [root@test ~]$setfacl -m u:jerry:rwx test.txt [root@test ~]$setfacl -m g:tom:r test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:tom:rwx user:jerry:rwx group::r-- group:tom:r-- mask::rwx other::--- [root@test ~]$setfacl -b test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- group::r-- other::--- [root@test ~]$
-d, --default 設置默認的acl(這個選項只用於對目錄的設定)
[root@test ~]$mkdir xx [root@test ~]$getfacl xx # file: xx # owner: root # group: root user::rwx group::r-x other::r-x [root@test ~]$setfacl -d -m u:qiuhom:rwx xx [root@test ~]$getfacl xx # file: xx # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:user:qiuhom:rwx default:group::r-x default:mask::rwx default:other::r-x [root@test ~]$cd xx/ [root@test xx]$touch abc [root@test xx]$getfacl abc # file: abc # owner: root # group: root user::rw- user:qiuhom:rwx #effective:rw- group::r-x #effective:r-- mask::rw- other::r-- [root@test xx]$
說明:用-d指定了默認的acl權限後,文件的acl權限列表裏多了幾項default,對目錄設置了默認acl權限後,在其目錄下新建的文件將繼承該目錄設置的默認acl權限列表(若新建的是文件x權限將不繼承,若新建的是目錄將所有繼承)。
-k, --remove-default 刪除默認的acl權限
[root@test ~]$getfacl xx/ # file: xx/ # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:user:qiuhom:rwx default:group::r-x default:mask::rwx default:other::r-x [root@test ~]$setfacl -k xx/ [root@test ~]$getfacl xx # file: xx # owner: root # group: root user::rwx group::r-x other::r-x [root@test ~]$getfacl xx/abc # file: xx/abc # owner: root # group: root user::rw- user:qiuhom:rwx #effective:rw- group::r-x #effective:r-- mask::rw- other::r-- [root@test ~]$
[root@test ~]$setfacl -dm u:tom:rwx xx [root@test ~]$setfacl -dm g:jerry:wx xx [root@test ~]$setfacl -m u:tom:r xx [root@test ~]$getfacl xx # file: xx # owner: root # group: root user::rwx user:tom:r-- group::r-x mask::r-x other::r-x default:user::rwx default:user:tom:rwx default:group::r-x default:group:jerry:-wx default:mask::rwx default:other::r-x [root@test ~]$setfacl -k xx [root@test ~]$getfacl xx # file: xx # owner: root # group: root user::rwx user:tom:r-- group::r-x mask::r-x other::r-x [root@test ~]$
說明:刪除默認的acl權限後,不影響其目錄下已經存在的文件的acl權限,此選項刪除-d指定的默認acl權限,使用-k選項能夠不用指定其權限,只要是默認的acl他都將清除。
--set=acl 設置acl權限,覆蓋已有的acl權限
[root@test ~]$setfacl -m u:tom:rw test.txt [root@test ~]$setfacl -m g:tom:r test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:tom:rw- group::r-- group:tom:r-- mask::rw- other::r-- [root@test ~]$setfacl --set u::r,g::r,o::-,u:qiuhom:rwx test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:qiuhom:rwx group::r-- mask::rwx other::--- [root@test ~]$
[root@test ~]$setfacl --set g:tom:rx test.txt setfacl: test.txt: Malformed access ACL `group:tom:r-x,mask::r-x': Missing or wrong entry at entry 1 [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::r-- user:qiuhom:rwx group::r-- mask::rwx other::--- [root@test ~]$setfacl --set u::rw,g::rw,o::rw test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- group::rw- other::rw- [root@test ~]$
說明:使用--set選項設置權限,須要設置,包括全部者,所屬組,其餘用戶的權限都設置才能夠,不然提示缺乏權限,不讓設置,固然咱們只設置全部者,所屬組,和其餘,的權限,就至關於-b選項清空acl權限。
設置修改acl權限的mask權限。看下面的例子你就會明白mask究竟是幹嗎用的了。
[root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:qiuhom:rwx group::rw- mask::rwx other::rw- [root@test ~]$setfacl -m mask::r test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:qiuhom:rwx #effective:r-- group::rw- #effective:r-- mask::r-- other::rw- [root@test ~]$
說明:心細的你必定發現,後面的acl列表裏多了兩條註釋的東西,這究竟是什麼呢?查閱了下字典,它說的意思是有效的。不難理解它想表達的意思是,咱們雖然設置了qiuhom用戶對文件的acl權限是rwx,可是有效的權限只有r生效。這到底爲何呢? 對,這就是mask的做用,它能夠很好的限制文件的最大權限。它的做用只能限制除全部者和other以外的人和組的最大權限。也就是說自定義用戶和組的權限必須存在mask權限設定的範圍內纔會生效。mask須要與咱們設置的用戶權限進行邏輯與運算後才能才能變成有效的權限。
[root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:qiuhom:r-- user:jerry:rwx group::r-- group:tom:rw- mask::rwx other::--- [root@test ~]$ll test.txt -rw-rwx---+ 1 root root 0 Oct 29 18:39 test.txt [root@test ~]$chmod g=rw test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:qiuhom:r-- user:jerry:rwx #effective:rw- group::r-- group:tom:rw- mask::rw- other::--- [root@test ~]$
說明:咱們修改mask的權限也能夠經過修改文件的屬組權限來修改mask權限。這裏須要注意的是,在沒有設置acl的文件上用以上方法是修改文件屬組的權限,在擁有acl後,以上方法就是修改mask的權限,並不是文件屬組權限。
-R, --recursive 遞歸設置acl權限
[root@test ~]$ll xx total 0 -rw-r--r-- 1 root root 0 Oct 29 19:25 aab -rw-r--r-- 1 root root 0 Oct 29 19:25 aac -rw-r--r-- 1 root root 0 Oct 29 19:25 aad -rw-rw-r--+ 1 root root 0 Oct 29 18:47 abc [root@test ~]$getfacl xx/aab xx/aac xx/aad # file: xx/aab # owner: root # group: root user::rw- group::r-- other::r-- # file: xx/aac # owner: root # group: root user::rw- group::r-- other::r-- # file: xx/aad # owner: root # group: root user::rw- group::r-- other::r-- [root@test ~]$setfacl -R -m u:tom:rwx xx [root@test ~]$getfacl -R xx # file: xx # owner: root # group: root user::rwx user:tom:rwx group::r-x mask::rwx other::r-x # file: xx/aac # owner: root # group: root user::rw- user:tom:rwx group::r-- mask::rwx other::r-- # file: xx/aad # owner: root # group: root user::rw- user:tom:rwx group::r-- mask::rwx other::r-- # file: xx/abc # owner: root # group: root user::rw- user:qiuhom:rwx user:tom:rwx group::r-x mask::rwx other::r-- # file: xx/aab # owner: root # group: root user::rw- user:tom:rwx group::r-- mask::rwx other::r-- [root@test ~]$
說明:不少命令-R都有遞歸的意思,好比chmod -R chown -R 這些都是遞歸的意思,批量作一件事,這裏的setfacl 和getfacl 也是這個意思。
--set-file=file 從指定文件裏讀入要設置的acl權限
[root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:qiuhom:r-- user:jerry:rwx group::r-- group:tom:rw- mask::rwx other::--- [root@test ~]$getfacl test.txt >test.acl [root@test ~]$touch aa [root@test ~]$getfacl aa # file: aa # owner: root # group: root user::rw- group::r-- other::r-- [root@test ~]$setfacl --set-file test.acl aa [root@test ~]$getfacl aa # file: aa # owner: root # group: root user::rw- user:qiuhom:r-- user:jerry:rwx group::r-- group:tom:rw- mask::rwx other::--- [root@test ~]$
說明:--set-file實現了acl權限複製,備份,咱們能夠經過getfacl 把文件的acl導入到一個文件,而後用--set-file指定該文件 來設置其餘文件的acl,固然上面的命令有些羅嗦,咱們能夠用一條命令搞定。以下:
[root@test ~]$setfacl -b test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- group::r-- other::--- [root@test ~]$getfacl aa |setfacl --set-file=- test.txt [root@test ~]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:qiuhom:r-- user:jerry:rwx group::r-- group:tom:rw- mask::rwx other::--- [root@test ~]$
說明:上面的命令用到了- ,這裏說一下‘-’的做用,它的做用是將上一個命令的標準輸出,用- 代替,這裏也就是說getfacl test.txt 的輸出 用‘-’代替。
接下來看看ACL生效的順序
[root@test tmp]$id qiuhom uid=500(qiuhom) gid=500(qiuhom) groups=500(qiuhom),504(webs) [root@test tmp]$getfacl test.txt # file: test.txt # owner: root # group: root user::rw- user:qiuhom:r-- group::r-- group:db:r-- group:webs:-w- mask::rw- other::--- [root@test tmp]$su qiuhom [qiuhom@test tmp]$cat test.txt xxxx [qiuhom@test tmp]$echo "qiuhom" >> test.txt bash: test.txt: Permission denied [qiuhom@test tmp]$
說明:以上例子證實了一個acl生效順序,acl自定義用戶的權限優先級高於自定義用戶組的權限,在上例中能夠看到,qiuhom這個用戶不是文件的全部者,也不屬於root組,因此不匹配全部者上的權限,接着系統有開始匹配是否是指定用戶,若是是系統就不匹配後面的權限,就直接執行匹配的權限,雖然用戶qiuhom所在的附加組webs有寫的權限,可是優先級比指定用戶要低因此無效。
[root@test tmp]$chmod 400 test.txt [root@test tmp]$ll test.txt -r-------- 1 qiuhom qiuhom 5 Oct 29 20:29 test.txt [root@test tmp]$setfacl -m u:qiuhom:w test.txt [root@test tmp]$getfacl test.txt # file: test.txt # owner: qiuhom # group: qiuhom user::r-- user:qiuhom:-w- group::--- mask::-w- other::--- [root@test tmp]$su qiuhom [qiuhom@test tmp]$cat test.txt xxxx [qiuhom@test tmp]$echo "test " >> test.txt bash: test.txt: Permission denied [qiuhom@test tmp]$
說明:能夠看到,全部者的權限優先級高於自定義權限優先級。系統首先匹配到了全部者的權限,因此後面的權限就不去看了。
[root@test tmp]$ll test.txt -r---w-r--+ 1 qiuhom qiuhom 5 Oct 29 20:29 test.txt [root@test tmp]$getfacl test.txt # file: test.txt # owner: qiuhom # group: qiuhom user::r-- user:tom:-w- group::--- mask::-w- other::r-- [root@test tmp]$su tom [tom@test tmp]$cat test.txt cat: test.txt: Permission denied [tom@test tmp]$echo "tom write" >>test.txt [tom@test tmp]$exit exit [root@test tmp]$setfacl -m mask::r test.txt [root@test tmp]$getfacl test.txt # file: test.txt # owner: qiuhom # group: qiuhom user::r-- group::--- group:tom:r-- mask::r-- other::-w- [root@test tmp]$su tom [tom@test tmp]$cat test.txt xxxx tom write abc [tom@test tmp]$echo "abcdddd" >> test.txt bash: test.txt: Permission denied [tom@test tmp]$
說明:以上示例能夠看出,自定義用戶的權限優先級大於其餘戶的優先級,自定義用戶組的優先級大於其它優先級。
總結:
咱們知道在沒有設置acl的文件裏,系統權限優先級是,全部者大於所屬組大於其餘用戶。可是在設置了acl的文件裏權限的優先級是這樣的,全部者大於自定義用戶大於自定義組大於其餘。
ACL文件上的group權限是mask值,而非傳統的組權限,默認設置了acl權限後,原有的group的權限就不顯示,只顯示mask權限,可是原有的group權限不變。
經過ACL賦予目錄默認x權限,目錄內文件也不會繼承x權限
mask隻影響除全部者和other的以外的人和組的最大權限,Mask須要與用戶的權限進行邏輯與運算後,才能變成有限的權限(EffectivePermission),用戶或組的設置必須存在於mask權限設定範圍內纔會生效。