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