2021-05-12 14:32:11
CentOS7使用ACL精確控制檔案和目錄的存取許可權
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
相關文章