android中SELINUX规则分析和语法简介
點擊打開鏈接
1. SELINUX是可以理解為一種Android上面的安全機制,是有美國國家安全局和一些公司設計的一個針對linux的安全加強系統
我們可以通過配置SELINUX的相關policy,來定制自己的手機的一些權限,比如,我們可以完全讓root用戶沒有任何的權限和user一樣
2. 在android里面,有兩個類型,一種是文件,一種是進程。
? ?針對這兩種類型,我們可以先來看看他們的不同。
? ?在android上面,adb shell之后進入手機,ps -Z可以查看當前進程所擁有的selinux的權限。
? ?舉例:
? ? 在android中,只定義了一個user即為u. 另外,如果是進程的話,都會統一定義為r,如果是文件的話,會被定義為object_r. 第三個是這個進程type,在andorid里面,定義了100多個type.按照目前我的理解,這個是進程所屬的>類型。第四個是s0,這個是一個安全的等級。但是暫時還沒有接觸到配置這個的地方。
? ? 另外就是文件,文件想要查看相關SELINUX權限的話,需要去執行ls -Z
[plain]?view plaincopyprint?
3. 如何配置selinux
? ?首先,按照Google的官方文檔:
? ?需要linux內核首先是支持selinux的,另外需要android的selinux的配置文件,也就是extern/sepolicy里面的內容。
? ?然后就是修改BoardConfig.mk
? ?Google的nexus的sepolicy的支持就放在了 device/lge/mako/sepolicy
? ?首先會包含廠商定制的sepolicy的文件夾: BOARD_SEPOLICY_DIRS
? ?然后將規則添加到了sepolicy中: BOARD_SEPOLICY_DIRS
? 這樣的話,我們編譯出來的image其實就是具有了selinux的功能。
? 其實如果沒有廠商定制的話,也是會編譯到external/sepolicy的,這樣的話,就是使用andriod所有默認的sepolicy(It defines the domains and types for the AOSP services and apps common to all devices. )
? ? 然后理解了這個之后,我們可以看到其實很多的廠商也是有自己的配置規則在device/***/***/sepolicy下面的.
4. selinux的配置規則:
? ?首先要了解sepolicy的結構:
? ?a. App進程?-> mac_permissions.xml
? ?b. App數據文件?-> seapp_contexts
? ?c. 系統文件??-> ?file_contexts
? ?d. 系統屬性?-> property_contexts
? ?在te文件中,我們一般遇到的語法是這樣的:
???rule_name source_type target_type:class perm_set
? ?解讀為: 為source_type設置一個rule_name的規則,規則是對target_type的class 進行 perm_set的操作。
? ?然后是一些特殊的配置文件:
? ?a. external/sepolicy/attributes?-> 所有定義的attributes都在這個文件
? ?b. external/sepolicy/access_vectors?-> 對應了每一個class可以被允許執行的命令
? ?c. external/sepolicy/roles??-> Android中只定義了一個role,名字就是r,將r和attribute domain關聯起來
? ?d. external/sepolicy/users??-> 其實是將user與roles進行了關聯,設置了user的安全級別,s0為最低級是默認的級別,mls_systemHigh是最高的級別
? ?e. external/sepolicy/security_classes?-> 指的是上文命令中的class,個人認為這個class的內容是指在android運行過程中,程序或者系統可能用到的操作的模塊
? ?f. external/sepolicy/te_macros?-> 系統定義的宏全在te_macros文件
? ?g. external/sepolicy/***.te??-> 一些配置的文件,包含了各種運行的規則
? ?另外,selinux有兩種工作模式:
? ??“permissive”:所有操作都被允許(即沒有MAC),但是如果有違反權限的話,會記錄日志
? ??“enforcing”:所有操作都會進行權限檢查
? ?最后,type的命令如下:
???type type_id [alias alias_id,] [attribute_id] ??# 將type_id(別名為alias)關聯到attribute. 這樣的話,方便用attribute來管理不同的type中包含相同的屬性的部分。
? ?class命令的格式為:
? ?class class_name [ inherits common_name ] { permission_name ... }
? ?inherits表示繼承了common定義的權限,然后自己額外實現了permission_name的權限
? ?在te文件中常見的四種命名的規則:
? ?allow:賦予某項權限。
? ?allowaudit:audit含義就是記錄某項操作。默認情況下是SELinux只記錄那些權限檢查失敗的操作。allowaudit則使得權限檢查成功的操作也被記錄。注意,allowaudit只是允許記錄,它和賦予權限沒關系。賦予權限必須且只能使
用allow語句。
? ?dontaudit:對那些權限檢查失敗的操作不做記錄。
? ?neverallow:前面講過,用來檢查安全策略文件中是否有違反該項規則的allow語句。如例子5所示:
? ?舉例:
[plain]?view plaincopyprint?
[plain]?view plaincopyprint?
[plain]?view plaincopyprint?
? ?這兩句話的意思是:1. 允許app去對anr_data_file類型的目錄進行查找的操作
? ?2. 允許app對anr_data_file類型的file進行打開和添加操作 ? 其實就是規定了出現anr時候,app往/data/anr/里面寫入的權限限制 [plain]?view plaincopyprint?
? ?絕對不允許app(除了有unconfineddomain屬性的app)對kmem_device類型的字符設備進行讀寫的操作
[plain]?view plaincopyprint?
[plain]?view plaincopyprint?
? ?定義httpd_user_content_t具有file_type, httpdcontent的屬性
[plain]?view plaincopyprint?
? ?比如這個例子,我們允許所有具有app屬性的內容可以去對self屬性的rawip_socket進行create的操作
[plain]?view plaincopyprint?
[plain]?view plaincopyprint?
? ?所以不能聲明一個類型或者屬性叫做self
[plain]?view plaincopyprint?
[plain]?view plaincopyprint?
? ?如果下面這條語句想要執行成功
? ?type_transition init_t apache_exec_t:process apache_t;
? ?至少首先聲明下面的三條規則:
? ?allow init_t apache_exec_t:file execute;
? ?allow init_t apache_t:process transition;
? ?allow apache_t apache_exec_t:file entrypoint;
? ?type_transition和type_change的語法規則是一樣的, type_change規則的影響不會在內核中生效,而是依賴于用戶空間應用程序,如login或sshd
5. 生成方法:
? ??下面介紹一下最簡單的安全策略(se-policy)添加方法,各組碰到SELinux導致的訪問禁止問題,可以參考用這種方法確認和解決。
? ??1)?安裝pc上的工具,用于自動生成安全策略
$ sudo apt-get install policycoreutils
????2),刷userdebug/eng軟件,先將SELinux設置成Permissive模式,只輸出警告不阻止操作
?使用getenforce命令查看當前模式:$ adb shell getenforce
Enforcing
在Enforcing模式下,除安全策略允許外的操作都會被阻止;使用setenforce命令更改當前模式(root權限需要):
$ adb root
restarting adbd as root
$ adb shell setenforce 0
$ adb shell getenforce
Permissive
開發如果碰到懷疑是SELinux?可以通過這種方法關閉SELiunx(?setenforce 0),以確認是不是SELinux引起的
????3),按照流程完成整個操作,抓取log,過濾出警告信息
- 如果log較多,可以先用grep工具過濾一下:
$ grep "avc: *denied" log.txt > denied.txt
$ cat denied.txt
<14>[? 389.521062] avc:? denied? { set } for property=audio.ftm.rcv_reverse scontext=u:r:system_app:s0?tcontext=u:object_r:default_prop:s0 tclass=property_servic
??? 4),使用pc工具生成安全策略
- 命令audit2allow用來一次性生成所有安全策略,輸入為前面抓取的?log
$ audit2allow -i denied.txt
總結
以上是生活随笔為你收集整理的android中SELINUX规则分析和语法简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SEAndroid策略介绍1
- 下一篇: linux开发摘要