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 discretionary access control (DAC) Linux yang sudah dikenal. Dalam sistem DAC, ada konsep kepemilikan, dengan 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 implementasi 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 opsional Android memberi Anda struktur untuk memastikan software Anda hanya berjalan pada tingkat hak istimewa minimum. Hal ini mengurangi efek serangan dan mengurangi kemungkinan proses yang salah menimpa atau bahkan mengirimkan data.
Di Android 4.3 dan yang lebih tinggi, SELinux menyediakan payung kontrol akses wajib (MAC) di atas lingkungan kontrol akses diskresional (DAC) tradisional. Misalnya, software biasanya harus berjalan sebagai akun pengguna root untuk menulis ke perangkat blok mentah. Dalam lingkungan Linux berbasis DAC tradisional, jika pengguna root telah 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 istimewa root hanya dapat menulis 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 dan cara mengatasinya dengan SELinux.
Tingkat penerapan
SELinux dapat diterapkan dalam berbagai mode:
- Permissive - Kebijakan keamanan SELinux tidak diterapkan, hanya dicatat dalam log.
- Menerapkan - Kebijakan keamanan diterapkan dan dicatat ke dalam log. Kegagalan akan muncul sebagai error EPERM.
Pilihan ini bersifat biner dan menentukan apakah kebijakan Anda akan mengambil tindakan atau hanya memungkinkan Anda mengumpulkan potensi kegagalan. Izin sangat berguna selama penerapan.
Jenis, atribut, dan aturan
Android mengandalkan komponen Penerapan Jenis (TE) dari 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 menganotasi 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 memiliki bentuk:
allow source target:class permissions;
dengan:
- Sumber - Jenis (atau atribut) subjek aturan. Siapa yang meminta akses?
- Target - Jenis (atau atribut) objek. Untuk apa akses diminta?
- Class - Jenis objek (misalnya, file, soket) yang diakses.
- Izin - Operasi (atau serangkaian operasi) (misalnya, baca, tulis) yang dilakukan.
Contoh aturan adalah:
allow untrusted_app app_data_file:file { read write };
Ini menunjukkan bahwa aplikasi diizinkan untuk membaca dan menulis file berlabel
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 tersebut, 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 yang 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 kumpulan 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 mengetahui contoh makro berguna lainnya. Makro harus digunakan jika memungkinkan
untuk membantu mengurangi kemungkinan kegagalan karena penolakan izin
terkait.
Setelah ditentukan, jenis harus dikaitkan dengan file atau proses yang diwakilinya. Lihat Mengimplementasikan SELinux untuk mengetahui detail selengkapnya tentang cara atribusi ini dilakukan. Untuk 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 menggunakan ls -Z
), Anda mungkin menemukan
konteks keamanan (juga dikenal sebagai label). Misalnya:
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 Kekhususan). Kolom type
dijelaskan di bagian sebelumnya. categories
adalah bagian dari
dukungan Multi-Level Security (MLS)
di SELinux. Di Android 12 dan yang lebih baru, kategori digunakan untuk:
- Mengisolasi data aplikasi dari akses oleh aplikasi lain,
- Isolasi 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 yang ditentukan pengguna adalah
u
. Jika diperlukan, pengguna fisik direpresentasikan menggunakan kolom kategori dari konteks keamanan. - Peran SELinux dan Kontrol Akses Berbasis Peran (RBAC) tidak digunakan. Dua peran default ditentukan dan digunakan:
r
untuk subjek danobject_r
untuk objek. - Sensitivitas SELinux tidak digunakan. Sensitivitas
s0
default selalu ditetapkan. - Boolean SELinux tidak digunakan. Saat dibuat untuk perangkat, kebijakan tidak bergantung pada status perangkat. Hal ini menyederhanakan audit dan proses debug kebijakan.