Konsep SELinux

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 dan object_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.