Halaman ini membahas cara pembuatan kebijakan SELinux. Kebijakan SELinux dibuat dari
kombinasi kebijakan AOSP inti (platform) dan kebijakan khusus perangkat
(vendor). Alur build kebijakan SELinux untuk Android 4.4 hingga Android
7.0 menggabungkan semua fragmen sepolicy, lalu menghasilkan file monolitik di direktori
root. Artinya, vendor SoC dan produsen ODM mengubah
boot.img
(untuk perangkat non-A/B) atau system.img
(untuk perangkat A/B) setiap kali kebijakan
diubah.
Di Android 8.0 dan yang lebih tinggi, kebijakan platform dan vendor dibuat secara terpisah.
SOC dan OEM dapat memperbarui bagian kebijakan mereka, mem-build image mereka
(seperti, vendor.img
dan boot.img
),
lalu mengupdate image tersebut secara independen dari update
platform.
Namun, karena file kebijakan SELinux modular disimpan di partisi
/vendor
, proses init
harus memasang partisi sistem dan
vendor lebih awal agar dapat membaca file SELinux dari partisi tersebut dan menggabungkannya
dengan file SELinux inti di direktori sistem (sebelum memuat ke
kernel).
File sumber
Logika untuk mem-build SELinux ada dalam file berikut:
-
external/selinux
: Project SELinux eksternal, yang digunakan untuk mem-build utilitas command line HOST guna mengompilasi kebijakan dan label SELinux.-
external/selinux/libselinux
: Android hanya menggunakan sebagian projectlibselinux
eksternal beserta beberapa penyesuaian khusus Android. Untuk mengetahui detailnya, lihatexternal/selinux/README.android
. -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: Compiler kebijakan SELinux (file yang dapat dieksekusi host:checkpolicy
,checkmodule
, dandispol
). Bergantung padalibsepol
.
-
-
system/sepolicy
: Konfigurasi kebijakan SELinux Android inti, termasuk konteks dan file kebijakan. Logika build sepolicy utama juga ada di sini (system/sepolicy/Android.mk
).
Untuk mengetahui detail selengkapnya tentang file di system/sepolicy
, baca artikel
Mengimplementasikan SELinux.
Android 7.x dan yang lebih lama
Bagian ini membahas cara kebijakan SELinux dibuat di Android 7.x dan yang lebih lama.
Proses build untuk Android 7.x dan yang lebih lama
Kebijakan SELinux dibuat dengan menggabungkan kebijakan AOSP inti dengan penyesuaian khusus
perangkat. Kebijakan gabungan kemudian diteruskan ke compiler kebijakan dan
berbagai pemeriksa. Penyesuaian khusus perangkat dilakukan melalui
variabel BOARD_SEPOLICY_DIRS
yang ditentukan dalam file
Boardconfig.mk
khusus perangkat. Variabel build global ini berisi daftar
direktori yang menentukan urutan penelusuran file kebijakan tambahan.
Misalnya, vendor SoC dan ODM masing-masing dapat menambahkan direktori, satu untuk setelan khusus SoC dan satu lagi untuk setelan khusus perangkat, untuk menghasilkan konfigurasi SELinux akhir untuk perangkat tertentu:
BOARD_SEPOLICY_DIRS += device/SOC/common/sepolicy
BOARD_SEPOLICY_DIRS += device/SoC/DEVICE/sepolicy
Konten file file_contexts di system/sepolicy
dan
BOARD_SEPOLICY_DIRS
digabungkan untuk menghasilkan
file_contexts.bin
di perangkat:

