您好,登錄后才能下訂單哦!
本篇內容介紹了“SElinux是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
SELinux(Security-Enhanced Linux) 是美國國家安全局(NSA)對于強制訪問控制的實現,是 Linux歷史上最杰出的新安全子系統。NSA是在Linux社區的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,進程只能訪問那些在他的任務中所需要文件
在 SELinux 出現之前,Linux 上的安全模型叫 DAC,全稱是 Discretionary Access Control,翻譯為自主訪問控制。 DAC 的核心思想很簡單,就是:進程理論上所擁有的權限與執行它的用戶的權限相同。比如,以 root 用戶啟動 Browser,那么 Browser 就有 root 用戶的權限,DAC 管理太過寬松,不夠靈活所以有了SELinux。
在這種訪問控制體系的限制下,進程只能訪問那些在他的任務中所需要文件。
SELinux使用類型強制來改進強制訪問控制。所有的主體(程序進程)對客體(文件/socket等資源)的訪問都有一條TE規則來許可。當程序訪問一個資源的時候,系統會搜索所有的TE規則集,并根據結果進行處理。這個規則集是由訪問向量規則(AV, Access Vector)來描述的。
內核向外部暴露允許訪問的資源權限,由TE來描述主體擁有什么樣的訪問權。SELinux定義了30個不同的客體類別:
security process system capability filesystem file dir fd lnk_file chr_file blk_file socket_file ...
每個客體類別都定義了操作許可,比如針對file有19個操作許可:
`ioctl read write create getattr setattr lock relablefrom relableto append unlink link rename execute swapon quotaon mounton execute_no_trans entrypoint
在 SELinux 中,每種東西都會被賦予一個安全屬性,官方說法叫做 Security Context,Security Context 是一個字符串,主要由三個部分組成,例如 SEAndroid 中,進程的 Security Context 可通過 ps -Z 命令查看:
rk3288:/ $ ps -AZ u:r:hal_wifi_supplicant_default:s0 wifi 1816 1 11388 6972 0 0 S wpa_supplicant u:r:platform_app:s0:c512,c768 u0_a14 1388 228 1612844 57396 0 0 S android.ext.services u:r:system_app:s0 system 1531 228 1669680 119364 0 0 S com.android.gallery3d u:r:kernel:s0 root 582 2 0 0 0 0 S [kworker/1:2] u:r:radio:s0 radio 594 228 1634876 89296 0 0 S com.android.phone u:r:system_app:s0 system 672 228 1686204 141716 0 0 S com.android.settings u:r:platform_app:s0:c512,c768 u0_a18 522 223 1721656 152116 0 0 S com.android.systemui
上面的最左邊的一列就是進程的 Security Context,以第一個進程 wpa_supplicant 為例
u:r:hal_wifi_supplicant_default:s0
u 為 user 的意思,SEAndroid 中定義了一個 SELinux 用戶,值為 u
r 為 role 的意思,role 是角色之意,它是 SELinux 中一個比較高層次,更方便的權限管理思路。簡單點說,一個 u 可以屬于多個 role,不同的 role 具有不同的權限。
hal_wifi_supplicant_default 代表該進程所屬的 Domain 為 hal_wifi_supplicant_default。MAC(Mandatory Access Control)強制訪問控制 的基礎管理思路其實是 Type Enforcement Access Control(簡稱TEAC,一般用TE表示),對進程來說,Type 就是 Domain,比如 hal_wifi_supplicant_default 需要什么權限,都需要通過 allow 語句在 te 文件中進行說明。
s0 是 SELinux 為了滿足軍用和教育行業而設計的 Multi-Level Security(MLS)機制有關。簡單點說,MLS 將系統的進程和文件進行了分級,不同級別的資源需要對應級別的進程才能訪問
AV用來描述主體對客體的訪問許可。通常有四類AV規則:
allow:表示允許主體對客體執行許可的操作.
neverallow:表示不允許主體對客體執行制定的操作。
auditallow: 表示允許操作并記錄訪問決策信息。
dontaudit:表示不記錄違反規則的決策信息,切違反規則不影響運行`
通用的類型規則語法位:
1 allow platform_app debugfs:file { read ioctl };
表示類別為platform_app的程序進程,對debugfs類型的文件執行read和ioctl操作。
SELINUX有「disabled」「permissive」,「enforcing」3種選擇。
Disabled就不用說了。
permissive就是Selinux有效,但是即使你違反了策略的話它讓你繼續操作,但是把你的違反的內容記錄下來。在我們開發策略的時候非常的有用,是UserDebug的默認模式。
Enforcing就是你違反了策略,你就無法繼續操作下去。
通過以下命令可以切換系統的SElinux模式 adb shell setenforce 0
0--代表Permissive
1--代表Enforcing
adb shell getenforce---查看狀態
在android系統開發中,因為selinux權限問題一般會在user版本出現,但我們在userdebug版本通過以下方式可以驗證
1、第一步先確定問題是否由selinux權限問題引起
通過命令: adb shell getenforce //查看當前SePolicy權限狀態(Enforcing 表示打開 Permissive表示關閉)
userdebug版本處于permissive關閉狀態 settenforce 1 //更改狀態到Enforcing,0表示Permissive 進行測試,如果此時問題會出現,那么就是selinux權限問題
2、解決方法
1.adb shell dmesg----抓kernel log
(特別說明:adb shell "cat /proc/kmsg | grep avc" > avc_log.txt 可以直接提出avc的log)
2.adb logcat –b events
關鍵字:
avc: denied
如圖:
這是一個selinux權限問題,我們只關注denied{} 、scontext 、tcontext 和 tclass 四個關鍵字就可以
denied{}括號內的內容表示被拒的權限動作
scontext的值表示需要在哪個te文件添加
tcontext 表示需要賦予權限的目標
tclass 表示權限問題的類型
這個問題的修改方式是在system_app.te文件添加如下代碼: allow system_app sysfs_thermal:dir search;
注意:有時在Enforcing模式時不能看到所有缺少的權限日志,例如:
這個日志由于FileNotFoundException問題導致程序不會繼續執行到代碼終點,所以沒有執行的代碼所缺少的權限日志就不能得到,但是在Permissive模式所有權限問題會打印出來,所以建議抓log在Permissive模式下或者兩種模式都抓
“SElinux是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。