- RHCSARHCE 紅帽Linux認證學習指南(第7版)EX200 & EX300
- (美)Michael Jang等
- 3943字
- 2020-11-29 00:30:04
認證目標4.02 訪問控制列表及其他
曾經有一個時期,用戶對其他用戶的文件都有讀權限。但是默認情況下,用戶只是對自己目錄中的文件有權限。利用訪問控制列表(ACL)可以把自己主目錄中特定文件的讀、寫入和執行權限分配給特定用戶。它提供了第二級的自主訪問控制,這種方法可以覆蓋標準的ugo/rwx權限。
嚴格地說,普通的ugo/rwx權限是第一級自主訪問控制。換言之,ACL是從本章前面提到的所有權和權限開始的,后面讀者馬上就會看到這一切如何用ACL命令顯示。
為配置ACL,需要先用acl選項掛載正確的文件系統。接下來要在相關的目錄上設置執行權限。只有這樣,我們才可以配置ACL表,給特定的用戶分配所需要的權限。
ext4和XFS文件系統,以及網絡文件系統(Network File System, NFS)版本4支持ACL。
4.2.1 getfacl命令
假設已經安裝acl程序包,則我們可以使用getfacl命令,它顯示一個文件的當前ACL。例如,下面這個命令顯示/root目錄中anaconda-ks.cfg文件的當前權限和ACL。
[root@server1~]# getfacl anaconda-ks.cfg # file: anaconda-ks.cfg # owner: root # group: root user::rw- group::--- other::---
執行ls -l /root/anaconda-ks.cfg命令。你應該知道此輸出結果中的每個元素,因為anaconda-ks.cfg文件中不設置ACL, getfacl命令僅顯示標準權限和所有權。稍后將要添加的ACL表是以它為基礎的。但首先要使一個文件系統成為第二級ACL的友好系統。
4.2.2 使文件系統成為ACL友好系統
RHEL 7使用XFS文件系統。在RHEL 7上創建XFS或ext2/ext3/ext4文件系統時,默認啟用ACL。另一方面,在更早版本的Red Hat上創建ext2、ext3和ext4文件系統可能不會自動啟用對ACL的支持。
實際經驗
為驗證在分區設備(如dev/sda1)上,ext2/ext3/ext4文件系統是否默認啟用了acl掛載選項,可以執行命令tune2fs -l/dev/sda1。記住,在RHEL 7上創建的XFS文件系統和所有ext文件系統都默認啟用ACL支持。因此,只有在較早的Red Hat企業版Linux上創建ext文件系統時,或者在已經顯式刪除acl選項的ext2/ext3/ext4文件系統中,才需要使用acl選項掛載文件系統。
如果想要在沒有配置acl掛載選項的文件系統上啟用ACL,則可以正確地重新掛載現有的分區。例如,通過執行下面的命令,我們可以使用ACL重新掛載/home分區:
# mount -o remount -o acl /home
為保證它就是下次重新啟動時/home的掛載方式,編輯/etc/fstab文件。根據前面的命令,如果/home采用ext4格式,可能會包含如下一行內容:
/dev/sda3 /home ext4 defaults, acl 1,2
修改了/etc/fstab文件后,用下面的命令啟動該文件:
# mount -o remount /home
為驗證/home文件已經用acl選項掛載,單獨執行mount命令,不要帶任何開關選項,就會看到如下所示的輸出結果:
/dev/sda3 on /home type ext4(rw, acl)
現在我們就用ACL命令對需要的文件和目錄設置訪問控制列表。
4.2.3 管理文件的ACL
有了一個正確掛載的文件系統和合適的權限,我們就可以管理系統上的ACL。為了查看當前ACL,執行getfacl filename 命令。例如,我們已在/home/examprep目錄中創建了一個名為TheAnswers的文本文件。下面是getfacl /home/examprep/TheAnswers命令的輸出結果:
# file home/examprep/TheAnswers # owner: examprep # group: proctors user::rw- group::r-- other::---
注意,TheAnswers文件屬于examprep用戶和proctors組所有。此用戶所有者具有讀、寫權限,組所有者對此文件有讀權限。也就是說,examprep用戶可以讀取和修改Answers文件,而proctors組中的成員可以讀TheAnswers文件。
現在假設你是該系統的root用戶或者examprep用戶,則可以用setfacl命令為作者之一(用戶michael)給名為TheAnswers的文件分配ACL。例如,下面的命令允許miachel擁有該文件的讀、寫和執行權限:
# setfacl -m u:michael:rwx /home/examprep/TheAnswers
這個命令修改了該文件的ACL,修改(-m)michael用戶的ACL,給他分配了該文件的讀、寫和執行權限。為了驗證此命令的執行結果,對該文件執行getfacl命令后得到如圖4-2所示的結果。

