## 13.3 主機的細部權限規劃:ACL 的使用
從[第五章](../Text/index.html)開始,我們就一直強調 Linux 的權限概念是非常重要的! 但是傳統的權限僅有三種身份 (owner, group, others) 搭配三種權限 (r,w,x) 而已,并沒有辦法單純的針對某一個使用者或某一個群組來設置特定的權限需求,例如前一小節最后的那個任務! 此時就得要使用 ACL 這個機制啦!這玩意挺有趣的,下面我們就來談一談:
### 13.3.1 什么是 ACL 與如何支持啟動 ACL
ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 權限之外的細部權限設置。ACL 可以針對單一使用者,單一文件或目錄來進行 r,w,x 的權限規范,對于需要特殊權限的使用狀況非常有幫助。
那 ACL 主要可以針對哪些方面來控制權限呢?他主要可以針對幾個項目:
* 使用者 (user):可以針對使用者來設置權限;
* 群組 (group):針對群組為對象來設置其權限;
* 默認屬性 (mask):還可以針對在該目錄下在創建新文件/目錄時,規范新數據的默認權限;
也就是說,如果你有一個目錄,需要給一堆人使用,每個人或每個群組所需要的權限并不相同時,在過去,傳統的 Linux 三種身份的三種權限是無法達到的, 因為基本上,傳統的 Linux 權限只能針對一個用戶、一個群組及非此群組的其他人設置權限而已,無法針對單一用戶或個人來設計權限。 而 ACL 就是為了要改變這個問題啊!好了,稍微了解之后,再來看看如何讓你的文件系統可以支持 ACL 吧!
* 如何啟動 ACL
事實上,原本 ACL 是 unix-like 操作系統的額外支持項目,但因為近年以來 Linux 系統對權限細部設置的熱切需求, 因此目前 ACL 幾乎已經默認加入在所有常見的 Linux 文件系統的掛載參數中 (ext2/ext3/ext4/xfs等等)!所以你無須進行任何動作, ACL 就可以被你使用啰!不過,如果你不放心系統是否真的有支持 ACL 的話,那么就來檢查一下核心掛載時顯示的信息吧!
```
[root@study ~]# 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
```
瞧!至少 xfs 已經支持這個 ACL 的功能啰!
### 13.3.2 ACL 的設置技巧: getfacl, setfacl
好了,既然知道我們的 filesystem 有支持 ACL 之后,接下來該如何設置與觀察 ACL 呢? 很簡單,利用這兩個指令就可以了:
* getfacl:取得某個文件/目錄的 ACL 設置項目;
* setfacl:設置某個目錄/文件的 ACL 規范。
先讓我們來瞧一瞧 setfacl 如何使用吧!
* setfacl 指令用法介紹及最簡單的“ u:帳號:權限 ”設置
```
[root@study ~]# setfacl [-bkRd] [{-m|-x} acl參數] 目標文件名
選項與參數:
-m :設置后續的 acl 參數給文件使用,不可與 -x 合用;
-x :刪除后續的 acl 參數,不可與 -m 合用;
-b :移除“所有的” ACL 設置參數;
-k :移除“默認的” ACL 參數,關于所謂的“默認”參數于后續范例中介紹;
-R :遞回設置 acl ,亦即包括次目錄都會被設置起來;
-d :設置“默認 acl 參數”的意思!只對目錄有效,在該目錄新建的數據會引用此默認值
```
上面談到的是 acl 的選項功能,那么如何設置 ACL 的特殊權限呢?特殊權限的設置方法有很多, 我們先來談談最常見的,就是針對單一使用者的設置方式:
```
# 1\. 針對特定使用者的方式:
# 設置規范:“ u:[使用者帳號列表]:[rwx] ”,例如針對 vbird1 的權限規范 rx :
[root@study ~]# touch acl_test1
[root@study ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[root@study ~]# setfacl -m u:vbird1:rx acl_test1
[root@study ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 權限部分多了個 + ,且與原本的權限 (644) 看起來差異很大!但要如何查閱呢?
[root@study ~]# setfacl -m u::rwx acl_test1
[root@study ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 設置值中的 u 后面無使用者列表,代表設置該文件擁有者,所以上面顯示 root 的權限成為 rwx 了!
```
上述動作為最簡單的 ACL 設置,利用“ u:使用者:權限 ”的方式來設置的啦!設置前請加上 -m 這個選項。 如果一個文件設置了 ACL 參數后,他的權限部分就會多出一個 + 號了!但是此時你看到的權限與實際權限可能就會有點誤差! 那要如何觀察呢?就通過 getfacl 吧!
* getfacl 指令用法
```
[root@study ~]# getfacl filename
選項與參數:
getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這里就免去了選項的說明啊!
# 請列出剛剛我們設置的 acl_test1 的權限內容:
[root@study ~]# 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 設置吧!
* 特定的單一群組的權限設置:“ g:群組名:權限 ”
```
# 2\. 針對特定群組的方式:
# 設置規范:“ g:[群組列表]:[rwx] ”,例如針對 mygroup1 的權限規范 rx :
[root@study ~]# setfacl -m g:mygroup1:rx acl_test1
[root@study ~]# 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--
```
* 針對有效權限設置:“ m:權限 ”
基本上,群組與使用者的設置并沒有什么太大的差異啦!如上表所示,非常容易了解意義。不過,你應該會覺得奇怪的是, 那個 mask 是什么東西啊?其實他有點像是“有效權限”的意思!他的意義是: 使用者或群組所設置的權限必須要存在于 mask 的權限設置范圍內才會生效,此即“有效權限 (effective permission)” 我們舉個例子來看,如下所示:
```
# 3\. 針對有效權限 mask 的設置方式:
# 設置規范:“ m:[rwx] ”,例如針對剛剛的文件規范為僅有 r :
[root@study ~]# setfacl -m m:r acl_test1
[root@study ~]# 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--
```
您瞧,vbird1 與 mask 的集合發現僅有 r 存在,因此 vbird1 僅具有 r 的權限而已,并不存在 x 權限!這就是 mask 的功能了!我們可以通過使用 mask 來規范最大允許的權限,就能夠避免不小心開放某些權限給其他使用者或群組了。 不過,通常鳥哥都是將 mask 設置為 rwx 啦!然后再分別依據不同的使用者/群組去規范她們的權限就是了。
例題:將前一小節任務二中 /srv/projecta 這個目錄,讓 myuser1 可以進入查閱,但 myuser1 不具有修改的權力。答:由于 myuser1 是獨立的使用者與群組,因此無法使用傳統的 Linux 權限設置。此時使用 ACL 的設置如下:
```
# 1\. 先測試看看,使用 myuser1 能否進入該目錄?
[myuser1@study ~]$ cd /srv/projecta
-bash: cd: /srv/projecta: Permission denied <==確實不可進入!
# 2\. 開始用 root 的身份來設置一下該目錄的權限吧!
[root@study ~]# setfacl -m u:myuser1:rx /srv/projecta
[root@study ~]# 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 去測試看看結果!
[myuser1@study ~]$ cd /srv/projecta
[myuser1@study projecta]$ ll -a
drwxrws---+ 2 root projecta 4096 Feb 27 11:29 . <==確實可以查詢文件名
drwxr-xr-x 4 root root 4096 Feb 27 11:29 ..
[myuser1@study projecta]$ touch testing
touch: cannot touch `testing': Permission denied <==確實不可以寫入!
```
請注意,上述的 1, 3 步驟使用 myuser1 的身份,2步驟才是使用 root 去設置的!
上面的設置我們就完成了之前任務二的后續需求喔!這么簡單呢!接下來讓我們來測試一下,如果我用 root 或者是 pro1 的身份去 /srv/projecta 增加文件或目錄時,該文件或目錄是否能夠具有 ACL 的設置? 意思就是說,ACL 的權限設置是否能夠被次目錄所“繼承?”先試看看:
```
[root@study ~]# cd /srv/projecta
[root@study ~]# touch abc1
[root@study ~]# mkdir abc2
[root@study ~]# ll -d abc*
-rw-r--r--. 1 root projecta 0 Jul 21 17:49 abc1
drwxr-sr-x. 2 root projecta 6 Jul 21 17:49 abc2
```
你可以明顯的發現,權限后面都沒有 + ,代表這個 acl 屬性并沒有繼承喔!如果你想要讓 acl 在目錄下面的數據都有繼承的功能,那就得如下這樣做了!
* 使用默認權限設置目錄未來文件的 ACL 權限繼承“ d:[u|g]:[user|group]:權限 ”
```
# 4\. 針對默認權限的設置方式:
# 設置規范:“ d:[ug]:使用者列表:[rwx] ”
# 讓 myuser1 在 /srv/projecta 下面一直具有 rx 的默認權限!
[root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta
[root@study ~]# 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::---
[root@study ~]# cd /srv/projecta
[root@study projecta]# touch zzz1
[root@study projecta]# mkdir zzz2
[root@study 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 再次確認看看!
[root@study 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::---
```
通過這個“針對目錄來設置的默認 ACL 權限設置值”的項目,我們可以讓這些屬性繼承到次目錄下面呢! 非常方便啊!那如果想要讓 ACL 的屬性全部消失又要如何處理?通過“ setfacl -b 文件名 ”即可啦! 太簡單了!鳥哥就不另外介紹了!請自行測試測試吧!
問:針對剛剛的 /srv/projecta 目錄的權限設置中,我需要 1)取消 myuser1 的設置(連同默認值),以及 2)我不能讓 pro3 這個用戶使用該目錄,亦即 pro3 在該目錄下無任何權限, 該如何設置?答:取消全部的 ACL 設置可以使用 -b 來處理,但單一設置值的取消,就得要通過 -x 才行了!所以你應該這樣作:
```
# 1.1 找到針對 myuser1 的設置值
[root@study ~]# getfacl /srv/projecta | grep myuser1
user:myuser1:r-x
default:user:myuser1:r-x
# 1.2 針對每個設置值來處理,注意,取消某個帳號的 ACL 時,不需要加上權限項目!
[root@study ~]# setfacl -x u:myuser1 /srv/projecta
[root@study ~]# setfacl -x d:u:myuser1 /srv/projecta
# 2.1 開始讓 pro3 這個用戶無法使用該目錄啰!
[root@study ~]# setfacl -m u:pro3:- /srv/projecta
```
只需要留意,當設置一個用戶/群組沒有任何權限的 ACL 語法中,在權限的字段不可留白,而是應該加上一個減號 (-) 才是正確的作法!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