Linux系統先做DAC檢查。如果沒有通過DAC權限檢查,則操作直接失敗。通過DAC檢查之後,再做MAC權限檢查。
SELinux中也有用戶的概念,但它和Linux中原有的user概念不是同一個東西。什麼意思呢?比如,Linux中的超級用戶root在SELinux中可能就是一個沒權限,沒地位,打打醬油的”路人甲“。當然,這一切都由SELinux安全策略的製定者來決定。
u為user的意思。SEAndroid中定義了一個SELinux用戶,值為u。
r為role的意思。role是角色之意,它是SELinux中一種比較高層次,更方便的權限管理思路,即Role Based Access Control(基於角色的訪問控制,簡稱為RBAC)。簡單點說,一個u可以屬於多個role,不同的role具有不同的權限。RBAC我們到最後再討論。
init,代表該進程所屬的Domain為init。MAC的基礎管理思路其實不是針對上面的RBAC,而是所謂的Type Enforcement Accesc Control(簡稱TEAC,一般用TE表示)。對進程來說,Type就是Domain。比如init這個Domain有什麼權限,都需要通過[例子1]中allow語句來說明。
S0和SELinux為了滿足軍用和教育行業而設計的Multi-Level Security(MLS)機制有關。簡單點說,MLS將系統的進程和文件進行了分級,不同級別的資源需要對應級別的進程才能訪問。後文還將詳細介紹MLS。
u:object_r:rootfs:s0:
u:同樣是user之意,它代表創建這個文件的SELinux user。
object_r:文件是死的東西,它沒法扮演角色,所以在SELinux中,死的東西都用object_r來表示它的role。
rootfs:死的東西的Type,和進程的Domain其實是一個意思。它表示root目錄對應的Type是rootfs。
s0:MLS的級別。
根據SELinux規範,完整的SContext字符串為:
user:role:type
allow:TE的allow語句,表示授權。除了allow之外,還有allowaudit、dontaudit、neverallow等。
netd:source type。也叫subject,domain。
proc:target type。它代表其後的file所對應的Type。
file:代表Object Class。它代表能夠給subject操作的一類東西。例如File、Dir、socket等。在Android系統中,有一個其他Linux系統沒有的Object Class,那就是Binder。
write:在該類Object Class中所定義的操作。
上述示例展示了SEAndroid中Object Class的定義,其中:
Object Class需要通過class語句申明。這些申明一般放在一個叫security_class的文件中。
實際上,type和attribute位於同一個命名空間,即不能用type命令和attribute命令定義相同名字的東西。
其實,attribute真正的意思應該是類似type(或domain)group這樣的概念。比如,將type A和attribute B關聯起來,就是說type A屬於group B中的一員。
這也正是type和attribute位於同一命名空間的原因。
這種做法實際上只是減輕了TE文件編寫者的煩惱,安全策略文件在編譯時會將attribute拓展為其包含的type。如例子4所示:
allow:賦予某項權限。
allowaudit:audit含義就是記錄某項操作。默認情況下是SELinux只記錄那些權限檢查失敗的操作。allowaudit則使得權限檢查成功的操作也被記錄。注意,allowaudit只是允許記錄,它和賦予權限沒關係。賦予權限必須且只能使用allow語句。
dontaudit:對那些權限檢查失敗的操作不做記錄。
neverallow:前面講過,用來檢查安全策略文件中是否有違反該項規則的allow語句。
u1,r1,t1:代表source的user,role和type。
u2,r2,t2:代表target的user,role和type。
==和!=:==表示相等或屬於,!=表示不等或不屬於。對於u,r來說,==和!=表示相等或不等,而當諸如t1 “ ==或!= ”某個attribute時,表示源type屬於或不屬於這個attribute。
dom,domby,incomp,eq:僅針對role,表示統治,被統治,沒關係和相同(和==一樣)
SEAndroid中沒有使用constrain,而是用了MLS中的mlsconstrain。所以下文將詳細介紹它。
constrain是對TEAC的加強。因為TEAC僅針對Type或Domain,沒有針對user和role的,所以constrain在TEAC的基礎上,進一步加強了權限控制。在實際使用過程中,SELinux進行權限檢查時,先檢查TE是否滿足條件,然後再檢查constrain是否也滿足條件。二者都通過了,權限才能滿足。
initial_sids:定義了LSM初始化時相關的信息。SID是SELinux中一個概念,全稱是Security Identifier。SID其實類似SContext的key值。因為在實際運行時,如果老是去比較字符串(還記得嗎,SContext是字符串)會嚴重影響效率。所以SELinux會用SID來匹配某個SContext。
initial_sid_context:為這些SID設置最初的SContext信息。
當init_t Domain中的進程執行type為apache_exec_t類型的可執行文件(fork並execv)時,其class(此處是process)所屬Domain(對process而言,肯定是指Domain)需要切換到apache_t域。
歡迎光臨 TShopping (http://www.tshopping.com.tw/) | Powered by Discuz! X3.2 |