圖4-2 TheAnswers文件的ACL
但當我們用michael的用戶賬戶訪問這個文件時卻不成功。實際上,當我們用vi文本編輯器訪問這個文件時,它提示/home/examprep/TheAnswers文件是一個新文件。接下來它拒絕保存所有對這個文件的修改。
在/home/examprep目錄的文件可以訪問之前,管理員用戶需要修改這個目錄的權限或ACL設置。在修改一個目錄的自主訪問控制之前,我們先來介紹幾個不同的setfacl命令選項。
其實setfacl命令名不符實際,它和-x開關選項可以用來刪除ACL權限。例如,下面的命令刪除前面為michael用戶配置的rwx特權:
# setfacl -x u:michael /home/examprep/TheAnswers
此外,setfacl命令也可應用于組。例如,假設存在一個teachers組,下面的命令把讀權限分配給這個組中的成員:
# setfacl -m g:teachers:r /home/examprep/TheAnswers
還可以使用setfacl命令刪除指定用戶的所有權限。例如,下面的命令拒絕用戶michael訪問/home/examprep目錄:
# setfacl -m u:michael:- /home/examprep
如果想了解ACL的工作模式,就不要刪除TheAnswers文件的ACL權限,至少現在不要刪除。或者如果想從頭開始,則下面的命令和-b開關選項一起可以刪除該文件的全部ACL記錄:
# setfacl -b /home/examprep/TheAnswers
setfacl命令的部分可用選項列在表4-5中。
表4-5 文件權限說明

有一個與其他用戶有關的比較危險的選項。例如下面的命令:
# setfacl -m o:rwx /home/examprep/TheAnswers
它允許其他用戶對TheAnswers文件具有讀、寫和執行權限,這是通過修改此文件的主權限而完成的,這可以從ls -l/home/examprep/TheAnswers命令的輸出結果中看出。-b和-x開關選項不會刪除這樣的修改,必須使用下面的命令:
# setfacl -m o:- /home/examprep/TheAnswers
4.2.4 配置ACL的目錄
有幾種方法可使用ACL建立目錄并進行文件分享。第一種方法是為其他所有用戶設置普通執行位。方法之一是把下面的命令應用于上述目錄:
# chmod 701 /home/examprep
這是訪問目錄中文件的最簡單方法。只有examprep和root用戶才可以列出這個目錄中的文件。只有當我們確信TheAnswers文件存在,才可以訪問它。
但當我們為其他用戶設置了執行位后,則任何用戶只要擁有此權限,就可以訪問/home/examprep目錄中的文件。這會帶來安全問題。任何用戶?即使將文件隱藏起來,難道我們真的愿意把任何文件的真實權限分配給任何人嗎?誠然,我們已經為/home/examprep目錄中的TheAnswers文件(只有這個文件)建立了ACL,但是這一層的安全措施是我們自愿放棄的。
正確的方法是在/home/examprep目錄上應用setfacl命令。設置共享的最安全方法是下面的命令為michael用戶賬戶設置指定目錄的ACL執行權限:
# setfacl -m u:michael:x /home/examprep
由于examprep用戶是/home/examprep目錄的所有者,因此這個用戶也可以執行前面的setfacl命令。
有時我們希望把這樣的ACL作用于一個目錄中的所有文件。此時-R開關選項可以遞歸地應用所有的修改。例如,下面的命令允許michael用戶對/home/examprep目錄以及它的任何子目錄中的全部文件都有讀和執行權限:
# setfacl -R -m u:michael:rx /home/examprep
有兩種方法可以取消這些選項。第一個方法是把-x開關選項用于前面的命令,同時忽略其中的權限設置:
# setfacl -R -x u:michael /home/examprep
另一種方法是使用-b開關選項。但是這會刪除為所有用戶配置的對該目錄具有的ACL權限(加上-R開關選項,此命令可應用于子目錄):
# setfacl -R -b /home/examprep
4.2.5 配置默認ACL
目錄還可以包含一個或多個默認ACL。默認ACL的概念類似于普通ACL記錄,不同之處在于,默認ACL對當前目錄權限沒有影響,但會被該目錄內創建的文件繼承。
例如,如果一個ACL將讀和執行權限分配給用戶michael,而我們想讓/home/examprep中的所有新文件和目錄繼承該ACL,就可以執行下面的命令:
# setfacl -d -m u:michael:rx /home/examprep
上面命令中的-d選項指定,當前操作適用于默認ACL。getfacl命令可顯示指定目錄上的標準和默認ACL:
# getfacl /home/examprep getfacl: Removing leading '/' from absolute path names # file: home/examprep # owner: examprep # group: examprep user::rwx user:michael:--x group::--- mask::--x other::--- default:user::rwx default:user:michael:r-x default:group::--- default:mask::r-x default:other::---
4.2.6 ACL和屏蔽位
與ACL有關的屏蔽位(Mask)可以限制指定用戶和組以及組所有者對一個文件的可用權限。圖4-2所示的屏蔽位是rwx,這表示它對權限沒有任何限制。如果將屏蔽位設置為r,則用setfacl等命令賦予的權限只能是讀權限。為把TheAnswers文件的屏蔽位改為只讀,執行以下命令:
# setfacl -m mask:r-- /home/examprep/TheAnswers
現在用getfacl /home/examprep/TheAnswers命令檢查上述命令的執行結果。注意某個特定用戶的記錄。根據前面賦給michael用戶的ACL特權,我們可以看到與圖4-2的差別:
user:michael:rwx #effective:r--
換言之,用r--屏蔽位可以把所有特權分配給其他用戶。但這個屏蔽位只可以設置讀特權。
實際經驗
屏蔽位只能作用于組所有者,以及指定的用戶和組。它對文件的用戶所有者以及“其他”權限組不起作用。
4.2.7 練習4-1:用ACL拒絕一個用戶的訪問
本練習可以建立ACL來拒絕普通用戶對回環配置文件的訪問。回環配置文件就是/etc/sysconfig/network-scripts目錄中的ifcfg-lo文件。本練習假設我們已建立了一個普通用戶,由于我們已經在系統上設置了michael用戶,它就是本練習中的普通用戶。做相應的替換。為了拒絕他對此文件的訪問,要執行以下步驟:
(1)備份回環設備的當前配置文件,它就是位于/etc/sysconfig/netwok-scripts目錄中的ifcfg-lo文件(提示:要用cp命令,而不是mv命令)。
(2)執行setfacl -m u:michael:- /etc/sysconfig/network-scripts/ifcfg-lo命令。
(3)檢查上述命令的執行結果。分別對/etc/sysconfig/network-scripts/ifcfg-lo和它的備份目錄執行getfacl命令。看看兩者有什么差別。
(4)以目標用戶身份登錄到系統。如果當前是root管理員賬戶,一個方法是執行su - michael命令。
(5)用vi文本編輯器或者用cat命令查看/etc/sysconfig/network-scripts/ifcfg-lo文件。看看會出現什么現象?
(6)對備份目錄中的文件重復前一個操作。看看會出現什么現象?
(7)現在對備份的ifcfg-lo文件執行cp命令,并覆蓋/etc/sysconfig/network-scripts文件的當前版本(不要用mv命令)。要恢復到root用戶賬戶。
(8)再次嘗試getfacl /etc/sysconfig/network-scripts/ifcfg-lo命令,你難道沒有對結果感到驚奇嗎?
(9)有兩個方法可以恢復ifcfg-lo文件的初始ACL配置。第一個方法是把setfacl -b命令應用于此文件。看看這個命令是否有效。可以用getfacl命令進行驗證。如果已經執行其他任何命令,則它可能起作用,也可能不起作用。
(10)恢復一個文件的初始ACL配置的另一種方法是恢復備份文件,但是需要先刪除/etc/sysconfig/network-scripts目錄中已修改的文件,然后將備份目錄中的文件復制到這里。
(11)然而,如果我們執行了步驟10,則可能還需要用下面的命令恢復文件的SELinux上下文:
restorecon -F /etc/sysconfig/network-scripts/ifcfg-lo
本章后面將介紹有關restorecon命令的更多信息。
4.2.8 NFS共享與ACL
雖然沒有證據表明Red Hat考試包含了基于NFS的ACL,但這是一個Linux管理員必須掌握的功能。因此本節的討論只是提供幾個實例,遠談不上全面。更多信息可訪問nfs4-acl-tools RPM程序包安裝的nfs4_acl man手冊。
通常情況下,從一個共享的NFS卷中分配一個空間作為/home目錄。事實上,基于NFS的ACL比標準的ACL更加精細、更加嚴格。這個功能最早引入到NFS版本4中,它是RHEL 7的標準。為此,nfs4_getfacl命令可以顯示與共享目錄中的文件有關的ACL。針對前面給出的ACL,圖4-3是nfs4_getfacl命令的結果。

