天天看點

Android系統10 RK3399 init程序啟動(二十三) 初識Selinux 安全政策

說明

系統: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

如:

繼續閱讀