Gambar 1. Logika build SELinux.
File sepolicy
terdiri dari beberapa file sumber:
- Teks biasa
policy.conf
dihasilkan dengan menggabungkan filesecurity_classes
,initial_sids
,*.te
,genfs_contexts
, danport_contexts
dalam urutan tersebut. - Untuk setiap file (seperti
security_classes
), kontennya adalah penyambungan file dengan nama yang sama di bagiansystem/sepolicy/
danBOARDS_SEPOLICY_DIRS
. policy.conf
dikirim ke compiler SELinux untuk pemeriksaan sintaksis dan dikompilasi ke dalam format biner sebagaisepolicy
di perangkat.Gambar 2. File kebijakan SELinux.
File SELinux
Setelah dikompilasi, perangkat Android yang menjalankan 7.x dan yang lebih lama biasanya berisi file terkait SELinux berikut:
selinux_version
- sepolicy: output biner setelah menggabungkan file kebijakan
(seperti,
security_classes
,initial_sids
, dan*.te
) file_contexts
property_contexts
seapp_contexts
service_contexts
system/etc/mac_permissions.xml
Untuk mengetahui detail selengkapnya, lihat Menerapkan SELinux.
Inisialisasi SELinux
Saat sistem melakukan booting, SELinux berada dalam mode permisif (dan bukan dalam mode pemberlakuan). Proses init melakukan tugas berikut:
- Memuat file
sepolicy
dari ramdisk ke kernel melalui/sys/fs/selinux/load
. - Mengalihkan SELinux ke mode pemberlakuan.
- Menjalankan
re-exec()
untuk menerapkan aturan domain SELinux ke dirinya sendiri.
Untuk mempersingkat waktu booting, lakukan re-exec()
pada
proses init
sesegera mungkin.
Android 8.0 dan yang lebih tinggi
Di Android 8.0, kebijakan SELinux dibagi menjadi komponen platform dan vendor untuk memungkinkan update kebijakan platform/vendor independen sekaligus mempertahankan kompatibilitas.
Sepolicy platform selanjutnya dibagi menjadi bagian platform pribadi dan platform publik untuk mengekspor jenis dan atribut tertentu ke penulis kebijakan vendor. Jenis/atribut publik platform dijamin akan dipertahankan sebagai API yang stabil untuk versi platform tertentu. Kompatibilitas dengan jenis/atribut publik platform sebelumnya dapat dijamin untuk beberapa versi menggunakan file pemetaan platform.
Proses build untuk Android 8.0
Kebijakan SELinux di Android 8.0 dibuat dengan menggabungkan bagian dari
/system
dan /vendor
. Logika untuk menyiapkannya
dengan benar ada di
/platform/system/sepolicy/Android.mk
.
Kebijakan ada di lokasi berikut:
Lokasi | Berisi |
---|---|
system/sepolicy/public |
API sepolicy platform |
system/sepolicy/private |
Detail implementasi platform (vendor dapat mengabaikannya) |
system/sepolicy/vendor |
File kebijakan dan konteks yang dapat digunakan vendor (vendor dapat mengabaikannya jika diinginkan) |
BOARD_SEPOLICY_DIRS |
Kebijakan keamanan vendor |
BOARD_ODM_SEPOLICY_DIRS (Android 9 dan yang lebih tinggi) |
Odm sepolicy |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
Sepolicy API System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
Detail implementasi system_ext (vendor dapat mengabaikannya) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
API sepolicy produk |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 dan yang lebih baru) |
Detail penerapan produk (vendor dapat mengabaikannya) |
Sistem build menggunakan kebijakan ini dan menghasilkan komponen kebijakan sistem, system_ext, produk, vendor, dan odm di partisi yang sesuai. Langkah-langkahnya meliputi:
- Mengonversi kebijakan ke format Common Intermediate Language (CIL)
SELinux, khususnya:
- kebijakan platform publik (system + system_ext + product)
- kebijakan pribadi + publik gabungan
- kebijakan publik + vendor dan
BOARD_SEPOLICY_DIRS
- Membuat versi kebijakan yang disediakan oleh publik sebagai bagian dari kebijakan vendor.
Dilakukan dengan menggunakan kebijakan CIL publik yang dihasilkan untuk menginformasikan kebijakan publik +
vendor +
BOARD_SEPOLICY_DIRS
gabungan tentang bagian mana yang harus diubah menjadi atribut yang akan ditautkan ke kebijakan platform. - Membuat file pemetaan yang menautkan platform dan bagian vendor. Awalnya, tindakan ini hanya menautkan jenis dari kebijakan publik dengan atribut yang sesuai dalam kebijakan vendor; nantinya tindakan ini juga akan menyediakan dasar untuk file yang dikelola di versi platform mendatang, sehingga memungkinkan kompatibilitas dengan kebijakan vendor yang menargetkan versi platform ini.
- Menggabungkan file kebijakan (jelaskan solusi di perangkat dan solusi yang telah dikompilasi sebelumnya).
- Menggabungkan kebijakan pemetaan, platform, dan vendor.
- Mengompilasi file kebijakan biner output.
Kebijakan keamanan publik platform
Sepolicy publik platform mencakup semua yang ditentukan di bagian
system/sepolicy/public
. Platform dapat mengasumsikan bahwa jenis dan
atribut yang ditentukan berdasarkan kebijakan publik adalah API stabil untuk versi
platform tertentu. Hal ini membentuk bagian dari sepolicy yang diekspor oleh platform tempat
developer kebijakan vendor (yaitu, perangkat) dapat menulis kebijakan
khusus perangkat tambahan.
Jenis diberi versi sesuai dengan versi kebijakan yang digunakan untuk menulis file
vendor, yang ditentukan oleh variabel build
PLATFORM_SEPOLICY_VERSION
. Kebijakan publik yang di-versi kemudian disertakan dengan
kebijakan vendor dan (dalam bentuk aslinya) dalam kebijakan platform. Dengan demikian,
kebijakan akhir mencakup kebijakan platform pribadi, sepolicy publik
platform saat ini, kebijakan khusus perangkat, dan kebijakan publik berversi
yang sesuai dengan versi platform tempat kebijakan perangkat
ditulis.
Kebijakan keamanan pribadi platform
Sepolicy pribadi platform mencakup semua yang ditentukan di
/system/sepolicy/private
. Bagian kebijakan ini membentuk
jenis, izin, dan atribut khusus platform yang diperlukan untuk fungsi
platform. Ini tidak diekspor ke penulis kebijakan
vendor/device
. Penulis kebijakan non-platform tidak boleh menulis ekstensi kebijakan mereka
berdasarkan jenis/atribut/aturan yang ditentukan dalam sepolicy pribadi platform. Selain itu,
aturan ini diizinkan untuk diubah atau dapat hilang sebagai bagian dari
update khusus framework.
Pemetaan pribadi platform
Pemetaan pribadi platform mencakup pernyataan kebijakan yang memetakan atribut
yang ditampilkan dalam kebijakan publik platform dari versi platform sebelumnya ke
jenis konkret yang digunakan dalam sepolicy publik platform saat ini. Hal ini memastikan
kebijakan vendor yang ditulis berdasarkan atribut publik platform dari
versi sepolicy publik platform sebelumnya terus berfungsi. Pembuatan versi
didasarkan pada variabel build PLATFORM_SEPOLICY_VERSION
yang ditetapkan di AOSP untuk versi platform tertentu. File pemetaan terpisah ada untuk
setiap versi platform sebelumnya yang diharapkan akan menerima
kebijakan vendor dari platform ini. Untuk mengetahui detail selengkapnya, lihat
Kompatibilitas.
Android 11 dan yang lebih baru
system_ext dan sepolicy produk
Di Android 11, kebijakan system_ext dan kebijakan produk ditambahkan. Seperti sepolicy platform, kebijakan system_ext, dan kebijakan produk dibagi menjadi kebijakan publik dan kebijakan pribadi.
Kebijakan publik diekspor ke vendor. Jenis dan atribut menjadi API yang stabil, dan
kebijakan vendor dapat merujuk ke jenis dan atribut dalam kebijakan publik. Jenis diberi versi
sesuai dengan PLATFORM_SEPOLICY_VERSION
, dan kebijakan
berversi disertakan ke kebijakan vendor. Kebijakan asli disertakan ke setiap
partisi system_ext dan produk.
Kebijakan pribadi berisi jenis, izin, dan atribut khusus system_ext dan khusus produk yang diperlukan untuk fungsi partisi system_ext dan produk. Kebijakan pribadi tidak terlihat oleh vendor, yang menyiratkan bahwa aturan ini bersifat internal dan diizinkan untuk diubah.
Pemetaan system_ext dan produk
system_ext dan product diizinkan untuk mengekspor jenis publik yang ditetapkan ke vendor. Namun, tanggung jawab untuk mempertahankan kompatibilitas ada pada setiap partner. Untuk kompatibilitas, partner dapat menyediakan file pemetaan mereka sendiri yang memetakan atribut berversi dari versi sebelumnya ke jenis konkret yang digunakan dalam sepolicy publik saat ini.
- Untuk menginstal file pemetaan untuk system_ext, tempatkan file cil yang berisi
informasi pemetaan yang diinginkan ke
{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, lalu tambahkansystem_ext_{ver}.cil
kePRODUCT_PACKAGES
. - Untuk menginstal file pemetaan produk, tempatkan file cil yang berisi
informasi pemetaan yang diinginkan ke
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, lalu tambahkanproduct_{ver}.cil
kePRODUCT_PACKAGES
.
Lihat contoh yang menambahkan file pemetaan partisi produk perangkat redbull.
Kebijakan SELinux yang telah dikompilasi sebelumnya
Sebelum init
mengaktifkan SELinux, init
mengumpulkan semua file CIL dari partisi
(system
, system_ext
, product
, vendor
, dan
odm
) lalu mengompilasikannya menjadi kebijakan biner, format yang dapat dimuat ke kernel. Karena
kompilasi memerlukan waktu (biasanya 1-2 detik), file CIL dikompilasi sebelumnya pada waktu build dan
ditempatkan di /vendor/etc/selinux/precompiled_sepolicy
atau
/odm/etc/selinux/precompiled_sepolicy
, bersama dengan hash sha256 dari file CIL
input. Saat runtime, init
memeriksa apakah ada file kebijakan yang telah diperbarui dengan membandingkan
hash. Jika tidak ada yang berubah, init
akan memuat kebijakan yang telah dikompilasi sebelumnya. Jika tidak,
init
akan dikompilasi secara langsung dan menggunakannya, bukan yang telah dikompilasi sebelumnya.
Lebih khusus lagi, kebijakan yang telah dikompilasi sebelumnya digunakan jika semua kondisi berikut terpenuhi. Di sini,
{partition}
mewakili partisi tempat kebijakan yang telah dikompilasi sebelumnya berada: vendor
atau odm
.
-
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
dan/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
ada dan identik. -
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256
dan/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256
tidak ada. Atau keduanya ada dan identik. -
/product/etc/selinux/product_sepolicy_and_mapping.sha256
dan/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256
tidak ada. Atau keduanya ada dan identik.
Jika salah satunya berbeda, init
akan kembali ke jalur kompilasi di perangkat. Lihat
system/core/init/selinux.cpp
untuk mengetahui detail selengkapnya.