自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

看漫畫學(xué)SELinux的強(qiáng)制策略

系統(tǒng) Linux
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)。

看漫畫學(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. 

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 

Cartoon Cat eating Cat Food and Dog eating Dog Food

作為一個(gè)策略制定者,我可以說一只狗有權(quán)限去吃狗糧(dog_chow),而一只貓有權(quán)限去吃貓糧(cat_chow)。在 SELinux 中我可以將這條規(guī)則寫入策略中。 

 

 

SELinux rule 

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 

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 

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 

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 

Cartoon of two dogs fido and spot

我們將狗糧標(biāo)記為 dog_chow:random1(Fido) 和 dog_chow:random2(Spot)。 

 

 

SELinux rule 

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. 

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 

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. 

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 

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. 

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 

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. 

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. 

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 月加入紅帽。

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2016-04-13 11:35:32

漫畫蘋果推薦

2011-10-10 10:17:16

2010-04-01 15:16:45

CentOS系統(tǒng)

2020-02-26 15:12:43

線程池增長回收

2013-12-25 16:53:35

管理

2023-03-30 09:19:54

SELinux安全子系統(tǒng)

2011-12-20 08:48:05

2013-02-27 09:44:59

2017-06-29 09:15:36

推薦算法策略

2013-05-06 16:36:55

SELinuxSELinux故障

2011-05-31 14:22:23

2013-08-08 11:29:32

2023-11-09 08:22:38

2009-07-27 13:55:07

帶寬管理策略網(wǎng)絡(luò)擁塞

2011-10-24 09:49:37

管理非限制進(jìn)程SELinux

2013-08-26 14:18:12

SELinux

2010-02-05 15:21:29

全千兆路由交換機(jī)

2017-09-06 15:54:14

2014-10-29 17:25:26

Android 5.0Google

2011-11-24 12:02:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號