看漫畫學(xué)SELinux的強(qiáng)制策略
今年是我們一起慶祝 SELinux 紀(jì)念日的第十個(gè)年頭了(LCTT 譯者注:本文發(fā)表于 2013 年)。真是太難以置信了!SELinux 最初在 Fedora Core 3 中被引入,隨后加入了紅帽企業(yè)版 Linux 4。從來沒有使用過 SELinux 的家伙,你可要好好兒找個(gè)理由了……
SElinux 是一個(gè)標(biāo)簽型系統(tǒng)。每一個(gè)進(jìn)程都有一個(gè)標(biāo)簽。操作系統(tǒng)中的每一個(gè)文件/目錄客體(object)也都有一個(gè)標(biāo)簽。甚至連網(wǎng)絡(luò)端口、設(shè)備,乃至潛在的主機(jī)名都被分配了標(biāo)簽。我們把控制訪問進(jìn)程的標(biāo)簽的規(guī)則寫入一個(gè)類似文件的客體標(biāo)簽中,這些規(guī)則我們稱之為策略(policy)。內(nèi)核強(qiáng)制實(shí)施了這些規(guī)則。有時(shí)候這種“強(qiáng)制”被稱為強(qiáng)制訪問控制體系(Mandatory Access Control)(MAC)。
一個(gè)客體的擁有者對客體的安全屬性并沒有自主權(quán)。標(biāo)準(zhǔn) Linux 訪問控制體系,擁有者/分組 + 權(quán)限標(biāo)志如 rwx,常常被稱作自主訪問控制(Discretionary Access Control)(DAC)。SELinux 沒有文件 UID 或擁有權(quán)的概念。一切都被標(biāo)簽控制,這意味著在沒有至高無上的 root 權(quán)限進(jìn)程時(shí),也可以設(shè)置 SELinux 系統(tǒng)。
注意: SELinux 不允許你摒棄 DAC 控制。SELinux 是一個(gè)并行的強(qiáng)制模型。一個(gè)應(yīng)用必須同時(shí)支持 SELinux 和 DAC 來完成特定的行為。這可能會導(dǎo)致管理員迷惑為什么進(jìn)程被拒絕訪問。管理員被拒絕訪問是因?yàn)樵?DAC 中有些問題,而不是在 SELinux 標(biāo)簽。
類型強(qiáng)制
讓我們更深入的研究下標(biāo)簽。SELinux 最主要的“模型”或“強(qiáng)制”叫做類型強(qiáng)制(type enforcement)?;旧线@意味著我們根據(jù)進(jìn)程的類型來定義其標(biāo)簽,以及根據(jù)文件系統(tǒng)客體的類型來定義其標(biāo)簽。
打個(gè)比方
想象一下在一個(gè)系統(tǒng)里定義客體的類型為貓和狗。貓(CAT)和狗(DOG)都是進(jìn)程類型(process type)。
Image showing a cartoon of a cat and dog.
我們有一類希望能與之交互的客體,我們稱之為食物。而我希望能夠?yàn)槭澄镌黾宇愋停篶at_food (貓的食物)和 dog_food(狗的食物)。
Cartoon Cat eating Cat Food and Dog eating Dog Food
作為一個(gè)策略制定者,我可以說一只狗有權(quán)限去吃狗糧(dog_chow),而一只貓有權(quán)限去吃貓糧(cat_chow)。在 SELinux 中我可以將這條規(guī)則寫入策略中。
SELinux rule
allow cat cat_chow:food eat;
允許 貓 貓糧:食物 吃;
allow dog dog_chow:food eat;
允許 狗 狗糧:食物 吃;
有了這些規(guī)則,內(nèi)核會允許貓進(jìn)程去吃打上貓糧標(biāo)簽 cat_chow 的食物,允許狗去吃打上狗糧標(biāo)簽 dog_chow 的食物。
Cartoon Cat eating Cat Food and Dog eating Dog Food
此外,在 SELinux 系統(tǒng)中,由于禁止是默認(rèn)規(guī)則,這意味著,如果狗進(jìn)程想要去吃貓糧 cat_chow,內(nèi)核會阻止它。
同理,貓也不允許去接觸狗糧。
Cartoon cat not allowed to eat dog fooda
現(xiàn)實(shí)例子
我們將 Apache 進(jìn)程標(biāo)為 httpd_t,將 Apache 上下文標(biāo)為 httpd_sys_content_t 和 httpdsys_content_rw_t。假設(shè)我們把信用卡數(shù)據(jù)存儲在 MySQL 數(shù)據(jù)庫中,其標(biāo)簽為 msyqld_data_t。如果一個(gè) Apache 進(jìn)程被劫持,黑客可以獲得 httpd_t 進(jìn)程的控制權(quán),從而能夠去讀取 httpd_sys_content_t 文件并向 httpd_sys_content_rw_t 文件執(zhí)行寫操作。但是黑客卻不允許去讀信用卡數(shù)據(jù)(mysqld_data_t),即使 Apache 進(jìn)程是在 root 下運(yùn)行。在這種情況下 SELinux 減輕了這次闖入的后果。
多類別安全強(qiáng)制
打個(gè)比方
上面我們定義了狗進(jìn)程和貓進(jìn)程,但是如果你有多個(gè)狗進(jìn)程:Fido 和 Spot,而你想要阻止 Fido 去吃 Spot 的狗糧 dog_chow 怎么辦呢?
SELinux rule
一個(gè)解決方式是創(chuàng)建大量的新類型,如 Fido_dog 和 Fido_dog_chow。但是這很快會變得難以駕馭因?yàn)樗械墓范加胁畈欢嘞嗤臋?quán)限。
為了解決這個(gè)問題我們發(fā)明了一種新的強(qiáng)制形式,叫做多類別安全(Multi Category Security)(MCS)。在 MCS 中,我們在狗進(jìn)程和狗糧的標(biāo)簽上增加了另外一部分標(biāo)簽?,F(xiàn)在我們將狗進(jìn)程標(biāo)記為 dog:random1(Fido) 和 dog:random2(Spot)。
Cartoon of two dogs fido and spot
我們將狗糧標(biāo)記為 dog_chow:random1(Fido) 和 dog_chow:random2(Spot)。
SELinux rule
MCS 規(guī)則聲明如果類型強(qiáng)制規(guī)則被遵守而且該 MCS 隨機(jī)標(biāo)簽正確匹配,則訪問是允許的,否則就會被拒絕。
Fido (dog:random1) 嘗試去吃 cat_chow:food 被類型強(qiáng)制拒絕了。
Cartoon of Kernel (Penquin) holding leash to prevent Fido from eating cat food.
Fido (dog:random1) 允許去吃 dog_chow:random1。
Cartoon Fido happily eating his dog food
Fido (dog:random1) 去吃 spot(dog_chow:random2)的食物被拒絕。
Cartoon of Kernel (Penquin) holding leash to prevent Fido from eating spots dog food.
現(xiàn)實(shí)例子
在計(jì)算機(jī)系統(tǒng)中我們經(jīng)常有很多具有同樣訪問權(quán)限的進(jìn)程,但是我們又希望它們各自獨(dú)立。有時(shí)我們稱之為多租戶環(huán)境(multi-tenant environment)。最好的例子就是虛擬機(jī)。如果我有一個(gè)運(yùn)行很多虛擬機(jī)的服務(wù)器,而其中一個(gè)被劫持,我希望能夠阻止它去攻擊其它虛擬機(jī)和虛擬機(jī)鏡像。但是在一個(gè)類型強(qiáng)制系統(tǒng)中 KVM 虛擬機(jī)被標(biāo)記為 svirt_t 而鏡像被標(biāo)記為 svirt_image_t。 我們允許 svirt_t 可以讀/寫/刪除標(biāo)記為 svirt_image_t 的上下文。通過使用 libvirt 我們不僅實(shí)現(xiàn)了類型強(qiáng)制隔離,而且實(shí)現(xiàn)了 MCS 隔離。當(dāng) libvirt 將要啟動一個(gè)虛擬機(jī)時(shí),它會挑選出一個(gè) MCS 隨機(jī)標(biāo)簽如 s0:c1,c2,接著它會將 svirt_image_t:s0:c1,c2 標(biāo)簽分發(fā)給虛擬機(jī)需要去操作的所有上下文。最終,虛擬機(jī)以 svirt_t:s0:c1,c2 為標(biāo)簽啟動。因此,SELinux 內(nèi)核控制 svirt_t:s0:c1,c2 不允許寫向 svirt_image_t:s0:c3,c4,即使虛擬機(jī)被一個(gè)黑客劫持并接管,即使它是運(yùn)行在 root 下。
我們在 OpenShift 中使用類似的隔離策略。每一個(gè) gear(user/app process)都有相同的 SELinux 類型(openshift_t)(LCTT 譯注:gear 為 OpenShift 的計(jì)量單位)。策略定義的規(guī)則控制著 gear 類型的訪問權(quán)限,而一個(gè)獨(dú)一無二的 MCS 標(biāo)簽確保了一個(gè) gear 不能影響其他 gear。
請觀看下面的視頻來看 OpenShift gear 切換到 root 會發(fā)生什么。
多級別安全強(qiáng)制
另外一種不經(jīng)常使用的 SELinux 強(qiáng)制形式叫做多級別安全(Multi Level Security)(MLS);它開發(fā)于上世紀(jì) 60 年代,并且主要使用在受信操作系統(tǒng)上如 Trusted Solaris。
其核心觀點(diǎn)就是通過進(jìn)程使用的數(shù)據(jù)等級來控制進(jìn)程。一個(gè) secret 進(jìn)程不能讀取 top secret 數(shù)據(jù)。
MLS 很像 MCS,除了它在強(qiáng)制策略中增加了支配的概念。MCS 標(biāo)簽必須完全匹配,但一個(gè) MLS 標(biāo)簽可以支配另一個(gè) MLS 標(biāo)簽并且獲得訪問。
打個(gè)比方
不討論不同名字的狗,我們現(xiàn)在來看不同種類。我們現(xiàn)在有一只格雷伊獵犬和一只吉娃娃。
Cartoon of a Greyhound and a Chihuahua
我們可能想要允許格雷伊獵犬去吃任何狗糧,但是吉娃娃如果嘗試去吃格雷伊獵犬的狗糧可能會被嗆到。
我們把格雷伊獵犬標(biāo)記為 dog:Greyhound,把它的狗糧標(biāo)記為 dog_chow:Greyhound,把吉娃娃標(biāo)記為 dog:Chihuahua,把它的狗糧標(biāo)記為 dog_chow:Chihuahua。
Cartoon of a Greyhound dog food and a Chihuahua dog food.
使用 MLS 策略,我們可以使 MLS 格雷伊獵犬標(biāo)簽支配吉娃娃標(biāo)簽。這意味著 dog:Greyhound 允許去吃 dog_chow:Greyhound 和 dog_chow:Chihuahua。
SELinux rule
但是 dog:Chihuahua 不允許去吃 dog_chow:Greyhound。
Cartoon of Kernel (Penquin) stopping the Chihahua from eating the greyhound food. Telling him it would be a big too beefy for him.
當(dāng)然,由于類型強(qiáng)制, dog:Greyhound 和 dog:Chihuahua 仍然不允許去吃 cat_chow:Siamese,即使 MLS 類型 GreyHound 支配 Siamese。
Cartoon of Kernel (Penquin) holding leash to prevent both dogs from eating cat food.
現(xiàn)實(shí)例子
有兩個(gè) Apache 服務(wù)器:一個(gè)以 httpd_t:TopSecret 運(yùn)行,一個(gè)以 httpd_t:Secret 運(yùn)行。如果 Apache 進(jìn)程 httpd_t:Secret 被劫持,黑客可以讀取 httpd_sys_content_t:Secret 但會被禁止讀取 httpd_sys_content_t:TopSecret。
但是如果運(yùn)行 httpd_t:TopSecret 的 Apache 進(jìn)程被劫持,它可以讀取 httpd_sys_content_t:Secret 數(shù)據(jù)和 httpd_sys_content_t:TopSecret 數(shù)據(jù)。
我們在軍事系統(tǒng)上使用 MLS,一個(gè)用戶可能被允許讀取 secret 數(shù)據(jù),但是另一個(gè)用戶在同一個(gè)系統(tǒng)上可以讀取 top secret 數(shù)據(jù)。
結(jié)論
SELinux 是一個(gè)功能強(qiáng)大的標(biāo)簽系統(tǒng),控制著內(nèi)核授予每個(gè)進(jìn)程的訪問權(quán)限。最主要的特性是類型強(qiáng)制,策略規(guī)則定義的進(jìn)程訪問權(quán)限基于進(jìn)程被標(biāo)記的類型和客體被標(biāo)記的類型。也引入了另外兩個(gè)控制手段,分離有著同樣類型進(jìn)程的叫做 MCS,而 MLS,則允許進(jìn)程間存在支配等級。
*所有的漫畫都來自 Máirín Duffy
作者簡介:
Daniel J Walsh - Daniel Walsh 已經(jīng)在計(jì)算機(jī)安全領(lǐng)域工作了將近 30 年。Daniel 于 2001 年 8 月加入紅帽。