紅帽SELinux資料-翻譯---第一章-介紹
紅帽企業 Linux 7 SELinux
用戶和管理員指南
翻譯者:李天聰
第一章 介紹
安全性增強型 Linux (SELinux) 提供了額外的系統安全層。SELinux從根本上回答了這個問題:“<subject>可以對<object>做<action>嗎?”,例如:“一個網絡用戶主 可以 訪問 服務器目錄中的文件嗎?
基于用戶、組和其他權限的標準訪問策略,稱為“自由裁量”訪問控制(DAC),它不能使系統管理員創建全面、精粒度的安全策略,例如將特定應用程序限制為僅能夠查看日志文件,同時允許其他應用程序將新數據寫入到日志文件。
SELinux 實現了強制訪問控制 (MAC)。每個進程和系統資源都有一個稱為 SELinux 上下文(context)的特殊安全標簽。SELinux 上下文,有時稱為 SELinux標簽,是一個標識符,它抽象出系統級的細節并專注于安全性實體的屬性。這不僅提供了一種一致的方式來引用SELinux 策略,但它也消除了在其他識別方法中可能存在的的任何歧義;例如,一個文件在使用綁定裝載的系統上可以有多個有效的路徑名。
SELinux 策略在一系列規則中使用這些上下文,這些規則定義了進程如何與彼此和各種系統資源進行交互。默認情況下,該策略不允許任何交互,除非規則顯式授予訪問權限。
需要注意的一點是:SELinux規則是在DAC規則之后被檢查的,如果DAC規則拒絕了一個操作,就不會再使用SELinux策略規則。這意味著,如果DAC規則阻止了訪問,則不會有SELinux日志產生。
SELinux 上下文有幾個字段:用戶(user)、角色(role)、類型(type)和安全級別(security level)。
對于 SELinux 策略,SELinux 類型也許是最重要的。最常見的策略規則,僅使用 SELinux 類型(而不是完整的 SELinux 上下文)定義進程和系統資源之間允許的交互。
SELinux 類型通常以 _t 結尾。例如,Web服務的域為httpd_t。在 /var/www/html/ 中的文件和目錄的類型通常是httpd_sys_content_t。在 /tmp 和 /var/tmp/ 中的文件和目錄的類型通常是tmp_t。Web 服務端口的類型上下文是http_port_t。
例如,有一個策略規則允許 Apache(以 httpd_t 域運行的Web服務進程)去訪問/var/www/html/目錄和其他 Web 服務目錄(在這些目錄下文件的類型通常是httpd_sys_content_t)。由于策略中沒有規則允許httpd_t對/tmp 和 /var/tmp/中的文件進行訪問,因此這兩個目錄是不允許訪問的。因此,由于有SELinux的存在,即使Apache遭到入侵,并且惡意腳本獲得了訪問權限,但它仍然無法訪問 /tmp 目錄。

