首頁 > 軟體

CentOS7使用ACL精確控制檔案和目錄的存取許可權

2020-06-16 16:56:58

Linux基本的許可權控制僅可以對所屬使用者、所屬組、其他使用者進行的許可權控制,而不能精確地控制每個使用者的許可權。ACL規則就是用來解決這個問題的。使用ACL規則,我們可以針對單一賬戶設定檔案及目錄的存取許可權。


實驗使用者和組環境

組root:包含使用者root
組zenandidi:包含使用者zenandidi
組nannan:包含使用者nannan、zenandidi


實驗檔案內容

[root: ~]# cat acl_test/test.sh 
#/bin/bash
echo "Success!"

檢查檔案系統的ACL功能是否已經開啟

CentOS7預設已經開啟ACL功能

[root: ~]# tune2fs -l /dev/sda2 | grep acl
Default mount options:    user_xattr acl

如果有看到acl,說明已經開啟。


檢視是否設定了ACL規則

直接用ls -l檢視,如果許可權一欄後面有個加號,說明檔案被設定了ACL規則。

[root: acl_test]# ll 
總用量 12K
-rw-rwxr--+  1 root root   27 5月   7 08:03 test.sh

使用getfacl查詢ACL規則

命令基本用法

getfacl <檔案>

舉例說明

列出test.sh的ACL規則(下面分段說明)

[root: acl_test]# getfacl test.sh 

以下為檔案的基本資訊

# file: test.sh     #檔名
# owner: root       #所有者
# group: root       #所屬組

以下為檔案的使用者許可權設定

user::rw-                   #Linux預設的所屬使用者許可權
user:zenandidi:rwx          #附加ACL使用者許可權,這裡表示使用者zenandidi有讀、寫、執行的許可權

以下為檔案的組許可權設定

group::r--                  #Linux預設的所屬組許可權

其他資訊

mask::r-x                   #許可權掩碼(最後詳細說明)
other::r--                  #Linux預設的其他使用者許可權


使用setfacl設定ACL規則

命令基本用法

setfacl <選項> [規則] <檔案>

選項:

-m 新增一條ACL規則
-x 刪除一條ACL規則
-b 清空所有ACL規則

舉例說明


例1 清空test.sh中所有ACL規則

[root: acl_test]# setfacl -b test.sh 

檢查設定

[root: acl_test]# getfacl test.sh 
# file: test.sh
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root: acl_test]# ll
總用量 12K
-rw-r--r--   1 root root   27 5月   7 08:03 test.sh
#許可權欄的加號已經消失,說明沒有設定ACL規則

例2 為test.sh新增一條ACL規則,使得使用者zenandidi具有讀、執行許可權

設定之前先看看能不能用使用者zenandidi的身份執行

[root: acl_test]# sudo -u zenandidi ./test.sh 
sudo:./test.sh:找不到命令

由於沒有賦予使用者zenandidi執行許可權,預設使用其他使用者的許可權,所以不能執行。

設定許可權

[root: acl_test]# setfacl -m u:zenandidi:rx test.sh 

檢查設定

[root: acl_test]# getfacl test.sh 
# file: test.sh
# owner: root
# group: root
user::rw-
user:zenandidi:r-x
group::r--
mask::r-x
other::r--

[root: acl_test]# ll
總用量 12K
-rw-r-xr--+  1 root root   27 5月   7 08:03 test.sh

再看看能不能用zenandidi的身份執行

[root: acl_test]# sudo -u zenandidi ./test.sh 
Success!

執行成功。

好奇地看了下root的

[root: acl_test]# ./test.sh 
Success!

咦?我好像沒設定root可以執行,為什麼也執行成功了捏?其實這是mask在作怪,最後再看吧。


例3 為test.sh新增一條ACL規則,使得組nannan具有讀、寫許可權

設定之前先看看能不能用使用者zenandidi、nannan的身份改檔名

[root: acl_test]# sudo -u zenandidi mv test.sh test1.sh 
mv: 無法將"test.sh" 移動至"test1.sh": 許可權不夠
[root: acl_test]# sudo -u nannan mv test.sh test1.sh 
mv: 無法將"test.sh" 移動至"test1.sh": 許可權不夠

無法改檔名,因為沒有賦予寫許可權。

設定許可權

[root: acl_test]# setfacl -m g:nannan:rw test.sh 

檢查設定

[root: acl_test]# getfacl test.sh 
# file: test.sh
# owner: root
# group: root
user::rw-
user:zenandidi:r-x
group::r--
group:nannan:rw-        #effective:r--
mask::r-x
other::r--

再看看能不能改檔名

[root: acl_test]# sudo -u zenandidi mv test.sh test1.sh 
mv: 無法將"test.sh" 移動至"test1.sh": 許可權不夠
[root: acl_test]# sudo -u nannan mv test.sh test1.sh 
mv: 無法將"test.sh" 移動至"test1.sh": 許可權不夠

還是不行啊,怎麼回事?還是那個mask的事。下面詳細說明。


關於mask的那點事

1. mask值規定了允許的最大許可權

例如:
mask為rwx,說明ACL規則可以設定全部許可權。
mask為rw-,說明ACL規則僅可設定讀、寫許可權,無論是否設定執行許可權,檔案都不能被執行。

如果getfacl輸出中有#effective:xxx這個注釋,說明ACL規則受mask限制,僅有xxx許可權。應特別注意!

例3的問題可以通過設定mask來解決。

[root: acl_test]# setfacl -m mask:rwx test.sh 

2. mask值會直接作為Linux基本許可權中的組許可權

例1的問題就出在這裡。

設定ACL之前

[root: acl_test]# ll
總用量 12K
-rw-r--r--  1 root root   27 5月   7 08:03

設定ACL之後,組許可權變成了mask值

[root: acl_test]# ll
總用量 12K
-rw-r-xr--+  1 root root   27 5月   7 08:03 test.sh

因為root處在root組之中,所以自然就有了執行的許可權。


以上純屬個人經驗,如有錯誤請及時提出,謝謝!

本文永久更新連結地址http://www.linuxidc.com/Linux/2018-01/150111.htm


IT145.com E-mail:sddin#qq.com