SELinux有Disabled、Permissive和Enforcing3種工作模式。在Disable模式中,SELinux被關(guān)閉,默認(rèn)的DAC訪問控制方式被使用。在Permissive模式中,SELinux被啟用,但安全策略規(guī)則并沒有被強(qiáng)制執(zhí)行;當(dāng)安全策略規(guī)則應(yīng)該拒絕訪問時(shí),訪問仍然被允許。在Enforcing模式中,SELinux被啟動(dòng),并強(qiáng)制執(zhí)行所有的安全策略規(guī)則。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
SELinux是什么
SELinux,Security Enhanced Linux 的縮寫,也就是安全強(qiáng)化的 Linux,是由美國國家安全局(NSA)聯(lián)合其他安全機(jī)構(gòu)(比如 SCC 公司)共同開發(fā)的,旨在增強(qiáng)傳統(tǒng) Linux 操作系統(tǒng)的安全性,解決傳統(tǒng) Linux 系統(tǒng)中自主訪問控制(DAC)系統(tǒng)中的各種權(quán)限問題(如 root 權(quán)限過高等)。
SELinux 項(xiàng)目在 2000 年以 GPL 協(xié)議的形式開源,當(dāng) Red Hat 在其 Linux 發(fā)行版本中包括了 SELinux 之后,SELinux 才逐步變得流行起來。現(xiàn)在,SELinux 已經(jīng)被許多組織廣泛使用,幾乎所有的 Linux 內(nèi)核 2.6 以上版本,都集成了 SELinux 功能。
對于 SELinux,初學(xué)者可以這么理解,它是部署在 Linux 上用于增強(qiáng)系統(tǒng)安全的功能模塊。
我們知道,傳統(tǒng)的 Linux 系統(tǒng)中,默認(rèn)權(quán)限是對文件或目錄的所有者、所屬組和其他人的讀、寫和執(zhí)行權(quán)限進(jìn)行控制,這種控制方式稱為自主訪問控制(DAC)方式;而在 SELinux 中,采用的是強(qiáng)制訪問控制(MAC)系統(tǒng),也就是控制一個(gè)進(jìn)程對具體文件系統(tǒng)上面的文件或目錄是否擁有訪問權(quán)限,而判斷進(jìn)程是否可以訪問文件或目錄的依據(jù),取決于 SELinux 中設(shè)定的很多策略規(guī)則。
說到這里,讀者有必要詳細(xì)地了解一下這兩個(gè)訪問控制系統(tǒng)的特點(diǎn):
- 自主訪問控制系統(tǒng)(Discretionary Access Control,DAC)是 Linux 的默認(rèn)訪問控制方式,也就是依據(jù)用戶的身份和該身份對文件及目錄的 rwx 權(quán)限來判斷是否可以訪問。不過,在 DAC 訪問控制的實(shí)際使用中我們也發(fā)現(xiàn)了一些問題:
root 權(quán)限過高,rwx 權(quán)限對 root 用戶并不生效,一旦 root 用戶被竊取或者 root 用戶本身的誤操作,都是對 Linux 系統(tǒng)的致命威脅。
Linux 默認(rèn)權(quán)限過于簡單,只有所有者、所屬組和其他人的身份,權(quán)限也只有讀、寫和執(zhí)行權(quán)限,并不利于權(quán)限細(xì)分與設(shè)定。
不合理權(quán)限的分配會導(dǎo)致嚴(yán)重后果,比如給系統(tǒng)敏感文件或目錄設(shè)定 777 權(quán)限,或給敏感文件設(shè)定特殊權(quán)限——SetUID 權(quán)限等。 - 強(qiáng)制訪問控制(Mandatory Access Control,MAC)是通過 SELinux 的默認(rèn)策略規(guī)則來控制特定的進(jìn)程對系統(tǒng)的文件資源的訪問。也就是說,即使你是 root 用戶,但是當(dāng)你訪問文件資源時(shí),如果使用了不正確的進(jìn)程,那么也是不能訪問這個(gè)文件資源的。
這樣一來,SELinux 控制的就不單單只是用戶及權(quán)限,還有進(jìn)程。每個(gè)進(jìn)程能夠訪問哪個(gè)文件資源,以及每個(gè)文件資源可以被哪些進(jìn)程訪問,都靠 SELinux 的規(guī)則策略來確定。
注意,在 SELinux 中,Linux 的默認(rèn)權(quán)限還是有作用的,也就是說,一個(gè)用戶要能訪問一個(gè)文件,既要求這個(gè)用戶的權(quán)限符合 rwx 權(quán)限,也要求這個(gè)用戶的進(jìn)程符合 SELinux 的規(guī)定。
不過,系統(tǒng)中有這么多的進(jìn)程,也有這么多的文件,如果手工來進(jìn)行分配和指定,那么工作量過大。所以 SELinux 提供了很多的默認(rèn)策略規(guī)則,這些策略規(guī)則已經(jīng)設(shè)定得比較完善,我們稍后再來學(xué)習(xí)如何查看和管理這些策略規(guī)則。
為了使讀者清楚地了解 SELinux 所扮演的角色,這里舉一個(gè)例子,假設(shè) apache 上發(fā)現(xiàn)了一個(gè)漏洞,使得某個(gè)遠(yuǎn)程用戶可以訪問系統(tǒng)的敏感文件(如 /etc/shadow)。如果我們的 Linux 中啟用了 SELinux,那么,因?yàn)?apache 服務(wù)的進(jìn)程并不具備訪問 /etc/shadow 的權(quán)限,所以這個(gè)遠(yuǎn)程用戶通過 apache 訪問 /etc/shadow文件就會被 SELinux 所阻擋,起到保護(hù) Linux 系統(tǒng)的作用。
SELinux 的工作模式(Disabled、Permissive和Enforcing)
在傳統(tǒng) Linux 系統(tǒng)使用訪問控制方式的基礎(chǔ)上,附加使用 SELinux 可增強(qiáng)系統(tǒng)安全。 那么,SELinux 是如何運(yùn)行的呢?
在解釋 SELinux 的工作模式之前,先解釋幾個(gè)概念。
1.主體(Subject):就是想要訪問文件或目錄資源的進(jìn)程。想要得到資源,基本流程是這樣的:由用戶調(diào)用命令,由命令產(chǎn)生進(jìn)程,由進(jìn)程去訪問文件或目錄資源。在自主訪問控制系統(tǒng)中(Linux 默認(rèn)權(quán)限中),靠權(quán)限控制的主體是用戶;而在強(qiáng)制訪問控制系統(tǒng)中(SELinux 中),靠策略規(guī)則控制的主體則是進(jìn)程。
2. 目標(biāo)(Object) :這個(gè)概念比較明確,就是需要訪問的文件或目錄資源。
3. 策略(Policy) :Linux 系統(tǒng)中進(jìn)程與文件的數(shù)量龐大,那么限制進(jìn)程是否可以訪問文件的 SELinux 規(guī)則數(shù)量就更加煩瑣,如果每個(gè)規(guī)則都需要管理員手工設(shè)定,那么 SELinux 的可用性就會極低。還好我們不用手工定義規(guī)則,SELinux 默認(rèn)定義了兩個(gè)策略,規(guī)則都已經(jīng)在這兩個(gè)策略中寫好了,默認(rèn)只要調(diào)用策略就可以正常使用了。這兩個(gè)默認(rèn)策略如下:
- -targeted:這是 SELinux 的默認(rèn)策略,這個(gè)策略主要是限制網(wǎng)絡(luò)服務(wù)的,對本機(jī)系統(tǒng)的限制極少。我們使用這個(gè)策略已經(jīng)足夠了。
- -mls:多級安全保護(hù)策略,這個(gè)策略限制得更為嚴(yán)格。
4. 安全上下文(Security Context) :每個(gè)進(jìn)程、文件和目錄都有自己的安全上下文,進(jìn)程具體是否能夠訪問文件或目錄,就要看這個(gè)安全上下文是否匹配。如果進(jìn)程的安全上下文和文件或目錄的安全上下文能夠匹配,則該進(jìn)程可以訪問這個(gè)文件或目錄。當(dāng)然,判斷進(jìn)程的安全上下文和文件或目錄的安全上下文是否匹配,則需要依靠策略中的規(guī)則。
舉個(gè)例子,我們需要找對象,男人可以看作主體,女人就是目標(biāo)了。而男人是否可以追到女人(主體是否可以訪問目標(biāo)),主要看兩個(gè)人的性格是否合適(主體和目標(biāo)的安全上下文是否匹配)。不過,兩個(gè)人的性格是否合適,是需要靠生活習(xí)慣、為人處世、家庭環(huán)境等具體的條件來進(jìn)行判斷的(安全上下文是否匹配是需要通過策略中的規(guī)則來確定的)。
我們畫一張示意圖,來表示一下這幾個(gè)概念之間的關(guān)系,如圖 1 所示。
圖 1 SELinux 運(yùn)行模式的相關(guān)概念
解釋一下這張示意圖:當(dāng)主體想要訪問目標(biāo)時(shí),如果系統(tǒng)中啟動(dòng)了 SELinux,則主體的訪問請求首先需要和 SELinux 中定義好的策略進(jìn)行匹配。如果進(jìn)程符合策略中定義好的規(guī)則,則允許訪問,這時(shí)進(jìn)程的安全上下文就可以和目標(biāo)的安全上下文進(jìn)行匹配;如果比較失敗,則拒絕訪問,并通過 AVC(Access Vector Cache,訪問向量緩存,主要用于記錄所有和 SELinux 相關(guān)的訪問統(tǒng)計(jì)信息)生成拒絕訪問信息。如果安全上下文匹配,則可以正常訪問目標(biāo)文件。當(dāng)然,最終是否可以真正地訪問到目標(biāo)文件,還要匹配產(chǎn)生進(jìn)程(主體)的用戶是否對目標(biāo)文件擁有合理的讀、寫、執(zhí)行權(quán)限。
我們在進(jìn)行 SELinux 管理的時(shí)候,一般只會>修改文件或目錄的安全上下文,使其和訪問進(jìn)程的安全上下文匹配或不匹配,用來控制進(jìn)程是否可以訪問文件或目錄資源;而很少會去修改策略中的具體規(guī)則,因?yàn)橐?guī)則實(shí)在太多了,修改起來過于復(fù)雜。不過,我們是可以人為定義規(guī)則是否生效,用以控制規(guī)則的啟用與關(guān)閉的。
SELinux 的工作模式
SELinux 提供了 3 種工作模式:Disabled、Permissive 和 Enforcing,而每種模式都為 Linux 系統(tǒng)安全提供了不同的好處。
-
Disable工作模式(關(guān)閉模式)
在 Disable 模式中,SELinux 被關(guān)閉,默認(rèn)的 DAC 訪問控制方式被使用。對于那些不需要增強(qiáng)安全性的環(huán)境來說,該模式是非常有用的。
例如,若從你的角度看正在運(yùn)行的應(yīng)用程序工作正常,但是卻產(chǎn)生了大量的 SELinux AVC 拒絕消息,最終可能會填滿日志文件,從而導(dǎo)致系統(tǒng)無法使用。在這種情況下,最直接的解決方法就是禁用 SELinux,當(dāng)然,你也可以在應(yīng)用程序所訪問的文件上設(shè)置正確的安全上下文。
需要注意的是,在禁用 SELinux 之前,需要考慮一下是否可能會在系統(tǒng)上再次使用 SELinux,如果決定以后將其設(shè)置為 Enforcing 或 Permissive,那么當(dāng)下次重啟系統(tǒng)時(shí),系統(tǒng)將會通過一個(gè)自動(dòng) SELinux 文件重新進(jìn)程標(biāo)記。
關(guān)閉 SELinux 的方式也很簡單,只需編輯配置文件 /etc/selinux/config,并將文本中 SELINUX= 更改為 SELINUX=disabled 即可,重啟系統(tǒng)后,SELinux 就被禁用了。
-
Permissive工作模式(寬容模式)
在 Permissive 模式中,SELinux 被啟用,但安全策略規(guī)則并沒有被強(qiáng)制執(zhí)行。當(dāng)安全策略規(guī)則應(yīng)該拒絕訪問時(shí),訪問仍然被允許。然而,此時(shí)會向日志文件發(fā)送一條消息,表示該訪問應(yīng)該被拒絕。
SELinux Permissive 模式主要用于以下幾種情況:
審核當(dāng)前的 SELinux 策略規(guī)則;
測試新應(yīng)用程序,看看將 SELinux 策略規(guī)則應(yīng)用到這些程序時(shí)會有什么效果;
解決某一特定服務(wù)或應(yīng)用程序在 SELinux 下不再正常工作的故障。
某些情況下,可使用 audit2allow 命令來讀取 SELinux 審核日志并生成新的 SELinux 規(guī)則,從而有選擇性地允許被拒絕的行為,而這也是一種在不禁用 SELinux 的情況下,讓應(yīng)用程序在 Linux 系統(tǒng)上工作的快速方法。
-
Enforcing工作模式(強(qiáng)制模式)
從此模式的名稱就可以看出,在 Enforcing 模式中, SELinux 被啟動(dòng),并強(qiáng)制執(zhí)行所有的安全策略規(guī)則。