SELinux TE規(guī)則_第1頁
SELinux TE規(guī)則_第2頁
SELinux TE規(guī)則_第3頁
SELinux TE規(guī)則_第4頁
SELinux TE規(guī)則_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1. 簡介     SELinux策略語言主要描述policy.conf的相關(guān)語法,其相關(guān)部分如下圖所示:2. 類型強(qiáng)制概念     SELinux策略大部分內(nèi)容都是由多條類型強(qiáng)制規(guī)則構(gòu)成的,這些規(guī)則控制被允許的使用權(quán),大多數(shù)默認(rèn)轉(zhuǎn)換標(biāo)志,審核,以及固定部分的檢查。        SELinux策略大部分都是一套聲明和規(guī)則一起定義的類型強(qiáng)制(TE:Type Enforcement)策略,一個定義良好、嚴(yán)格的TE策略可能包括上千個TE規(guī)則,TE規(guī)則數(shù)量的巨大并不令人驚奇,因為它

2、們表達(dá)了所有由內(nèi)核暴露出的允許對資源的訪問權(quán),這就意味著每個進(jìn)程對每個資源的訪問嘗試都必須至少要有一條允許的TE訪問規(guī)則,如果我們仔細(xì)思考一下現(xiàn)代Linux操作系統(tǒng)中進(jìn)程和資源的數(shù)量,就明白為什么在策略中有那么多的TE規(guī)則了。當(dāng)我們添加由TE規(guī)則控制的審核配置和標(biāo)志時,對于具有嚴(yán)格限制的SELinux策略,常常會見到它包含有上千條規(guī)則,在“創(chuàng)建和編寫SELinux安全策略”中,我們將會討論如何創(chuàng)建和管理這些大量的規(guī)則,本文旨在理解TE規(guī)則是如何工作的。    TE規(guī)則的絕對數(shù)量對理解SELinux策略是一個大的挑戰(zhàn),但是規(guī)則本身并不復(fù)雜,它們的分類相對較少,所有的規(guī)則基本上

3、都屬于兩類范疇:      訪問向量(AV)規(guī)則      類型規(guī)則     我們使用AV規(guī)則允許或?qū)徍藘蓚€類型之間的訪問權(quán),我們在某些情況下使用類型規(guī)則控制默認(rèn)的標(biāo)記決定。     SELinux的一個重要概念是TE規(guī)則是將權(quán)限與程序的訪問結(jié)合在一起,而不是結(jié)合用戶。所有SELinux策略語言特性都是處理主體(正常的運行中的進(jìn)程)對客體(文件、目錄和套接字等)的訪問權(quán)的,主要集中于程序訪問控制決策,這也是SELinux的主要益處,它允許SELinux策略

4、編寫者基于程序的功能和安全屬性,加上用戶要完成任務(wù)需要的所有訪問權(quán)做出訪問決策,可以將程序限制到功能合適,權(quán)限最小化的程度,因此,即使它出了故障或被攻擊破壞,但整個系統(tǒng)的安全并不會受到威脅。    SELinux是不會管用戶的,可以給同一個程序指定多個域類型(因此有不同的特權(quán)集),這樣就允許引入角色的概念,盡管如此,訪問控制的標(biāo)準(zhǔn)仍然是基于程序的域類型而不是用戶的特權(quán)。焦點是程序的訪問權(quán),而不是用戶的訪問權(quán)。3. 類型、屬性和別名    正如你從術(shù)語類型強(qiáng)制猜測的那樣,類型是構(gòu)成TE規(guī)則的最小單位,SELinux主要就是使用類型來確定什么訪問是

5、被允許的;屬性和別名是為減輕管理和使用類型的策略特性,我們使用屬性利用單個標(biāo)識符來引用一組類型。通常,策略語言允許我們在TE規(guī)則中類型的適當(dāng)位置使用屬性,而別名允許我們?yōu)轭愋投x另一個名字,別名標(biāo)識符和類型標(biāo)識符做同等地位對待。 3.1 類型聲明    在使用類型前,必須使用type語句明確地聲明一個類型標(biāo)識符,SELinux沒有預(yù)定義類型,我們必須自行聲明,例如:假設(shè)我們想聲明一個類型(httpd_t),并打算將其作為Web服務(wù)器的域類型,而另一個類型(http_user_content_t)準(zhǔn)備應(yīng)用于用戶數(shù)據(jù)文件,即Web服務(wù)器顯示內(nèi)容的文件,我們使用type

6、語句進(jìn)行聲明,如下:   cpp view plaincopy1. type httpd_t;   2. type http_user_content_t;      聲明了類型后就可以在安全上下文、TE規(guī)則和其它策略語句中使用它們了。    類型聲明的語法:      type 類型名稱 alias 別名集 ,屬性集;   1) 別名集:如果指定的不止一個別名標(biāo)識符,要在一對大括號中用

7、空格將各個別名區(qū)別開來,如:alias aliasa_t aliasb_t。   2) 屬性集:是一個或多個預(yù)先聲明的屬性標(biāo)識符,如果同時指定多個屬性標(biāo)識符,屬性之間使用逗號進(jìn)行分隔,如:type bin_t, file_type, exec_type;   3) 類型聲明在整個策略中,以及基礎(chǔ)載入模塊和非基礎(chǔ)載入模塊中都是有效的。但在有條件的語句中無效。3.2 類型和屬性      可能你已經(jīng)想到,一個大型的,復(fù)雜的策略可能包括上萬個代表系統(tǒng)上不同資源的類型,例如:Fedora Core 4(FC 4)

