Linux系統之訪問控制列表


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM