Linux訪問控制列表

  首先咱們來了解下權限,在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權限設定範圍內纔會生效。

相關文章
相關標籤/搜索