4 2 在SELinux策略中定義客體類

2021-09-20 02:10:48 字數 3514 閱讀 7599

乙個策略中一定要包含被selinux核心和其他客體管理器支援的所有客體類和許可權的宣告.通常來說,我們作為策略編寫者,不用擔心建立新的客體類.然而,我們需要理解被定義的客體類來編寫出更有效率的selinux策略.理解客體類和許可權宣告語法是非常有用的,因為特允許我們理解我們正在使用的策略版本支援的客體類和許可權.

新增乙個新的客體類和許可權

新增乙個新的客體類和在乙個存在的客體類上修改許可權非常複雜的工作,這項工作通常只能在修改系統**本身的時候進行.不像selinux策略語言的其他方面,客體類和許可權在linux細節實現上是緊緊繫結在一起的,特別是核心.事實上,客體類和許可權被設計來盡可能精確的代表被系統實現的資源.對於這個原因,當系統發生改變的時候,改變客體類和許可權來匹配對應的系統是非常有意義的.

乙個型別改變的例子就是在客體類中授權乙個改變,並且許可權是ipc對核心新的形式的附加.在這個例項中,乙個完全新的資源類別被新增,就像新的或者是擴充套件的系統呼叫,乙個新的客體類可能會被需要代表這個資源的語義.

新增或者是改變客體類或語義不僅僅需要對策略修改,還需要對系統**修改,那將會基於新的客體類或許可權強制進行訪問控制.僅僅是向策略中新增客體類或許可權而不修改**除了浪費核心記憶體沒有別的作用.

基本上來說,對於這本書的目標讀者(selinux的策略編寫者和管理員),你應該永遠不要改變客體類和許可權定義.

4.2.1 宣告客體類

客體類使用類宣告語句進行宣告.類宣告語句僅僅宣告了乙個客體類的名稱,別的就沒有什麼了.例如,我們用下面的描述為類別定義乙個客體類.

class

dir

類宣告是由關鍵字」class」以及後面的類名稱組成.注意;類宣告不用分號結尾.

客體類名稱有乙個分離的命名空間.客體類,許可權,型別(識別符號)等有相同的名稱的情況是可能的,但是那是一種不好的策略書寫方法.

類定義語法

類定義允許你宣告客體類名稱.下面是類宣告的全語法:

class

class_name

class_name ​客體類的識別符號.這個識別符號可以任意長度,並且可以包含ascii字元或數字

類定義僅僅在整體策略和基本可載入模組中是有效的.在條件語句和非基本可載入模組中他不是有效的.

4.2.2 宣告和關聯客體類許可權

有兩種方法宣告許可權.第一種叫做公共許可權,並且允許我們創造乙個和客體類關聯成乙個組的許可權.當客體類分享一系列訪問許可權的時候,公共許可權是有用的.第二種方法叫做類特定許可權,該方法允許我們單獨宣告某個類的特定許可權.正如我們看到的,有一些客體類僅僅有特定許可權,有些僅僅有公共許可權,有些這兩種許可權都有.

4.2.2.1 公共許可權

公共許可權語句允許我們宣告一些列的許可權與兩個或多個客體類聯絡起來組成組.公共許可權語句的完全語法在後面會有展示.例如,unix」一切皆檔案」的信條意味著很多檔案相關的客體類擁有公共許可權.下面是乙個檔案相關的許可權的宣告方式:

common file

這個語句宣告了乙個公共許可權集稱為檔案,並且裡面定義了一些相關許可權.乙個公共許可權語句本身是沒有效果的.當我們將這些許可權和客體類聯絡在一起的時候他才會有用.

就像物件類(客體類),公共許可權名稱被宣告在他們自己的命名空間中.當我們不仔細的話,可能會使我們迷惑.例如,就像我們在前面例子中闡述的一樣,我們有乙個客體類和乙個公用許可權名字為檔案.雖然名字是一樣的,他們事實上是策略的兩個不同的元件.

公共許可權語句語法

公共許可權語句允許你宣告乙個公共許可權名稱,該公共許可權有一系列的許可權能夠和客體類關聯成乙個組.公共許可權可以和多個客體類相關聯.下面是公共許可權語句的完全語法.

