首先我們來了解下權限,在Linux里常規的權限有r(讀)w(寫)x(執行),特殊權限有SUID,SGID,Sticky權限,分別作用在文件(或目錄)的所有者,所屬組和其他(既不是所有者,也不是所屬組的其他用戶)上。在沒有acl之前,我們只能對文件或目錄的所有者,所屬組,或其他用戶進行授權。這樣授權不是很靈活,比如我想在不影響原有的權限外單獨給某一個用戶授權,該怎么做呢?acl就提供了便利,它打破了傳統授權的不靈活性。acl實現了靈活的權限管理,除了文件的所有者,所屬組和其他人授權外,它還可以對更多的用戶設置權限。ACL功能依賴文件系統,centos7默認創建的xfs和ext4文件系統,這兩個文件系統都具有ACL功能,在7之前的版本,如果是手工創建的ext4文件系統,需要使用到ACL功能就需要手動添加。添加命令如下,有關SUID,SGID,Sticky權限介紹請參考:https://www.cnblogs.com/qiuhom-1874/p/9838468.html
tune2fs -o acl /dev/sdb1 mount -o acl /dev/sdb1 /mnt/test
說明:tune2fs命令是針對ext系列文件系統命令,在xfs文件系統上不能查看文件系統參數,只能在ext系列文件系統上使用。
接下來介紹兩個命令的使用,getfacl、setfacl
getfacl:查看文件的acl權限列表
用法:
Usage: getfacl [-aceEsRLPtpndvh] file ...
常用選項:
-a, --access 僅顯示文件訪問控制列表
-d, --default 只顯示默認的訪問控制列表
-c, --omit-header 不顯示注釋頭
-e, --all-effective 打印所有有效權限
-E, --no-effective 打印無效權限
-R, --recursive 遞歸到子目錄
[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權限列表
用法:
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權限設定范圍內才會生效。