圖4-3 NFS v4的訪問控制列表
這個輸出結果采用以下格式:
type:flags:principal:permissions
參數之間用冒號分隔。簡單地說,顯示的兩個類型(type)表示給主體(用戶或組)允許(Allow, A)或拒絕(Deny, D)某個權限(permission)。圖4-3中沒有顯示標志(flags),標志可以提供更加精細的控制。主體(principal)可以是一個普通用戶或組,用小寫表示。它甚至可以是一個原型用戶,如OWNER文件、擁有文件的GROUP或由EVERYONE表示的其他用戶。表4-6中的權限更加細化。其效果取決于處理對象是一個文件還是一個目錄。
表4-6 NFSv4 ACL權限描述

第6章將介紹如何使用其他本地和網絡文件系統把NFS配置為一個客戶端。NFS服務器的配置屬于RHCE認證目標,這將在第16章中介紹。
- Kubernetes修煉手冊
- Getting Started with oVirt 3.3
- Learn Helm
- 嵌入式Linux系統開發:基于Yocto Project
- 構建可擴展分布式系統:方法與實踐
- Linux集群和自動化運維
- Java EE 8 Design Patterns and Best Practices
- Linux使用和管理指南:從云原生到可觀測性
- 嵌入式實時操作系統μC/OS原理與實踐
- Application Development in iOS 7
- 計算機系統:基于x86+Linux平臺
- Cassandra 3.x High Availability(Second Edition)
- Java EE 8 High Performance
- Implementing Cloud Design Patterns for AWS(Second Edition)
- 電腦辦公(Windows10+Office2016)從新手到高手