官术网_书友最值得收藏!

認證目標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章中介紹。

主站蜘蛛池模板: 东海县| 吴堡县| 钟祥市| 阳信县| 荣昌县| 通渭县| 潮安县| 庐江县| 深泽县| 望谟县| 登封市| 日土县| 津市市| 宣威市| 连州市| 洱源县| 忻城县| 新巴尔虎左旗| 东乡县| 乌兰浩特市| 乌什县| 田林县| 英吉沙县| 姜堰市| 鹤山市| 叶城县| 兴城市| 南宁市| 民勤县| 大厂| 永修县| 平南县| 万荣县| 胶南市| 江安县| 红原县| 文安县| 喀喇沁旗| 前郭尔| 北川| 小金县|