commom commom_name
common_name 公共許可權的識別符號.客體類可以是任意長度並且可以包含ascii字元,數字和橫線(-),還有點(.)

perm_set 在乙個空間分離列表中的乙個或多個許可權識別符號.識別符號可以是任何長度,並且可以包含ascii字元,數字,橫線和點

乙個公共許可權集使用訪問向量語句於客體類向關聯.

公共許可權語句僅僅在整體策略和基本可載入模組中是有效的.他們在條件語句和非基本可載入模組中是無效的.

4.2.2.2 許可權和客體類相關聯

我們使用訪問向量語句將許可權和客體類關聯在一起.我們使用訪問向量語句去關聯公共和類特定許可權.例如,下面語句是將客體類dir和單個類特定許可權關聯在一起.

class

dir

正如這個例子顯示的,訪問向量語句看上去很像類定義語句.類定義語句和訪問向量語句雖然是使用同乙個關鍵字開始的,但是他們是不同的.訪問向量語句必須要提供乙個之前定義的類名稱和提供乙個或多個許可權.在這個例子中,我們定義了乙個單一的,類特定許可權,注意,這條語句是不用分好結尾的.

之前的訪問向量語句會導致dir客體類擁有乙個類特定許可權:search.通常來說,在乙個客體類中你會看到有很多許可權,就像下面的語句.

class

dir

這個例子將三個類特定許可權和客體類dir關聯在一起.我們也可以通過在訪問向量語句中使用可選的關鍵子」inherits」將公共許可權和客體類關聯在一起.例如,dir客體類是很多檔案相似的客體類中的乙個,並且和其他檔案相似客體類共享公共許可權.下面的訪問向量語句是乙個完整的將die和公共許可權檔案關聯在一起的語句,就像之前展示的,和一些類特定許可權一塊就會使其與別的目錄不同.

class

dirinherits file

正如這個例子闡述的,我們通過關鍵字」inherits」加上後面之前宣告的公共許可權集(file)來將所有的公共許可權和dir關聯在一起.這條語句的結果就是客體類dir有效的許可權都是那些之前定義的公共許可權file,並且還有dir的五個特定許可權.

class

lnk_file

inherits

file

這條語句會使得類lnk_file僅僅擁有在公共許可權file中定義的許可權,而沒有別的.

同樣的,客體類僅僅擁有類特定許可權也是可能的(也就是說沒有公共許可權).例如,代表檔案描述符的客體類(fd)的訪問向量語句有乙個單一的類特定許可權,允許使用檔案描述符.

class

fd

訪問向量語句語法

訪問向量語句將許可權和之前宣告的客體類關聯起來.下面是訪問向量語句的完全語法:

class

class_name [inherits

common]

//class_name ​之前宣告的客體類名稱

//commom ​ ​之前宣告的公共許可權集合名稱

//perm_set ​ 在乙個分離空間列表中的乙個或多個許可權識別符號. 識別符號可以是任意長度,可以包含ascii字元,數字還有點

在最小情況下,common和perm_set至少要提供乙個,或者是兩個都提供.訪問向量語句的最後結果就是這兩個方面的許可權的集合.

訪問向量語句僅僅在整體策略或者是基本可載入模組中是有效的,但是在條件語句和非基本可載入模組中是無效的.

在C Builder中定義事件

在c builder中,事件是一種委託模型,它是對訊息的封裝。如果你用過vc,你就知道在vc中並不存在什麼事件,而只有訊息處理函式,而在c builder中則是由事件處理函式來負責響應訊息。同是,事件本身也是一指標,它是乙個閉包,通常在c builder中有兩種事件 通知型別事件 即tnotifye...

在結構體中定義巨集定義意義

第一次看見在結構體中有巨集定義,開始有點迷糊,想到該結構是如何儲存的?巨集定義會是不會多次編譯?以下是我看的乙個列子 typedef struct define xcp authorized bit 0x01 uint16 t xcpauthorizedbit 1 define block resp...

在C 中定義VMprotect巨集

定義虛擬機器保護的巨集 define vmprotectbegin asm emit 0xeb asm emit 0x10 asm emit 0x56 asm emit 0x4d asm emit 0x50 asm emit 0x72 asm emit 0x6f asm emit 0x74 asm ...