8、的targeted策略相對較小,但也聲明了超過800個類型。由于默認(rèn)的規(guī)則是拒絕所有的訪問,所以任何一個訪問都需要明確地被允許,這就導(dǎo)致了類型注定會很冗長,這時策略語言的屬性特性就派上用場了。屬性可以理解為:      1) 類型的性質(zhì)或?qū)傩裕蚨呒娴?#160;     2) 一組類型      在任何一種情況下,原理都是相同的。      假設(shè)我們想讓一個備份程序可以訪問所有的文件,首先我們創(chuàng)建一個備份應(yīng)用程序的域類型(backup_t),并允許它訪問與任何文件關(guān)聯(lián)的類型:cpp

9、 view plaincopy1. type backup_t;   2. allow backup_t httpd_user_content_t : file read;   3. allow backup_t shadow_t : file read;       為了完成這個例子,我們編寫了一個用于其他所有文件類型的規(guī)則,依賴聲明的類型數(shù)量,我們需要大量的all

10、ow規(guī)則授予備份程序足夠的訪問權(quán)(每個類型都要一個)。另外,每次向策略中增加一個文件類型時,同時要為backup_t增加一條allow規(guī)則,這是一個單調(diào)且錯誤頻出的過程,屬性使得這種"組訪問"更容易指定,通過將所有關(guān)聯(lián)的文件類型定義一個屬性,然后授予該屬性的訪問權(quán)(而不是每個類型了),于是,我們可以使用一條規(guī)則授予backup_t必需的訪問權(quán)。     使用attribute語句進(jìn)行屬性聲明,如:cpp view plaincopy1. attribute file_type;     

11、;  這個語句聲明一個叫做file_type的屬性,類型和屬性共享相同的命名空間,因此,類型和屬性的名字不能雷同,假設(shè)我們將所有適當(dāng)?shù)念愋投寂c屬性file_type進(jìn)行關(guān)聯(lián),然后就可以使用一條規(guī)則來指定backup_t讀取這些文件,如: cpp view plaincopy1. allow backup_t file_type :file read;       在我們使用了一條規(guī)則替代了上千條allow規(guī)則,而授予的訪問權(quán)卻是一樣的,當(dāng)這個策略編譯好后,這條規(guī)則會自動擴(kuò)展成

12、上千條規(guī)則,分別控制不同文件類型的訪問,更重要的是,當(dāng)我們給文件定義了一個新類型時,我們需要做的僅僅是將這個新類型與file_type屬性進(jìn)行關(guān)聯(lián),域類型backup_t將會自動獲得讀取訪問權(quán)。    屬性聲明語法:     attribute 屬性名稱;    1) 屬性和類型,別名都在同一個命名空間,因此不能與其他類型或別名重名。    2) 屬性聲明在整個策略,基礎(chǔ)載入模塊和非基礎(chǔ)載入模塊中都有效,但在有條件的語句中無效。3.3 關(guān)聯(lián)類型和屬性3.3

13、.1 在type中指定屬性         迄今為止,我們已經(jīng)討論了如何定義類型和屬性,下面將要講述的是如何將它們關(guān)聯(lián)起來,最常見的關(guān)聯(lián)方式是在用type語句聲明類型時就指定其屬性,例如:我們可以將聲明http_user_content_t類型的語句修改為:cpp view plaincopy1. type http_user_content_t,file_type;       這個語句描述了聲明類型http_user_content_t時,同時關(guān)聯(lián)了file_type屬性

14、,它會自動向具有file_type屬性的類型組中添加http_user_content_t類型,但從概念上將,它實質(zhì)上已經(jīng)改變了http_user_content_t類型的性質(zhì),因為它現(xiàn)在已經(jīng)具有基于屬性的訪問許可了,而不只局限于類型本身了。     一個類型可以有多個屬性,例如:我們可以再為所有Web服務(wù)器要用的文件創(chuàng)建一個屬性httpdcontent,擁有httpdcontent屬性的類型可能是擁有file_type屬性的類型的一個子集,下面的代碼擴(kuò)展了我們前面的例子:cpp view plaincopy1. type httpd_user

15、_content_t, file_type, httpdcontent;   2. type shadow_t, file_type;   3.   4. allow backup_t file_type : file read;   5. allow httpd_t httpdcontent : file read;  

16、60;    類型具有的屬性數(shù)量沒有限制,就和類型一樣,我們可以合理定義相應(yīng)的屬性。3.3.2 使用typeattribute指定屬性    除了使用type語句關(guān)聯(lián)類型和屬性外,還可以使用typeattribute語句,這個語句允許我們在聲明類型時,單獨關(guān)聯(lián)屬性,在策略中可能也就是一個單獨的文件了,例如:將前面舉的示例語句:cpp view plaincopy1. type httpd_user_content_t, file_type, httpdcontent;     

