




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空航天技術(shù)基礎(chǔ)模擬試題卷
- 浙江國企招聘2025嘉興海鹽縣城市投資集團(tuán)有限公司招聘7人筆試參考題庫附帶答案詳解
- 2025浙江寧波市卓眾人力資源服務(wù)公司銷售業(yè)務(wù)人員專項招募20人筆試參考題庫附帶答案詳解
- 2025年中國葛洲壩集團(tuán)易普力股份有限公司禹州分公司招聘22人(河南)筆試參考題庫附帶答案詳解
- 膀胱治療儀試題及答案
- 2025上半年云南日報報業(yè)集團(tuán)招聘34人筆試參考題庫附帶答案詳解
- 紡織品的面料對比與選用試題及答案
- 紡織行業(yè)內(nèi)審標(biāo)準(zhǔn)知識試題及答案
- 高標(biāo)準(zhǔn)農(nóng)田建設(shè)推動鄉(xiāng)村振興戰(zhàn)略深入實施
- 貨車合伙合同協(xié)議書
- DL-T 5850-2021 電氣裝置安裝工程 高壓電器施工及驗收規(guī)范
- 多層螺旋CT原理及臨床應(yīng)用
- 年產(chǎn)3.0萬噸二甲醚裝置分離精餾工段的設(shè)計
- 驗房項目詳細(xì)表格
- 小學(xué)二年級下冊第19課-大象的耳朵教案(部編版)
- 三年級培智生活數(shù)學(xué)暑假作業(yè)
- 公路隧道建設(shè)施工技術(shù)規(guī)范學(xué)習(xí)考試題庫(400道)
- 康復(fù)醫(yī)學(xué)質(zhì)控標(biāo)準(zhǔn)
- 《石壕吏》優(yōu)質(zhì)課一等獎?wù)n件
- 天津東疆綜合保稅區(qū)管理委員會招考聘用沖刺題(二)
- 第三篇 太陽和恒星世界(3)恒星形成和演化
評論
0/150
提交評論