圖1.1 SELinux允許以httpd_t域運行的 Apache 進程訪問 /var/www/html/目錄,但禁止這個進程訪問 /data/mysql/ 目錄,因為沒有httpd_t和mysqld_db_t類型上下文的允許規則)。另一方面,mysqld_t域運行的MariaDB 進程能夠訪問 /data/mysql/ 目錄,并且 SELinux 也正確的拒絕了mysqld_t域的進程去訪問標記為httpd_sys_content_t的/var/www/html/目錄。
其他資源
有關詳細信息,請參閱以下文檔:
- selinux(8)手冊頁和由 apropos selinux 命令列出的手冊頁。
- 安裝selinux-policy-doc package,然后用“man -k _selinux”命令查看手冊。有關更多信息,請參見第 11.3.3 節 “服務手冊頁”。
- SELinux 圖畫書(https://people.redhat.com/duffy/selinux/selinux-coloring-book_A4-Stapled.pdf)
- SELinux Wiki FAQ
1.1 運行 SELINUX 的好處
SELinux 具有以下優點:
- 所有進程和文件都已標記。
SELinux 策略規則定義進程如何與文件交互,以及進程之間如何相互作用。僅當存在專門的允許規則時,SELinux才允許訪問。
- 精細訪問控制。
超越的傳統UNIX那一套基于Linux用戶和組ID的權限控制,SELinux 訪問決策基于所有可用信息,例如 SELinux 用戶、角色、類型以及(可選)安全級別。
- SELinux 策略是管理定義的,并在系統范圍內強制執行。
這句話原文是:“SELinux policy is administratively-defined and enforced system-wide”,翻譯可能不準確。
- 改進了對權限升級攻擊的緩解措施。
進程在域中運行,并且因此彼此分離。SELinux 策略規則定義進程如何訪問文件以及其他進程。如果進程遭到入侵,攻擊者只能訪問該進程的正常功能,以及此進程有權訪問的文件。例如,如果Apache HTTP服務遭到入侵,則攻擊者無法使用該進程讀取用戶主目錄中的文件,除非添加或配置了特定的 SELinux 策略規則以允許此類訪問。
- SELinux可用于加強數據機密性和完整性,以及保護進程防止來自不可信的輸入。
然而,SELinux不是:
- 殺毒軟件,
- 密碼轉換、防火墻或其他安全系統,
- 一體化安全解決方案
SELinux 旨在增強現有的安全解決方案,而不是取代它們。即使在SELinux運行的時候,依然是需要繼續遵循良好的安全規范,例如持續更新軟件,使用難以猜測的密碼或使用防火墻。
1.2 例子
以下示例演示了 SELinux 如何提高安全性:
- 默認操作為“拒絕”。
如果不存在允許訪問的 SELinux 策略規則,例如一個試圖打開文件的進程,訪問被拒絕。
- SELinux可以限制Linux用戶。
SELinux 策略中存在許多受限的 SELinux 用戶。Linux 用戶可以映射到受限的 SELinux 用戶以將有利于安全的規則和機制應用與他們。例如,將一個Linux 用戶映射到 SELinux的user_u用戶,會導致 Linux 用戶無法運行(除非另有配置)設置用戶ID(setuid)應用程序,例如sudo和su,以及阻止它們執行家目錄中的應用程序。如果已配置,這將阻止用戶執行家目錄中的惡意文件。請參見第 3.3 節 “受限和不受限制的用戶”了解更多信息。
- 增加了進程和數據分離的機制。
進程運行在其自己的域中,從而阻止進程訪問其他進程使用的文件,以及阻止進程訪問其他進程。例如,在運行 SELinux 時,除非另有配置,否則攻擊者無法在破壞了Samba服務器后,將這個Samba服務器用作攻擊向量來讀取或寫入其他進程使用的文件,例如 MariaDB 數據庫。
- SELinux 有助于減輕配置錯誤造成的損害。
域名解析服務器(DNS)通常在所謂的域傳送(zone transfer)中相互復制信息。攻擊者可以使用域傳機制送來更新具有虛假信息的DNS服務器。當在Red Hat Enterprise Linux上將伯克利互聯網名稱域(BIND)作為 DNS 服務器運行時,即使管理員忘記限制哪些服務器可以執行域傳送,默認的 SELinux 策略也會阻止區域文件(包含 DNS 服務器使用的信息(如主機名到 IP 地址映射)的文本文件)被由BIND命名的守護程序本身或其他進程 利用域傳送機制進行更新。
原文是“the default SELinux policy prevents zone files from being updated using zone transfers, by the BIND named daemon itself, and by other processes”,翻譯可能不是很貼切。
請參閱文章:
NetworkWorld.com
服務器軟件的安全帶:SELinux 阻止現實世界漏洞利用
(http://www.networkworld.com/article/2283723/lan-wan/a-seatbelt-for-server-software--selinux-blocks-real-world-exploits.html ),有關 SELinux 的背景信息,以及利用SELinux 阻止過的各種漏洞的信息。
1.3 SELINUX架構
SELinux 是內置在Linux內核中的Linux安全模塊(LSM)。內核中的SELinux子系統由安全策略驅動,該策略由管理員控制并在引導時加載。系統上所有與安全相關的內核級訪問操作都將被SELinux截獲,并在加載的安全策略的上下文中進行檢查。如果加載的策略允許該操作,則繼續。否則,操作將被阻止,并且進程會收到錯誤。
SELinux 決策(例如允許或不允許訪問)被緩存。此緩存稱為訪問矢量緩存 (AVC)。由于使用了這些緩存決策,較少需要檢查 SELinux 策略規則,這提高了性能。請記住,如果DAC規則首先拒絕了訪問,將不會用到SELinux 策略規則。
1.4 SELINUX 狀態和模式
SELinux可以在以下三種模式之一下運行:disabled、 permissive、enforcing。
- Disabled模式
強烈建議不要使用disabled模式;系統不僅不執行 SELinux 策略,而且還不在標記任何持久對象(如文件),使得將來難以啟用 SELinux。
原文是:“not only does the system avoid enforcing the SELinux policy, it also avoids labeling any persistent objects such as files, making it difficult to enable SELinux in the future.”,這跟我們實際上選擇disabled模式之后的現象是不符的,文件的安全標記(安全上下文)還是有的,而且將來要開啟selinux時,也沒有很“難”。
- Permissive模式
在permissive模式下,系統的行為就像 SELinux 正在執行加載的安全策略一樣,包括標記對象和在日志中記錄訪問拒絕日志,但它實際上并不會阻止任何操作。雖然不建議用于生產環境,但permissive模式對于SELinux 策略的開發工作很有用。
- Enforcing模式
Enforcing模式是默認和推薦的操作模式;在Enforcing模式下SELinux正常運行,在整個系統上強制實施加載的安全策略。
使用 setenforce 命令可以在enforcing模式和permissive模式之間進行切換。所做的更改設置強制在重新啟動后不會保留。要更改為enforcing模式,請以linux的root用戶輸入“setenforce 1”命令。要更改為permissive模式,請輸入 “setenforce 0” 命令。getenforce命令用于查看當前 SELinux 模式:

在紅帽企業 Linux 中,您可以在系統運行時將單個域設置為enforcing模式或permissive模式。例如,要將httpd_t域改為permissive:
有關更多信息,請參見第 11.3.4 節 “許可域”。
注意:持久狀態和模式的更改在第 4.4 節 “永久更改SELinux 狀態和模式”。
1.5 附加資源
紅帽身份管理 (IdM) 提供了一個集中式解決方案來定義 SELinux 用戶映射。更多詳細信息,請參閱 《Linux域身份、身份驗證和策略指南中的定義SELinux 用戶映射》(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Linux_Domain_Identity_Authentication_and_Policy_Guide/selinux-mapping.html)。

浙公網安備 33010602011771號