17、;  分成兩條語句進(jìn)行表述:cpp view plaincopy1. type httpd_user_content_t;   2. typeattribute httpd_user_content_t file_type, httpdcontent;        typeattribute允許我們在一個地方定義類型,在另一個地方關(guān)聯(lián)屬性,增強(qiáng)了語言的靈活性,在設(shè)計策略源文件時,可以考慮進(jìn)行模塊化設(shè)計了。     typea

18、ttribute語句語法:     typeattribute 類型名 屬性名;      1) 一個或多個事先聲明的屬性標(biāo)識符,如果指出多個屬性標(biāo)識符,屬性標(biāo)識符之間使用逗號分隔,如typeattribute bin_t file_type, exec_type;      2) typeattribute語句在單個策略,基礎(chǔ)載入模塊和非基礎(chǔ)載入模塊中都是有效的,只有在條件語句中無效。3.4 別名(為確保兼容性而存在)     別名是引用類型時的一個備選的名字,能

19、夠使用類型名的地方就可以使用別名,包括TE規(guī)則,安全上下文和標(biāo)記語句,別名通常用于策略改變時保證一致性,例如:一個舊策略可能引用了類型netscape_t,更新后的策略可能將類型名改為mozilla_t了,但同時提供了一個別名netscape_t以保證與舊模塊能夠正確兼容。3.4.1 在type中聲明別名cpp view plaincopy1. type mozilla_t alias netscape_t, domain;       注意別名聲明是放在屬性的前面的。3.4.2 使用typea

20、lias申明別名cpp view plaincopy1. # 這兩條語句等同于   2. type mozilla_t, domain;   3. typealias mozilla_t alias netscape_t;   4.   5. #下面這一條語句   6. type mozilla_t alias netscape_t, domain

21、;     typealias語句語法       typealias 類型名稱 alias 別名名稱     1) 類型名稱:要添加別名的類型的名稱,類型必須使用type語句單獨聲明,而且這里只能指定一個類型名稱。     2) 別名名稱:如果同時指定多個別名,別名之間用空格分開,并使用大括號將所有別名括起來,如aliasa_t aliasb_t。     3) typealias語句在單個策略,基礎(chǔ)載入模塊和非基

22、礎(chǔ)載入模塊中都有效,只有在條件語句中無效。4. 訪問向量規(guī)則    AV規(guī)則就是按照對客體類別的訪問許可指定其具體含義的規(guī)則,SELinux策略語言目前支持四類AV規(guī)則:   在代碼中,客體類別的訪問許可集是由一些叫做訪問向量的掩碼表現(xiàn)的,因此就有了術(shù)語訪問向量。    allow:表示允許主體對客體執(zhí)行允許的操作    dontaudit:表示不記錄違反規(guī)則的決策信息,且違反規(guī)則不影響運行(允許操作且不記錄)    auditallow:表示允許操作并記

23、錄訪問決策信息(允許操作且記錄)    neverallow: 表示不允許主體對客體執(zhí)行指定的操作   本小節(jié)剩余部分將詳細(xì)討論這些規(guī)則的語法和語義,以及一些示例。4.1 通用AV規(guī)則語法   雖然這些規(guī)則的用途不一樣,但它們的基本語法是一樣的,每個規(guī)則都要包含下面五個元素:      規(guī)則名稱: allow,dontaudit,auditallow和neverallow      源類型:授予訪問的類型,通常是進(jìn)程的域類型 

24、     目標(biāo)類型:客體的類型,它被授權(quán)可以訪問的類型      客體類別:客體的類別      許可:表示主體對客體訪問時允許的操作類型(也叫做訪問向量)。    一個簡單的AV規(guī)則有一個源類型,目標(biāo)類型,客體類別和許可,在我們前面的allow規(guī)則中可以看到許多AV規(guī)則,如:cpp view plaincopy1. allow user_t bin_t : file execute;  

25、;    這個allow規(guī)則的源類型為user_t,目標(biāo)類型為bin_t,客體類別file,許可execute,這個規(guī)則可以解讀為"允許user_t執(zhí)行類型為bin_t的文件"4.1.1 AV規(guī)則的密鑰(哈希Key)     在內(nèi)核中,所有的AV規(guī)則都是通過一組【源類型+目標(biāo)類型+類別】進(jìn)行唯一性標(biāo)識,這個三重組叫做一個密鑰,當(dāng)做哈希表使用,緩存在策略數(shù)據(jù)結(jié)構(gòu)中,規(guī)則是靠這個密鑰存儲和檢索的,當(dāng)一個進(jìn)程產(chǎn)生了一個訪問請求時,SELinux LSM模塊被要求允許基于這個密鑰進(jìn)行訪問。    

26、60;那么,如果不止一個規(guī)則使用同一個密鑰(即相同的源類型,目標(biāo)類型和許可)時會發(fā)生什么狀況呢?如下面的規(guī)則:cpp view plaincopy1. allow user_t bin_t : file execute;   2. allow user_t bin_t : file read;       類型為user_t的進(jìn)程對類型為bin_t的文件是可讀還是可執(zhí)行?答案是兩者皆可。所有有相同密鑰的規(guī)則

