Tinjau halaman ini untuk memahami konsep SELinux.
Kontrol akses wajib
Security Enhanced Linux (SELinux) adalah sistem kontrol akses wajib (MAC) untuk sistem operasi Linux. Sebagai sistem MAC, sistem ini berbeda dengan sistem kontrol akses diskresioner (DAC) Linux yang sudah dikenal. Dalam sistem DAC, konsep kepemilikan ada, di mana pemilik resource tertentu mengontrol izin akses yang terkait dengannya. Hal ini umumnya bersifat kasar dan dapat menyebabkan eskalasi hak istimewa yang tidak diinginkan. Namun, sistem MAC berkonsultasi dengan otoritas pusat untuk mengambil keputusan terkait semua upaya akses.
SELinux telah diimplementasikan sebagai bagian dari framework Modul Keamanan Linux (LSM), yang mengenali berbagai objek kernel, dan tindakan sensitif yang dilakukan pada objek tersebut. Pada saat setiap tindakan ini akan dilakukan, fungsi hook LSM dipanggil untuk menentukan apakah tindakan tersebut harus diizinkan atau tidak berdasarkan informasi yang disimpan dalam objek keamanan buram. SELinux menyediakan penerapan untuk hook ini dan pengelolaan objek keamanan ini, yang digabungkan dengan kebijakannya sendiri, untuk menentukan keputusan akses.
Bersama dengan langkah-langkah keamanan Android lainnya, kebijakan kontrol akses Android sangat membatasi potensi kerusakan mesin dan akun yang disusupi. Menggunakan alat seperti kontrol akses wajib dan diskresioner Android memberi Anda struktur untuk memastikan software Anda hanya berjalan pada tingkat hak istimewa minimum. Tindakan ini mengurangi efek serangan dan mengurangi kemungkinan proses yang salah menulis ulang atau bahkan mengirimkan data.
Di Android 4.3 dan yang lebih tinggi, SELinux menyediakan kontrol akses wajib (MAC) yang mencakup lingkungan kontrol akses diskresioner (DAC) tradisional. Misalnya, software biasanya harus dijalankan sebagai akun pengguna root untuk menulis ke perangkat blok mentah. Di lingkungan Linux berbasis DAC tradisional, jika pengguna root disusupi, pengguna tersebut dapat menulis ke setiap perangkat blok mentah. Namun, SELinux dapat digunakan untuk memberi label pada perangkat ini sehingga proses yang diberi hak akses root dapat menulis hanya ke perangkat yang ditentukan dalam kebijakan terkait. Dengan cara ini, proses tidak dapat menimpa data dan setelan sistem di luar perangkat blok mentah tertentu.
Lihat Kasus Penggunaan untuk mengetahui contoh ancaman lainnya dan cara menanganinya dengan SELinux.
Tingkat penegakan
SELinux dapat diterapkan dalam berbagai mode:
- Permissive - Kebijakan keamanan SELinux tidak diterapkan, hanya dicatat.
- Menerapkan - Kebijakan keamanan diterapkan dan dicatat. Kegagalan muncul sebagai error EPERM.
Pilihan ini bersifat biner dan menentukan apakah kebijakan Anda mengambil tindakan atau hanya memungkinkan Anda mengumpulkan potensi kegagalan. Permisif sangat berguna selama penerapan.
Jenis, atribut, dan aturan
Android mengandalkan komponen Penerapan Jenis (TE) SELinux untuk
kebijakannya. Artinya, semua objek (seperti, file, proses, atau soket) memiliki
jenis yang terkait dengannya. Misalnya, secara default, aplikasi
memiliki jenis untrusted_app
. Untuk proses, jenisnya juga dikenal sebagai domain. Anda dapat memberi anotasi pada jenis dengan satu atau
beberapa atribut. Atribut berguna untuk merujuk ke beberapa jenis
secara bersamaan.
Objek dipetakan ke class
(misalnya, file, direktori, link simbolis, soket) dan berbagai jenis akses
untuk setiap class diwakili oleh izin.
Misalnya, izin open
ada untuk class
file
. Meskipun jenis dan atribut diperbarui secara rutin sebagai bagian dari kebijakan SELinux Android, izin dan class ditentukan secara statis dan jarang diperbarui sebagai bagian dari rilis Linux baru.
Aturan kebijakan berbentuk:
allow source target:class permissions;
dengan:
- Sumber - Jenis (atau atribut) subjek aturan. Siapa yang meminta akses?
- Target - Jenis (atau atribut) objek. Akses diminta ke mana?
- Class - Jenis objek (misalnya, file, soket) yang diakses.
- Izin - Operasi (atau serangkaian operasi) (misalnya, baca, tulis) yang sedang dilakukan.
Contoh aturan adalah:
allow untrusted_app app_data_file:file { read write };
Hal ini menyatakan bahwa aplikasi diizinkan untuk membaca dan menulis file yang diberi label
app_data_file
. Ada jenis lain untuk aplikasi. Misalnya, isolated_app
digunakan untuk layanan aplikasi dengan
isolatedProcess=true
dalam manifesnya. Daripada mengulangi
aturan untuk kedua jenis, Android menggunakan atribut bernama appdomain
untuk semua jenis yang mencakup aplikasi:
# Associate the attribute appdomain with the type untrusted_app. typeattribute untrusted_app appdomain; # Associate the attribute appdomain with the type isolated_app. typeattribute isolated_app appdomain; allow appdomain app_data_file:file { read write };
Saat aturan ditulis yang menentukan nama atribut, nama tersebut akan otomatis diperluas ke daftar domain atau jenis yang terkait dengan atribut. Beberapa atribut penting adalah:
domain
- atribut yang terkait dengan semua jenis proses,file_type
- atribut yang terkait dengan semua jenis file.
Makro
Khusus untuk akses file, ada banyak jenis izin yang perlu dipertimbangkan. Misalnya, izin read
tidak cukup untuk membuka
file atau memanggil stat
di dalamnya. Untuk menyederhanakan definisi aturan, Android menyediakan serangkaian makro untuk menangani kasus yang paling umum. Misalnya, untuk menyertakan izin yang tidak ada seperti open
, aturan di atas dapat ditulis ulang sebagai:
allow appdomain app_data_file:file rw_file_perms;
Lihat file global_macros
dan te_macros
untuk contoh makro berguna lainnya. Makro harus digunakan jika memungkinkan
untuk membantu mengurangi kemungkinan kegagalan karena penolakan pada izin
terkait.
Setelah jenis ditentukan, jenis tersebut harus dikaitkan dengan file atau proses yang diwakilinya. Lihat Mengimplementasikan SELinux untuk mengetahui detail selengkapnya tentang cara pengaitan ini dilakukan. Untuk mengetahui informasi selengkapnya tentang aturan, lihat Notebook SELinux.
Konteks dan kategori keamanan
Saat men-debug kebijakan SELinux atau memberi label pada file (menggunakan
file_contexts
atau saat ls -Z
), Anda mungkin menemukan
konteks keamanan (juga dikenal sebagai label). Contoh:
u:r:untrusted_app:s0:c15,c256,c513,c768
. Konteks keamanan memiliki format:
user:role:type:sensitivity[:categories]
. Anda biasanya dapat mengabaikan kolom user
, role
, dan sensitivity
dari konteks (lihat Spesifisitas). Kolom type
dijelaskan di bagian sebelumnya. categories
adalah bagian dari dukungan Multi-Level Security (MLS) di SELinux. Di Android 12 dan yang lebih tinggi, kategori digunakan untuk:
- Mengisolasi data aplikasi dari akses oleh aplikasi lain,
- Mengisolasi data aplikasi dari satu pengguna fisik ke pengguna fisik lainnya.
Kekhususan
Android tidak menggunakan semua fitur yang disediakan oleh SELinux. Saat membaca dokumentasi eksternal, perhatikan poin-poin berikut:
- Sebagian besar kebijakan di AOSP ditentukan menggunakan Kernel Policy Language. Ada beberapa pengecualian untuk menggunakan Common Intermediate Language (CIL).
- Pengguna SELinux tidak digunakan. Satu-satunya pengguna yang ditentukan adalah
u
. Jika perlu, pengguna fisik diwakili menggunakan kolom kategori konteks keamanan. - Peran SELinux dan Role-Based Access Control (RBAC) tidak digunakan. Dua peran default ditentukan dan digunakan:
r
untuk subjek danobject_r
untuk objek. - Sensitivitas SELinux tidak digunakan. Sensitivitas
s0
default selalu disetel. - Boolean SELinux tidak digunakan. Saat kebijakan dibuat untuk perangkat, kebijakan tersebut tidak bergantung pada status perangkat. Hal ini menyederhanakan audit dan proses debug kebijakan.