2021-05-12 14:32:11
RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 進行強制存取控制
在本系列的前面幾篇文章中,我們已經詳細地探索了至少兩種存取控制方法:標準的 ugo/rwx 許可權(RHCSA 系列(三): 如何管理 RHEL7 的使用者和組) 和存取控制列表(RHCSA 系列(七): 使用 ACL(存取控制列表) 和掛載 Samba/NFS 共用)。
RHCSA 認證:SELinux 精要和控制檔案系統的存取
儘管作為第一級別的許可權和存取控制機制是必要的,但它們同樣有一些局限,而這些局限則可以由安全增強 Linux(Security Enhanced Linux,簡稱為 SELinux)來處理。
這些局限的一種情形是:某個使用者可能通過一個泛泛的 chmod 命令將檔案或目錄暴露出現了安全違例,從而引起存取許可權的意外傳播。結果,由該使用者開啟的任意進程可以對屬於該使用者的檔案進行任意的操作,最終一個惡意的或有其它缺陷的軟體可能會取得整個系統的 root 級別的存取許可權。
考慮到這些局限性,美國國家安全域性(NSA) 率先設計出了 SELinux,一種強制的存取控制方法,它根據最小許可權模型去限制進程在系統物件(如檔案,目錄,網路介面等)上的存取或執行其他的操作的能力,而這些限制可以在之後根據需要進行修改。簡單來說,系統的每一個元素只給某個功能所需要的那些許可權。
在 RHEL 7 中,SELinux 被併入了核心中,且預設情況下以強制模式(Enforcing)開啟。在這篇文章中,我們將簡要地介紹有關 SELinux 及其相關操作的基本概念。
SELinux 的模式
SELinux 可以以三種不同的模式執行:
- 強制模式(Enforcing):SELinux 基於其策略規則來拒絕存取,這些規則是用以控制安全引擎的一系列準則;
- 寬容模式(Permissive):SELinux 不會拒絕存取,但對於那些如果執行在強制模式下會被拒絕存取的行為進行記錄;
- 關閉(Disabled) (不言自明,即 SELinux 沒有實際執行).
使用 getenforce
命令可以展示 SELinux 當前所處的模式,而 setenforce
命令(後面跟上一個 1 或 0) 則被用來將當前模式切換到強制模式(Enforcing)或寬容模式(Permissive),但只對當前的對談有效。
為了使得在登出和重新啟動後上面的設定還能保持作用,你需要編輯 /etc/selinux/config
檔案並將 SELINUX 變數的值設為 enforcing,permissive,disabled 中之一:
# getenforce
#setenforce0
# getenforce
#setenforce1
# getenforce
#cat/etc/selinux/config
設定 SELinux 模式
通常情況下,你應該使用 setenforce
來在 SELinux 模式間進行切換(從強制模式到寬容模式,或反之),以此來作為你排錯的第一步。假如 SELinux 當前被設定為強制模式,而你遇到了某些問題,但當你把 SELinux 切換為寬容模式後問題不再出現了,則你可以確信你遇到了一個 SELinux 許可權方面的問題。
SELinux 上下文
一個 SELinux 上下文(Context)由一個存取控制環境所組成,在這個環境中,決定的做出將基於 SELinux 的使用者,角色和型別(和可選的級別):
- 一個 SELinux 使用者是通過將一個常規的 Linux 使用者賬戶對映到一個 SELinux 使用者賬戶來實現的,反過來,在一個對談中,這個 SELinux 使用者賬戶在 SELinux 上下文中被進程所使用,以便能夠明確定義它們所允許的角色和級別。
- 角色的概念是作為域和處於該域中的 SELinux 使用者之間的媒介,它定義了 SELinux 可以存取到哪個進程域和哪些檔案型別。這將保護您的系統免受提權漏洞的攻擊。
- 型別則定義了一個 SELinux 檔案型別或一個 SELinux 進程域。在正常情況下,進程將會被禁止存取其他進程正使用的檔案,並禁止對其他進程進行存取。這樣只有當一個特定的 SELinux 策略規則允許它存取時,才能夠進行存取。
下面就讓我們看看這些概念是如何在下面的例子中起作用的。
例 1:改變 sshd 守護行程的預設埠
在 RHCSA 系列(八): 加固 SSH,設定主機名及啟用網路服務 中,我們解釋了更改 sshd 所監聽的預設埠是加固你的伺服器免受外部攻擊的首要安全措施。下面,就讓我們編輯 /etc/ssh/sshd_config
檔案並將埠設定為 9999:
Port9999
儲存更改並重新啟動 sshd:
#systemctl restart sshd
#systemctl status sshd
重新啟動 SSH 服務
正如你看到的那樣, sshd 啟動失敗,但為什麼會這樣呢?
快速檢查 /var/log/audit/audit.log
檔案會發現 sshd 已經被拒絕在埠 9999 上開啟(SELinux 的紀錄檔資訊包含單詞 "AVC",所以這類資訊可以被輕易地與其他資訊相區分),因為這個埠是 JBoss 管理服務的保留埠:
#cat/var/log/audit/audit.log |grep AVC |tail-1
檢視 SSH 紀錄檔
在這種情況下,你可以像先前解釋的那樣禁用 SELinux(但請不要這樣做!),並嘗試重新啟動 sshd,且這種方法能夠起效。但是, semanage
應用可以告訴我們在哪些埠上可以開啟 sshd 而不會出現任何問題。
執行:
# semanage port -l |grepssh
便可以得到一個 SELinux 允許 sshd 在哪些埠上監聽的列表:
Semanage 工具
所以讓我們在 /etc/ssh/sshd_config
中將埠更改為 9998 埠,增加這個埠到 sshportt 的上下文,然後重新啟動 sshd 服務:
# semanage port -a -t ssh_port_t-p tcp 9998
#systemctl restart sshd
#systemctlis-active sshd
semanage 新增埠
如你所見,這次 sshd 服務被成功地開啟了。這個例子告訴我們一個事實:SELinux 用它自己的埠型別的內部定義來控制 TCP 埠號。
例 2:允許 httpd 存取 sendmail
這是一個 SELinux 管理一個進程來存取另一個進程的例子。假如在你的 RHEL 7 伺服器上,你要為 Apache 設定 mod_security 和 mod_evasive,你需要允許 httpd 存取 sendmail,以便在遭受到 (D)DoS 攻擊時能夠用郵件來提醒你。在下面的命令中,如果你不想使得更改在重新啟動後仍然生效,請去掉 -P
選項。
# semanage boolean -1|grep httpd_can_sendmail
# setsebool -P httpd_can_sendmail 1
# semanage boolean -1|grep httpd_can_sendmail
允許 Apache 傳送郵件
從上面的例子中,你可以知道 SELinux 布林設定(或者只是布林值)分別對應於 true 或 false,被嵌入到了 SELinux 策略中。你可以使用 semanage boolean -l
來列出所有的布林值,也可以管道至 grep 命令以便篩選輸出的結果。
例 3:在一個特定目錄而非預設目錄下提供一個靜態站點服務
假設你正使用一個不同於預設目錄(/var/www/html
)的目錄來提供一個靜態站點服務,例如 /websites
目錄(這種情形會出現在當你把你的網路檔案儲存在一個共用網路裝置上,並需要將它掛載在 /websites 目錄時)。
a). 在 /websites 下建立一個 index.html 檔案並包含如下的內容:
<html>
<h2>SELinux test</h2>
</html>
假如你執行
#ls-lZ /websites/index.html
你將會看到這個 index.html 已經被標記上了 default_t SELinux 型別,而 Apache 不能存取這類檔案:
檢查 SELinux 檔案的許可權
b). 將 /etc/httpd/conf/httpd.conf
中的 DocumentRoot 改為 /websites,並不要忘了 更新相應的 Directory 塊。然後重新啟動 Apache。
c). 瀏覽 http://<web server IP address>
,則你應該會得到一個 503 Forbidden 的 HTTP 響應。
d). 接下來,遞回地改變 /websites 的標誌,將它的標誌變為 httpd_sys_content_t
型別,以便賦予 Apache 對這些目錄和其內容的唯讀存取許可權:
# semanage fcontext -a -t httpd_sys_content_t"/websites(/.*)?"
e). 最後,應用在 d) 中建立的 SELinux 策略:
# restorecon -R -v /websites
現在重新啟動 Apache 並再次瀏覽到 http://<web server IP address>
,則你可以看到被正確展現出來的 html 檔案:
確認 Apache 頁面
總結
在本文中,我們詳細地介紹了 SELinux 的基礎知識。請注意,由於這個主題的廣泛性,在單篇文章中做出一個完全詳盡的解釋是不可能的,但我們相信,在這個指南中列出的基本原則將會對你進一步了解更高階的話題有所幫助,假如你想了解的話。
假如可以,請讓我推薦兩個必要的資源來入門 SELinux:NSA SELinux 頁面 和 針對使用者和系統管理員的 RHEL 7 SELinux 指南。
假如你有任何的問題或評論,請不要猶豫,讓我們知曉吧。
SELinux的多層安全機制 http://www.linuxidc.com/Linux/2015-05/117168.htm
SELinux安全上下文初探 http://www.linuxidc.com/Linux/2014-04/99508.htm
一次由SELinux引起的SSH公鑰認證失敗問題 http://www.linuxidc.com/Linux/2013-07/87267.htm
SELinux 入門教學 http://www.linuxidc.com/Linux/2013-04/82371.htm
SELinux簡單設定 http://www.linuxidc.com/Linux/2012-12/77032.htm
CentOS系統如何快速關閉SELinux http://www.linuxidc.com/Linux/2012-11/74613.htm
CentOS/RHEL下如何關閉SELinux http://www.linuxidc.com/Linux/2011-05/36486.htm
via: http://www.tecmint.com/selinux-essentials-and-control-filesystem-access/
作者:Gabriel Cánepa 譯者:FSSlc 校對:wxy
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-10/123766.htm
相關文章