27、通過checkpolicy進(jìn)行組合,編譯后的策略將只有一條規(guī)則,但它同時具有read和execute許可,它們都會被安全服務(wù)器接受。所有的AV都按照這種方式進(jìn)行累加。4.1.2 使用AV規(guī)則中的屬性     雖然到目前為止我們看到的AV規(guī)則都很簡單,但語法支持多種方法列出類型、客體類別和許可,使我們可以靈活地利用,并使規(guī)則語句更簡單。     在前面的簡單樣式的規(guī)則示例中,直接引用了源類型(user_t)和目標(biāo)類型(bin_t),這樣在源類型或目標(biāo)類型中要引用多個類型也是很方便的,其中一個方法就是使用屬性,在AV規(guī)則中能使用

28、類型的地方都可以使用屬性(類型組)。     例如,假設(shè)我們定義了一個屬性(exec_type),我們打算將其與所有的普通用戶程序(通過域類型user_t標(biāo)記)都可以執(zhí)行的文件類型關(guān)聯(lián),那么我們可以將上面的例子改為引用屬性exec_type,而不用再明確地指定類型bin_t了,如:cpp view plaincopy1. allow user_t exec_type : file execute;      與屬性關(guān)聯(lián)的每個類型都有一個獨立的密鑰。  &#

29、160; 我們也可以在AV的源類型位置處使用屬性,或者干脆在源類型和目標(biāo)類型處都使用屬性,例如:假設(shè)我們創(chuàng)建了一個屬性(domain),并將所有的域類型(包括user_t)都與其關(guān)聯(lián),我們想要所有的域類型都可以執(zhí)行屬性為file_type的文件類型,使用一條規(guī)則就實現(xiàn)這個目標(biāo):cpp view plaincopy1. allow domain exec_type : file execute;      為了更好地解釋規(guī)則擴(kuò)展的原理,假設(shè)我們的策略關(guān)聯(lián)了類型為user_t和staff_t的屬性d

30、omain,以及文件類型為bin_t,local_bin_t和sbin_t的屬性exec_type,那么上面那一條規(guī)則的效果就等同于下面這些規(guī)則:cpp view plaincopy1. allow user_t bin_t : file execute;   2. allow user_t local_bin_t : file execute;   3. allow user_t sbin_t 

31、: file execute;   4.   5. allow staff_t bin_t : file execute;   6. allow staff_t local_bin_t : file execute;  7. allow staff_t sbin_t : file execute;  4.1.

32、3 AV規(guī)則中的多類型和屬性   在AV規(guī)則中的源和目標(biāo)區(qū)域,我們都沒有限制類型和屬性的數(shù)量,相反,可以在源和目標(biāo)字段處列出多個類型和屬性,如果有多個類型或?qū)傩詴r,它們之間使用空格進(jìn)行分隔,并使用大括號將它們括起來,如:cpp view plaincopy1. allow user_t  bin_t sbin_t  : file execute;       在這個規(guī)則中,目標(biāo)是bin_t和sbin_t,在源和目標(biāo)區(qū)域有多個類

33、型或?qū)傩詴r,展開方法同單個屬性一樣,在前面的例子中,內(nèi)核包括兩個密鑰,每個目標(biāo)類型都有一個。     我們還可以在源或目標(biāo)區(qū)域混合類型和屬性,也可以在這兩個位置都使用混合的形式,如:cpp view plaincopy1. allow user_t domain bin_t file_type sbin_t : file execute       如果我們明確地列出了類型以及類型具有的屬性,這是可以的,即我們實際上列出了兩次

34、類型,內(nèi)核會自動處理這個冗余,只會處理一個實例規(guī)則。4.1.4 特殊類型self    策略語言保留了一個關(guān)鍵字self,它用于AV規(guī)則中的目標(biāo)區(qū)域,可以當(dāng)做一個類型使用,如下面這兩條規(guī)則是相等的:cpp view plaincopy1. # 這兩條規(guī)則是相等的   2. allow user_t user_t : process signal;   3. allow user_t self : proce

35、ss signal;       關(guān)鍵字self說明目標(biāo)類型使用的源類型自身,即目標(biāo)類型等于源類型,前面的例子中,第二條規(guī)則只是用關(guān)鍵字創(chuàng)建了一條規(guī)則,表明源類型和目標(biāo)類型都是user_t。cpp view plaincopy1. # 這兩條規(guī)則   2. allow user_t user_t : process signal;  3. allow staff_t staff_t :&

36、#160;process signal;   4.   5. #等于下面這一條規(guī)則   6. allow user_t staff_t self : process signal;      注意:你可能只會在AV規(guī)則的目標(biāo)區(qū)域使用特殊類型self,特別要注意的是不能在AV規(guī)則的源區(qū)域使用self類型,另外,也不能聲明一個類型或?qū)傩詷?biāo)識符叫做self。cpp view plaincopy

37、1. allow domain domain : process signal; # 每個進(jìn)程都能向它自己和其它進(jìn)程發(fā)送signal  2. allow domain self : process signal;   # 每個進(jìn)程都能向它自己發(fā)送signal  4.1.5 "非"特殊操作符    AV規(guī)則中最后一個類型語法是類型否定,它可以從一個類

