1. 程式人生 > >鳥哥的Linux私房菜讀書筆記--主機的細部許可權規劃:ACL的使用

鳥哥的Linux私房菜讀書筆記--主機的細部許可權規劃:ACL的使用

1、什麼是ACL與如何支援啟動ACL

ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的read,write,execute 許可權之外的細部許可權設定。ACL 可以針對單一使用者,單一檔案或目錄來進行r,w,x 的許可權規範,對於需要特殊許可權的使用狀況非常有幫助。ACL 主要可以針對以下專案:
· 使用者 (user):可以針對使用者來設定許可權;
· 群組 (group):針對群組為物件來設定其許可權;
· 預設屬性 (mask):還可以針對在該目錄下在建立新檔案/目錄時,規範新資料的預設許可權;
<1>如何啟動ACL

原本的ACL是unix-like作業系統的額外支援專案,由於近年對Linux系統許可權細部設定的熱切需求,目前ACL已經加入所有常見的linux檔案系統的掛載引數中,所以無需進行任何動作就可以使用ACL

[[email protected] ~]# dmesg | grep -i acl
[ 0.330377] systemd[1]: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT
+SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
[ 0.878265] SGI XFS with ACLs, security attributes, large block/inode numbers, no
debug enabled

2、ACL的設定技巧

getfacl:取得某個檔案/目錄的ACL設定專案

setfacl:設定某個檔案/目錄的ACL規範

<1>setfacl

