SELinux簡介:Linux內核安全
雖然SELinux已在Linux內核中存在了近十年,但至今仍有很多管理員由于擔心其配置的復雜性而棄之不用。雖然許多Linux管理員在他們的Linux服務器中禁用SELinux來避免在安裝應用程序時對它進行配置,但在Linux安全性方面SELinux是一個非常有用的工具。下面讓我們了解一下它的工作原理,用SELinux策略和訪問控制的管理方式來保護你的Linux服務器吧。
在Linux操作系統中,SELinux實現了強制訪問控制(MAC)的安全模式。在標準的Linux環境中開啟了自由訪問控制(DAC)后,這一機制就會在Linux內核中對所有操作的安全性進行檢查。
理解DAC和MAC的Linux安全模型
由于SELinux以MAC為基礎,所以了解DAC(默認的Linux安全模型)的不足以及MAC相對于DAC的優勢就變得非常重要。
在MAC模式下,管理員控制了系統中軟件的所有交互行為。采用了最小特權方式后,默認情況下應用程序和用戶沒有任何權限,因為作為系統安全策略的一部分,所有的權限都必須由管理員授予。在DAC模式下,文件所有權在用戶,且該用戶對它們有完全的控制權限。黑客們攻擊用戶帳戶后,便可以對該用戶擁有的文件做任何事情。例如,黑客攻擊FTP服務器后將完全控制FTP服務器帳戶擁有的所有文件。更糟的是,如果一個應用程序在根帳號下(常見的如Web和FTP服務)運行時,攻擊者將完全控制整個操作系統。
MAC模式為每一個應用程序都提供了一個虛擬“沙漏”,只允許應用程序執行它設計需要且在安全策略中明確允許的任務。例如,Web服務器可能只能夠讀取網站發布的文件,并監聽在指定網絡的端口。即使攻擊者將其攻破,他們也無法執行在安全策略中沒有明確允許的任何活動,即使這個進程在根用戶下運行。
標準Unix權限仍然會在系統中存在。當文件被訪問時,標準Unix權限將先于SELinux安全策略生效。如果標準權限拒絕訪問,訪問直接被拒絕,SELinux在整個過程中沒有參與。但是,如果標準權限允許訪問,SELinux此時將參與進來并根據其源進程和目標對象的安全上下文來判斷允許還是拒絕訪問。
SELinux中主體和客體的定義
在MAC的安全上下文中有兩個重要概念,主體和客體。MAC(或非自由訪問控制)框架允許你規定所有進程(稱為主體)與系統其它部分如文件、設備、套接字、端口以及其它進程(稱為客體)進行交互的權限。它通過對所有進程和對象定義安全策略來實現。這些進程和對象都由內核控制,安全的決定基于所有可用的信息,而不僅僅是用戶的身份。在此模型中,一個進程可被授予的權限只是它需要且能發揮作用的權限。這遵循了最小權限原則,不同于DAC完全權限的概念。
舉例來說,在MAC模式下,用戶通常是將自己的數據存放在主目錄中來保護自己的數據,但是使用chmod命令修改文件的權限將會暴露自己的數據,這時受管制的進程如果沒有權限無法接觸這些文件或試圖修改相應的策略。
SELinux安全策略:嚴格和定向
SELinux遵循最小特權模式。默認情況下,所有的行為都遭到拒絕,然后我們會針對系統的每個單元(服務、程序、用戶、進程)單獨增加策略以允許它們執行特定的功能。如果一個服務,程序或用戶試圖訪問或修改一個不是它們所必須的的文件或資源,訪問就會被拒絕且系統會將其記錄到日志中。因為SELinux在內核中運行,每個應用程序并不需要針對它進行特別的修改。如果SELinux阻止了某個操作,應用程序只是會收到一個普通的“拒絕訪問”的報錯。
下圖描述的是SELinux默認定向策略的的工作流程:

策略是SELinux最重要的概念之一。最小特權模式就很能說明“嚴格”策略。SELinux可以允許很多不同的策略,在CentOS5和RHEL中默認的策略是“定向”,它主要針對的范圍是關鍵的系統進程。在RHEL中,有超過200個這樣的客體存在(包括httpd,named,dhcpd,mysqld)。除此之外,系統中其它的進程都在一個非限制域中運行,不受SELinux影響。定向策略的目標是讓每一個啟動時就默認安裝和運行的進程都在限制域中運行。“定向”策略目的是在不嚴重影響終端用戶體驗的情況下盡可能保護最多的重要進程,大多數用戶甚至完全感覺不到SELinux在運行。
另一個重要的概念是SELinux的訪問控制。訪問控制有三種類型,它們是類型加強(TE)的訪問控制、基于角色的訪問控制(RBAC)和多級安全(MLS)訪問控制。在定向策略中TE是首要的訪問控制機制。
建立SELinux的安全上下文
對于理解SELinux很重要的一點是:在SELinux模型中所有的進程和文件都有一個SELinux的安全上下文。可以簡單的使用“-Z”參數來顯示其安全上下文,如下所示:

大部分SELinux報錯都是圍繞著客體的安全上下文進行的。這些安全上下文格式為:
用戶:角色:類型:多級安全(MLS)。最后一個字段“多級安全”始終隱藏(這在定向策略中是默認的)。舉個例子,如上圖所示,對于文件hello.pl,用戶是root,角色是object_r,類型是httpd_sys_content_t。在定向策略中,最重要的字段是類型,主要是用它來實現TE的訪問控制。
類似地,你可以在Linux中使用命令“ps -Z”來列出所有正運行進程的安全上下文,例如:
- #ps -efZ | grep mail
- system_u:system_r:sendmail_t root 2661 1 0
- 12:30 ? 00:00:00 sendmail: accepting connections
- system_u:system_r:sendmail_t smmsp 2670 1 0
- 12:30 ? 00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
上面的輸出顯示我的Linux服務器中的sendmail進程運行的類型是“Sendmail_t”。
【編輯推薦】