38、型列表中將某個類型移除,也可以用于用一個屬性中移除某個類型,通過在要移除的類型名稱前面放一個非操作符(-)實現(xiàn),例如:我們想讓所有的域類型都可以訪問所有屬性為exec_type的文件,除了sbin_t類型外,那么編寫規(guī)則時就可以這樣:cpp view plaincopy1. allow domain  exec_type -sbin_t  : file execute;  2. #等同于  3. allow domain  -sbin_

39、t exec_type  : file execute;      這個規(guī)則在展開時就好像屬性exec_type沒有包括類型sbin_t一樣。4.1.6 在AV規(guī)則中指定客體類別和許可    AV規(guī)則也可以包括客體類別和許可列表,語法和類型一致,使用空格進(jìn)行分隔,并用大括號括起來,如:cpp view plaincopy1. allow user_t bin_t :  file dir  

40、; read getattr   2.   3. #這條規(guī)則將會產(chǎn)生兩個密鑰,每個客體類別一個,這條規(guī)則等同于下面這兩條規(guī)則:  4. allow user_t bin_t : file  read getattr    5. allow user_t bin_t : dir  read getattr  &

41、#160;   注意客體類別被展開了,但每條規(guī)則都有相同的許可列表,這意味著列表中的所有許可對所有客體類別都是有效的。cpp view plaincopy1. # 無效的規(guī)則,因為search對于客體類別file是無效的   2. allow user_t bin_t :  file dir   read getattr search   3.   4. #當(dāng)許可對兩

42、個客體類別不是都有效時,需要兩條規(guī)則   5. allow user_t bin_t : file  read getattr    6. allow user_t bin_t : dir  read getattr search    4.1.7 AV規(guī)則中的特殊許可操作符    對于列在AV規(guī)則中的許可,

43、我們可以使用兩個特殊的操作符,第一個是通配符(*),通配符包括了客體類別的所有許可:cpp view plaincopy1. allow user_t bin_t :  file dir  *;      這條規(guī)則擴(kuò)展后將包括file和dir的所有許可。    通配符語法與列出所有的許可有點不同,使用通配符時,許可包括每個客體類別的許可,此時不會考慮其中一個許可是否對另一個客體類別是否有效,這樣就可以在規(guī)則中使用多個客體類別,即使這些客體類別有不

44、同的許可,因此,上面這條規(guī)則就安全地處理了許可,不會像前面那條規(guī)則那樣,這里只對dir客體類別有效的規(guī)則不會影響到file客體類別。    第二個特殊操作符是求補(bǔ)算操作符(),即除了列出的許可外,其它的許可都包括,如:cpp view plaincopy1. allow user_t bin_t : file  write setattr ioctl      編譯時,這條規(guī)則允許所有的許可,除了write,setattr和ioctl外

45、,與通配符類似,求補(bǔ)算操作符也擴(kuò)大了客體類別的許可列表。4.1.8 通用訪問向量規(guī)則語法     完整的AV規(guī)則通用語法如下:      規(guī)則名稱 類型集 類型集:類別集 許可集;     1) 規(guī)則名稱:訪問向量規(guī)則的名稱,有效的規(guī)則名稱是allow,auditallow,auditdeny,dontaudit和neverallow。     2) 類型集: 一個或多個類型和(或)屬性,規(guī)則中源和目標(biāo)類型有其獨立的類型集,多個類型集或

46、屬性使用空格進(jìn)行分隔,并使用大括號將它們括起來,如bin_t sbin_t??梢允褂茫?)來排除類型,如exec_type -sbin_t。在目標(biāo)類型區(qū)域可以使用關(guān)鍵字self,但在源類型區(qū)域不能使用。neverallow規(guī)則也支持通配符來代表所有的類型,求補(bǔ)算操作符()也表示所有的類型,除了明確列出的之外。     3) 類別集: 一個或多個客體類別,多個客體類別必須使用大括號括起來,如file lnk_file。     4) 許可集: 一個或多個許可,所有許可對類別集列出的所有客體類別都要有效,多個許可必須用

47、大括號括起來,如read create。通配符(*)指出所有客體類別的所有許可,求補(bǔ)算操作符()用于指出所有的許可,除了明確列出的之外。     所有AV規(guī)則在單個策略,基礎(chǔ)載入模塊和非基礎(chǔ)載入模塊中都有效,所有AV規(guī)則除了auditdeny,neverallow規(guī)則外,其它的在條件語句中也有效。4.2 允許(allow)規(guī)則     到目前為止,你已經(jīng)看到了許多的allow規(guī)則,allow規(guī)則是策略中最常見的規(guī)則,它實現(xiàn)了SELinux策略的主要目的(即允許訪問)。    正如前面討論的,我們使用allow規(guī)則指

48、出了所有運行時授予的許可,它們是SELinux策略中允許許可的唯一方法,記住,默認(rèn)情況下,不允許任何訪問,我們指定了兩個類型列表(源和目標(biāo)類型),根據(jù)列出的客體類別的許可指定訪問權(quán),如:cpp view plaincopy1. allow user_t bin_t : file  read execute       這個規(guī)則允許任何安全上下文中類型具有user_t的進(jìn)程對任何安全上下文中具有類型為bin_t的普通文件所有read和execute訪問權(quán)。allow規(guī)

