說明
系統:Android10.0
裝置: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
本章節介紹Selinux的安全政策的基本規則, 先入為主的了解最簡單的東西, 然後再慢慢深入更細節東西。
一, 最簡單的Selinux安全政策規則
前面講到selinux要求系統對每一項通路都進行嚴格的限制和驗證,而是否有權限是根據使用者配置的安全政策來決定,凡是沒有在安全政策配置的權限,通路就會被否定(deny)。安全政策可以在檔案中進行配置, 為了讓大家快速了解, 來看一個SEAndroid中設定安全政策(設定權限)的例子:
/*
system/sepolicy/public/vold.te
*/
allow vold tmpfs:dir create_dir_perms;
解釋: 允許vold程序在tmpfs檔案系統(如/mnt目錄下)中建立檔案夾。如果沒有在vold.te中使用上例中的權限配置allow語句,則vold程序就無法往tmpfs檔案系統中建立目錄,即使vold具有root權限。
SELinux 給Linux 的所有對象都配置設定一個安全上下文(Security Context), 描述成一個字元串, 也可以說成是label标簽。這裡的對象分為兩種,一種叫做Subject主體和Object客體(被通路對象)。主體通常是以程序為機關,通常就是程序,而客體就是程序通路的資源,通常是以檔案為機關。
二, 檔案和程序的安全上下文
通過ls -Z可以檢視檔案上下文:
$ ls -Z
u:object_r:cgroup:s0 acct u:object_r:rootfs:s0 init.zygote32_64.rc
u:object_r:rootfs:s0 bin u:object_r:rootfs:s0 init.zygote64_32.rc
u:object_r:rootfs:s0 bugreports u:object_r:rootfs:s0 lost+found
u:object_r:cache_file:s0 cache u:object_r:metadata_file:s0 metadata
u:object_r:rootfs:s0 charger u:object_r:tmpfs:s0 mnt
u:object_r:configfs:s0 config u:object_r:vendor_file:s0 odm
u:object_r:rootfs:s0 d u:object_r:oemfs:s0 oem
通過ps -Z 檢視程序上下文:
u:r:servicemanager:s0 system 1672 1 0 04:55 ? servicemanager
u:r:hwservicemanager:s0 system 1673 1 0 04:55 ? hwservicemanager
u:r:vndservicemanager:s0 system 1674 1 0 04:55 ? vndservicemanager /dev/vndbinder
上面通過-Z增加的資訊, 實際由四部分内容組成:SELinux使用者、SELinux角色、類型、安全級别。
格式 | “user:role:type:mls” |
User 使用者 | 代表建立這個檔案的SELinux user, Android不使用 SELinux 使用者。唯一定義的使用者是 u, android源碼中有定義: system/sepolicy/private/users |
Role 角色 | 為角色role的意思, 不同角色有不同的權限, Android不使用 SELinux 角色,定義并使用了兩個預設角色:如果是程序(活的), 會定義為r, 如果是檔案(死的),會被定義為object_r。Android源碼中有定義: system/sepolicy/private/roles_decl |
Type 類型 | 如果是程序的話, 這一欄就是domain(域),表示程序屬于某某Domain并具有某某權限, 在政策檔案中,domain可以通過allow語句來賦予不同的權限, 當某個程序屬于這個域,也就有了這個域的權限, 比如zygote域擁有對init程序發送SIGCHLD信号等權限, 而屬于zygote的所有程序也就有了相同權限, 這欄如果是檔案的話, 那這一欄就是type(檔案類型,如device類型,camera類型等),檔案有了類型, 這樣程序才能對知道對哪些類型檔案擁有什麼通路權限, 對程序來說,Type就是Domain |
Mls多級别安全 | MLS将系統的程序和檔案進行了分級,不同級别的資源需要對應級别的程序才能通路,主要是為了滿足軍用和教育行業而設計的, Android不使用 SELinux 敏感度,隻有 s0 敏感度。 |
三,常見操作selinux的指令
setenforce 0/1 或 getenforce | 臨時關閉或打開安全政策 ,或者擷取目前政策 Permissive/Enforcing,源碼在: external/selinux/libselinux/utils/getenforce.c和setenforce.c |
Ls -Z | 顯示檔案的Security Context |
ps -Z | 顯示程序的Security Context |
id (user) | 顯示程序/使用者的Security Context 例子: $ id uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid) context=u:r:shell:s0 $ id system uid=1000(system) gid=1000(system) groups=1000(system), context=u:r:shell:s0 |
chcon(change context) setcon(set context) | 修改/設定檔案的Security Context 用法: chcon [-hRv] CONTEXT FILE... 例子: # ls -lZ test -rw-rw-rw- 1 root root u:object_r:system_data_file:s0 0 2022-04-21 20:50 test # chcon u:object_r:adb_data_file:s0 test # ls -lZ test -rw-rw-rw- 1 root root u:object_r:adb_data_file:s0 0 2022-04-21 20:50 test |
Restorecon(restore context) | 恢複檔案的預設Security Context 例子: # ls -lZ test -rw-rw-rw- 1 root root u:object_r:adb_data_file:s0 0 2022-04-21 20:50 test # restorecon test SELinux: Loaded file_contexts # ls -lZ test -rw-rw-rw- 1 root root u:object_r:system_data_file:s0 0 2022-04-21 20:50 test |
dmesg |grep avc 或 logcat |grep avc | 檢視所有denied的資訊 |
getprop -Z | 看你定義屬性的标簽内容 |
load_policy | 加載二進制政策檔案,臨時性的操作,重新開機無效, 一般用于調試,如重新編譯了政策檔案, 替換新的政策二進制檔案, 可以重新讓系統加載政策檔案 usage: load_policy FILE 如: |