[[email protected] ~]# setfacl [-bkRd] [{-m|-x} acl 引數] 目標檔名
選項與引數:
-m :設定後續的 acl 引數給檔案使用,不可與 -x 合用;
-x :刪除後續的 acl 引數,不可與 -m 合用;
-b :移除『所有的』 ACL 設定引數;
-k :移除『預設的』 ACL 引數,關於所謂的『預設』引數於後續範例中介紹;
-R :遞迴設定 acl ,亦即包括次目錄都會被設定起來;
-d :設定『預設 acl 引數』的意思!只對目錄有效,在該目錄新建的資料會引用此預設值
針對單一使用者ACL特殊許可權的設定方式:
# 1. 針對特定使用者的方式:
# 設定規範:『 u:[使用者賬號列表]:[rwx] 』,例如針對 vbird1 的許可權規範 rx :
[

[email protected] ~]# touch acl_test1
[[email protected] ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[[email protected] ~]# setfacl -m u:vbird1:rx acl_test1
[[email protected] ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 許可權部分多了個 + ,且與原本的許可權 (644) 看起來差異很大!但要如何查閱呢?
[[email protected] ~]# setfacl -m u::rwx acl_test1
[[email protected] ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 設定值中的 u 後面無使用者列表,代表設定該檔案擁有者,所以上面顯示 root 的許可權成為 rwx 了!
上述動作為最簡單的 ACL 設定,利用『 u:使用者:許可權 』的方式來設定的啦!設定前請加上 -m 這個選項。 如果一個檔案設定了 ACL 引數後,他的許可權部分就會多出一個 + 號了!但是此時你看到的許可權與實際許可權可能就會有點誤差! 那要如何觀察呢?就透過 getfacl 吧!
<2>getfacl 指令用法
[[email protected] ~]# getfacl filename
選項與引數:
-m :設定後續的 acl 引數給檔案使用,不可與 -x 合用;
-x :刪除後續的 acl 引數,不可與 -m 合用;
-b :移除『所有的』 ACL 設定引數;
-k :移除『預設的』 ACL 引數,關於所謂的『預設』引數於後續範例中介紹;
-R :遞迴設定 acl ,亦即包括次目錄都會被設定起來;
-d :設定『預設 acl 引數』的意思!只對目錄有效,在該目錄新建的資料會引用此預設值                                                  getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這裡就免去了選項的說明啊!
# 請列出剛剛我們設定的 acl_test1 的許可權內容:
[[email protected] ~]# getfacl acl_test1
# file: acl_test1 <==說明檔名而已!
# owner: root <==說明此檔案的擁有者,亦即 ls -l 看到的第三使用者欄位
# group: root <==此檔案的所屬群組,亦即 ls -l 看到的第四群組欄位
user::rwx <==使用者列表欄是空的,代表檔案擁有者的許可權
user:vbird1:r-x <==針對 vbird1 的許可權設定為 rx ,與擁有者並不同!
group::r-- <==針對檔案群組的許可權設定僅有 r
mask::r-x <==此檔案預設的有效許可權 (mask)
other::r-- <==其他人擁有的許可權囉!
上面的資料非常容易查閱吧?顯示的資料前面加上 # 的,代表這個檔案的預設屬性,包括檔名、
檔案擁有者與檔案所屬群組。 底下出現的 user, group, mask, other 則是屬於不同使用者、群組與有
效許可權(mask)的設定值。 以上面的結果來看,我們剛剛設定的 vbird1 對於這個檔案具有 r 與 x 的
許可權啦!這樣看的懂嗎? 如果看的懂的話,接下來讓我們在測試其他型別的 setfacl 設定吧!

<3>特定的單一群組的許可權設定:『 g:群組名:許可權 』
# 2. 針對特定群組的方式:
# 設定規範:『 g:[群組列表]:[rwx] 』,例如針對 mygroup1 的許可權規範 rx :
[[email protected] ~]# setfacl -m g:mygroup1:rx acl_test1
[[email protected] ~]# getfacl acl_test1                                                                                                                                                #file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x <==這裡就是新增的部分!多了這個群組的許可權設定!
mask::r-x
other::r--

<4>針對有效許可權設定:m:許可權

mask,有效許可權。使用者或群組所設定的許可權必須要存在於mask的許可權設定範圍內才會生效,此即有效許可權effective permission  

#3. 針對有效許可權 mask 的設定方式:
# 設定規範:『 m:[rwx] 』,例如針對剛剛的檔案規範為僅有 r :
[[email protected] ~]# setfacl -m m:r acl_test1
[[email protected] ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x #effective:r-- <==vbird1+mask 均存在者,僅有 r 而已,x 不會生效
group::r--
group:mygroup1:r-x #effective:r--
mask::r--
other::r--

例題:
將前一小節任務二中 /srv/projecta 這個目錄,讓 myuser1 可以進入查閱,但 myuser1 不具有修改的權力。
答:由於 myuser1 是獨立的使用者與群組,因此無法使用傳統的 Linux 許可權設定。此時使用 ACL 的設定如下:
# 1. 先測試看看,使用 myuser1 能否進入該目錄?
[[email protected] ~]$ cd /srv/projecta
bash: cd: /srv/projecta: Permission denied <==確實不可進入!
# 2. 開始用 root 的身份來設定一下該目錄的許可權吧!
[[email protected] ~]# setfacl -m u:myuser1:rx /srv/projecta
[[email protected] ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
# flags: -s user::rwx
user:myuser1:r-x <==還是要看看有沒有設定成功喔!
group::rwx
mask::rwx
other::---
# 3. 還是得要使用 myuser1 去測試看看結果!
[[email protected] ~]$ cd /srv/projecta
[[email protected] projecta]$ ll -a
drwxrws---+ 2 root projecta 4096 Feb 27 11:29 . <==確實可以查詢檔名
drwxr-xr-x 4 root root 4096 Feb 27 11:29 ..
[[email protected] projecta]$ touch testing
touch: cannot touch `testing': Permission denied <==確實不可以寫入!
請注意,上述的 1, 3 步驟使用 myuser1 的身份,2 步驟才是使用 root 去設定的!

<5>使用預設許可權設定目錄未來檔案的ACL許可權繼承  [ d : [ u|g]:[user|group]:許可權 ]

#4.針對預設許可權的設定方式

設定規範:『 d:[ug]:使用者列表:[rwx] 』
# 讓 myuser1 在 /srv/projecta 底下一直具有 rx 的預設許可權!
[[email protected] ~]# setfacl -m d:u:myuser1:rx /srv/projecta
[[email protected] ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
# flags: -s user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---
[[email protected] ~]# cd /srv/projecta
[[email protected] projecta]# touch zzz1
[[email protected] projecta]# mkdir zzz2
[[email protected] projecta]# ll -d zzz*
-rw-rw----+ 1 root projecta 0 Jul 21 17:50 zzz1
drwxrws---+ 2 root projecta 6 Jul 21 17:51 zzz2
# 看吧!確實有繼承喔!然後我們使用 getfacl 再次確認看看!
[[email protected] projecta]# getfacl zzz2
# file: zzz2
# owner: root
# group: projecta
# flags: -s user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---

問:針對剛剛的 /srv/projecta 目錄的許可權設定中,我需要 1)取消 myuser1 的設定(連同預設值),以及 2)我不能讓 pro3 
這個使用者使用該目錄,亦即 pro3 在該目錄下無任何許可權, 該如何設定?
答:取消全部的 ACL 設定可以使用 -b 來處理,但單一設定值的取消,就得要透過 -x 才行了!所以你應該這樣作:
# 1.1 找到針對 myuser1 的設定值
[[email protected] ~]# getfacl /srv/projecta | grep myuser1
user:myuser1:r-x
default:user:myuser1:r-x
# 1.2 針對每個設定值來處理,注意,取消某個賬號的 ACL 時,不需要加上許可權專案!
[[email protected] ~]# setfacl -x u:myuser1 /srv/projecta
[[email protected] ~]# setfacl -x d:u:myuser1 /srv/projecta
# 2.1 開始讓 pro3 這個使用者無法使用該目錄囉!
[[email protected] ~]# setfacl -m u:pro3:- /srv/projecta
當設定一個使用者/群組沒有任何許可權的 ACL 語法中,在許可權的欄位不可留白,而是應該加上一個減號(-) 才是正確的作法!