49、則共享了通用AV規(guī)則的的所有語法,并且也沒有增加任何額外的語法了。4.3 審核(audit)規(guī)則   SELinux有大量的工具記錄日志信息,或?qū)徍?、訪問嘗試被策略允許或拒絕的信息。審核消息通常叫做"AVC消息",它提供了詳細(xì)了關(guān)于訪問嘗試的信息,包括是允許還是拒絕,源和目標(biāo)的安全上下文,以及其它一些訪問嘗試涉及到資源信息。AVC消息與其它內(nèi)核消息類似,都是存儲在/var/log目錄下的日志文件中,它是策略開發(fā)、系統(tǒng)管理和系統(tǒng)監(jiān)視不可缺少的工具。在此,我們檢查是哪一個訪問嘗試產(chǎn)生了審核消息。   默認(rèn)情況下,SELinux不

50、會記錄任何允許的訪問檢查,只會記錄被拒絕的訪問檢查。這并沒什么奇怪的,在大多數(shù)系統(tǒng)上,每秒會允許成千上萬的訪問,只有很少的一部分會被拒絕,允許的訪問通常是在預(yù)料之中的,通常不需要審核,被拒絕的訪問通常是(但不總是)非預(yù)期的訪問,對它們進(jìn)行審核便于管理員發(fā)現(xiàn)策略的bug和可能的入侵嘗試。策略語言允許我們?nèi)∠@些默認(rèn)的預(yù)料之中的拒絕審核消息,改為記錄允許的訪問嘗試審核消息。    SELinux提供兩個AV規(guī)則允許我們控制審核哪一種訪問嘗試:dontaudit和auditallow。使用這兩條規(guī)則我們就可以改變默認(rèn)的審核類型了,最常用的是dontaudit規(guī)則,它指出哪一個訪問

51、嘗試被拒絕時不審核,這樣就覆蓋了SELinux默認(rèn)的審核所有拒絕的訪問嘗試的行為。cpp view plaincopy1. dontaudit httpd_t etc_t : dir search;      記住,審核(audit)規(guī)則讓我們覆蓋了默認(rèn)的審核設(shè)置,allow規(guī)則指出了什么訪問是允許的,auditallow規(guī)則不允許訪問,它只審核允許的許可。    注意:在許可模式和強(qiáng)制模式下審核是不一樣的。運行在強(qiáng)制模式下時,每次允許或拒絕時都會進(jìn)行審核,應(yīng)該在策

52、略中對審核頻率進(jìn)行限制(可以使用auditctl實現(xiàn))。在許可模式下時,只會記錄第一次訪問嘗試,直到下一次策略載入,或固定為強(qiáng)制模式,在開發(fā)時通常使用的就是許可模式,這種模式可以減少日志文件的大小。4.4 neverallow規(guī)則    最后一個AV規(guī)則是neverallow規(guī)則,我們使用這個規(guī)則來指定永遠(yuǎn)不會被allow規(guī)則執(zhí)行的訪問,你可能會疑惑,為什么會有這個規(guī)則?因為默認(rèn)情況下所有的訪問都是被拒絕的,設(shè)計這個規(guī)則的主要目的是為了幫助編寫策略時,可以明確地指出不想要的訪問許可,因此可以預(yù)防意外發(fā)生,回想一下,在一個SELinux策略中可能包含成千上萬條規(guī)則,

53、可能不小心加入了我們本不想授予的訪問權(quán),此時,neverallow規(guī)則就可以幫助預(yù)防這種情況發(fā)生,如: cpp view plaincopy1. neverallow user_t shadow_t : file write;       這條neverallow規(guī)則可以有效地阻止我們在策略中添加一條允許user_t對類型為shadow_t的文件進(jìn)行寫操作的規(guī)則,如果添加了這樣的規(guī)則在編譯時就會報錯,這條規(guī)則不會移除訪問權(quán),它只是會產(chǎn)生編譯錯誤。我們在編寫策略時,nevera

54、llow規(guī)則往往放在allow規(guī)則前面,首先聲明哪些訪問是明確地被拒絕的,然后再聲明哪些訪問是可以接受的,這樣就可以預(yù)防我們?nèi)藶槌鲥e了。     neverallow規(guī)則支持一些特殊的其它AV規(guī)則不支持的語法,在neverallow規(guī)則中的源和目標(biāo)類型列表中可以使用通配符(*)和求補(bǔ)算操作符(),如:cpp view plaincopy1. neverallow * domain : dir  read getattr       這條

55、規(guī)則指出沒有哪條allow可以授予任何類型對具有domain屬性的類型的目錄有任何訪問權(quán),除了read和getattr訪問權(quán)外(即讀訪問權(quán)),這條規(guī)則的中通配符意味著所有的類型,在真實的策略中,類似這樣的規(guī)則很常見,它們用來阻止對/proc/目錄適當(dāng)?shù)脑L問。    我們從前面這個例子中看出,在源類型列表中需要使用通配符,因為我們想要指出任何類型或所有類型,包括那些還沒有創(chuàng)建的類型,使用通配符可以預(yù)防我們未來犯錯。    另一個常見的neverallow規(guī)則是:cpp view plaincopy1. neverallow domain

56、 domain : process transition;      這條neverallow規(guī)則增強(qiáng)了domain屬性,它指出了進(jìn)程不能轉(zhuǎn)換到無domain屬性的類型,這就使得要為一個類型無doamin屬性的進(jìn)程創(chuàng)建一個有效的策略是不可能的。5. 類型規(guī)則    類型規(guī)則在創(chuàng)建客體或在運行過程中重新標(biāo)記時指定其默認(rèn)類型,它僅提供一個新的默認(rèn)類型標(biāo)記。在策略語言中定義了兩個類型規(guī)則:      type_transition:在域轉(zhuǎn)換過程中標(biāo)記行

57、為發(fā)生時以及創(chuàng)建客體時,指定其默認(rèn)的類型。       type_change:使用SELinux的應(yīng)用程序執(zhí)行標(biāo)記時指定其默認(rèn)類型。     我們叫這些規(guī)則為"類型規(guī)則",因為它們與AV規(guī)則類似,除了規(guī)則的末尾是一個類型名而不是許可集外。5.1 通用類型規(guī)則語法      與AV規(guī)則一樣,每條類型規(guī)則有不同的用途和語義,但它們的語法都是通用的,每條類型規(guī)則都具有下列五項元素:       規(guī)則名稱:typ

58、e_transition或type_change        源類型:創(chuàng)建或擁有進(jìn)程的類型        目標(biāo)類型:包含新的或重新標(biāo)記的客體的客體類型        客體類別:新創(chuàng)建的或重新標(biāo)記的客體的類別        默認(rèn)類型:新創(chuàng)建的或重新標(biāo)記的客體的單個默認(rèn)類型      類型規(guī)則語法   

59、;    規(guī)則名稱 類型集 類型集:類別集  單個默認(rèn)類型;      1) 規(guī)則名稱:類型規(guī)則的名稱,有效的規(guī)則名稱有type_transition,type_change和type_member。      2) 類型集:一個或多個類型或?qū)傩?。在?guī)則中源和目標(biāo)類型有其獨立的類型集,多個類型和屬性使用空格進(jìn)行分隔,并用大括號將它們括起來,如bin_t sbin_t,可以在類型名前放一個(-)符合將其排除,如exec_type sbin_t。      3)

60、0;類別集:一個或多個客體類別,多個客體類別必須使用大括號括起來,并用空格分開,如file lnk_file。      4) 默認(rèn)類型:為新創(chuàng)建的或重新標(biāo)記的客體類別指定的單個默認(rèn)類型,這里不能使用屬性和多個類型。      5) 所有類型規(guī)則在單個策略,基礎(chǔ)載入模塊,非基礎(chǔ)載入模塊和條件語句中都有效。     類型規(guī)則語法大部分都和AV規(guī)則類似,但也有一些不同的地方,首先就是類型規(guī)則中沒有許可,不像AV規(guī)則那樣,類型規(guī)則不指定訪問權(quán)或?qū)徍?,因此就需要許可了;第二個不同點是客體類別沒有關(guān)聯(lián)目標(biāo)類型,相反

61、,客體類別指的是將要被默認(rèn)類型標(biāo)記的客體。     最簡單的類型規(guī)則包括一個源默認(rèn)類型,一個目標(biāo)默認(rèn)類型和一個客體類別,如:cpp view plaincopy1. type_transition user_t passwd_exec_t : process passwd_t;       它指出了當(dāng)一個類型為user_t的進(jìn)程執(zhí)行一個類型為passwd_exec_t的文件時,進(jìn)程類型將會嘗試轉(zhuǎn)換,除非有其它請求,默認(rèn)是換到passwd_t,當(dāng)聲明的客體類

62、別是進(jìn)程(process)時,隱含著目標(biāo)類型要與file客體類別關(guān)聯(lián),聲明的客體類別(process)與源和默認(rèn)類型關(guān)聯(lián),這個隱藏著的關(guān)聯(lián)很容易被忽略,即使你成為一個策略編寫專家也容易犯這個錯。5.2 類型轉(zhuǎn)換規(guī)則type_transition     我們使用type_transition規(guī)則指定默認(rèn)類型,目前有兩種格式的type_transiton規(guī)則:     1) 支持默認(rèn)域轉(zhuǎn)換事件     2) 支持客體轉(zhuǎn)換,它允許我們指定默認(rèn)的客體標(biāo)記    這兩種形式的type

63、_transition規(guī)則幫助增強(qiáng)了SELinux透明轉(zhuǎn)換到Linux用戶的安全性,默認(rèn)情況下,在SELinux中,新創(chuàng)建的客體繼承包括它們的客體的類型(如目錄),進(jìn)程會繼承父進(jìn)程的類型,type_transition規(guī)則允許我們覆蓋這些默認(rèn)類型,這非常有用,例如:為了確保密碼程序在/tmp/目錄下創(chuàng)建一個文件時要給一個不同與普通用戶的類型。     type_transition規(guī)則沒有allow訪問權(quán),它僅提供一個新的默認(rèn)類型標(biāo)記,要成功進(jìn)行類型轉(zhuǎn)換,也必須要一套相關(guān)聯(lián)的allow規(guī)則,以允許進(jìn)程類型可以創(chuàng)建客體和標(biāo)記客體。此外,默認(rèn)的標(biāo)記指定在ty

64、pe_transition規(guī)則中了,只有創(chuàng)建進(jìn)程沒有明確地覆蓋默認(rèn)標(biāo)記行為它才有效。5.2.1 默認(rèn)域轉(zhuǎn)換(進(jìn)程類型轉(zhuǎn)換process)   讓我們一起來詳細(xì)地看一下這條規(guī)則中的域轉(zhuǎn)換格式,執(zhí)行一個文件時,域轉(zhuǎn)換改變了進(jìn)程的類型,如下面這條規(guī)則:cpp view plaincopy1. type_transition init_t apache_exec_t : process apache_t;      這條規(guī)則指出類型為init_t的進(jìn)程執(zhí)行一個類型為apac

65、he_exec_t的文件時,進(jìn)程類型將會轉(zhuǎn)換到apache_t??腕w類別process只表示這是一個域轉(zhuǎn)換規(guī)則的格式。   下圖顯示了一個域轉(zhuǎn)換,實際上,域轉(zhuǎn)換只是改變了進(jìn)程現(xiàn)有的類型,而不是新創(chuàng)建了一個進(jìn)程,這是因為在Linux轉(zhuǎn)換創(chuàng)建一個新的進(jìn)程首先是要調(diào)用fork()系統(tǒng)調(diào)用復(fù)制一份現(xiàn)有的進(jìn)程,如果進(jìn)程類型在fork上被改變了,它就會允許域在新的域中執(zhí)行任意的代碼了,通過execve()系統(tǒng)調(diào)用執(zhí)行一個新的程序時,發(fā)生域轉(zhuǎn)換時就更安全些。      正如前面談到的,只有當(dāng)策略允許了有關(guān)的訪問權(quán)時才會發(fā)生類型轉(zhuǎn)換,域轉(zhuǎn)換要成功,策略必須允許

66、下面三個訪問權(quán):       execute:源類型(init_t)對目標(biāo)類型(apache_exec_t)文件有execute許可       transition:源域(init_t)對默認(rèn)類型(apache_t)必須要有transition許可       entrypoint: 新的(默認(rèn))類型(apache_t)對目標(biāo)類型(apache_exec_t)文件必須要有entryponit許可     同時,上面

67、的域轉(zhuǎn)換規(guī)則要想成功,還必須要有下面的allow規(guī)則:cpp view plaincopy1. # 這條域轉(zhuǎn)換規(guī)則.   2. type_transition init_t apache_exec_t : process apache_t;   3.   4. # 至少需要下面三條allow規(guī)則才能成功   5. allow init_t apache_exec_t :

68、0;file execute;   6. allow init_t apache_t : process transition;   7. allow apache_t apache_exec_t : file entrypoint;      在實際中,除了上面這幾個最小allow規(guī)則外,我們可能還想增加一些額外的規(guī)則,例如:常見的有默認(rèn)類型向源類型發(fā)送exit信號(即sigchld許

69、可),繼承文件描述符,使用管道進(jìn)行通信。    域轉(zhuǎn)換最關(guān)鍵的概念是清楚地定義了入口點,即類型為apache_exec_t的文件對新的默認(rèn)類型apache_t有entrypoint許可,入口點文件允許我們嚴(yán)格控制哪個程序可以在哪個域中執(zhí)行(可以認(rèn)為這就是類型強(qiáng)制的安全特性),我們知道只有程序的可執(zhí)行文件的類型對域有entrypoint許可時,這個程序才可以進(jìn)入一個給定的域,因此我們可以知道并控制哪個程序有哪個特權(quán)了。5.2.2 默認(rèn)客體轉(zhuǎn)換(file)     客體轉(zhuǎn)換規(guī)則為新創(chuàng)建的客體指定一個默認(rèn)的類型,實際上,我們通常是

70、在與文件系統(tǒng)有關(guān)的客體(如file,dir,lnk_file等)上使用這種type_transition規(guī)則,和域轉(zhuǎn)換一樣,這些規(guī)則只會引發(fā)一個默認(rèn)客體標(biāo)記嘗試,也只有策略允許了有關(guān)的訪問權(quán)時,嘗試才會成功。    客體轉(zhuǎn)換規(guī)則由客體類別進(jìn)行標(biāo)記,如:cpp view plaincopy1. type_transition passwd_t tmp_t : file passwd_tmp_t;        這條type_transition規(guī)則指出當(dāng)一個類型為passwd_t的進(jìn)程在一個類型為tmp_t的目錄下創(chuàng)建一個普通文件(file客體類別)時,默認(rèn)情況下,如果策略允許的話,新創(chuàng)建的文件類型應(yīng)該為passwd_tmp_t,注意客體類別目標(biāo)類型不是tmp_t而是默認(rèn)類型passwd_tmp_t,在這個例子中,tmp_t隱含關(guān)聯(lián)了dir客體類別,因為它是唯一能夠容納文件的客體類別,同樣,和前面一樣,策略必須允許對默認(rèn)標(biāo)記的訪問,對于前面的例子,對類型為tmp_t的目錄的訪問權(quán)需要包括add_name,write和search,對類型為pass

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論