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 kontrol akses diskresioner (DAC) yang umum digunakan di Linux. Dalam sistem DAC, ada konsep kepemilikan, yang mana pemilik resource tertentu mengontrol izin akses yang terkait dengannya. Hal ini umumnya bersifat kasar dan dapat mengalami eskalasi hak istimewa yang tidak diinginkan. Namun, sistem MAC akan meminta pendapat otoritas pusat untuk mengambil keputusan terkait semua upaya akses.

SELinux telah diimplementasikan sebagai bagian dari framework Linux Security Module (LSM), yang mengenali berbagai objek kernel, dan tindakan sensitif yang dilakukan pada objek tersebut. Pada saat setiap tindakan ini akan dilakukan, fungsi hook LSM akan dipanggil untuk menentukan apakah tindakan tersebut harus diizinkan atau tidak berdasarkan informasi yang tersimpan dalam objek keamanan buram. SELinux menyediakan implementasi untuk hook ini dan pengelolaan objek keamanan ini, yang digabungkan dengan kebijakan SELinux sendiri, untuk menentukan keputusan akses.

Bersama dengan langkah-langkah keamanan Android lainnya, kebijakan kontrol akses Android sangat membatasi potensi kerusakan pada mesin dan akun yang diretas. Dengan menggunakan alat seperti kontrol akses diskresioner dan wajib Android, Anda akan memiliki struktur untuk memastikan software Anda hanya berjalan pada tingkat hak istimewa minimum. Hal ini akan mengurangi efek serangan dan mengurangi kemungkinan proses yang salah menimpa atau bahkan mengirimkan data.

Di Android 4.3 dan yang lebih baru, SELinux menyediakan kontrol akses wajib (MAC) yang mencakup lingkungan kontrol akses diskresioner (DAC) tradisional. Misalnya, software biasanya harus berjalan sebagai akun pengguna root untuk menulis ke perangkat blok mentah. Di lingkungan Linux berbasis DAC tradisional, jika pengguna root diretas, 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 diimplementasikan dalam berbagai mode:

  • Permissive - Kebijakan keamanan SELinux tidak diterapkan, hanya dicatat.
  • Menerapkan - Kebijakan keamanan diterapkan dan dicatat. 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. Mode permissive sangat berguna selama implementasi.

Jenis, atribut, dan aturan

Android mengandalkan komponen Type Enforcement (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 menganotasi jenis dengan satu atau beberapa atribut. Atribut berguna untuk merujuk ke beberapa jenis pada saat yang sama.

Objek dipetakan ke class (misalnya, file, direktori, link simbolis, soket) dan berbagai jenis akses untuk setiap class direpresentasikan 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 ke apa yang diminta?
  • Class - Jenis objek (misalnya, file, soket) yang diakses.
  • Izin - Operasi (atau kumpulan operasi) (misalnya, baca, tulis) yang dilakukan.

Contoh aturan adalah:

allow untrusted_app app_data_file:file { read write };

Aturan 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 mengulang 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 tersebut. 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 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 pada izin terkait.

Setelah jenis ditentukan, jenis tersebut harus dikaitkan dengan file atau proses yang direpresentasikannya. Lihat Mengimplementasikan SELinux untuk mengetahui detail selengkapnya tentang cara melakukan pengaitan ini. Untuk mengetahui informasi lebih lanjut tentang aturan, lihat Notebook SELinux.

Konteks dan kategori keamanan

Saat melakukan proses debug kebijakan SELinux atau memberi label pada file (menggunakan file_contexts atau 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,
  • 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 Bahasa Kebijakan Kernel. Ada beberapa pengecualian untuk menggunakan Common Intermediate Language (CIL).
  • Pengguna SELinux tidak digunakan. Satu-satunya pengguna yang ditentukan adalah u. Jika perlu, pengguna fisik direpresentasikan menggunakan kolom kategori 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 kebijakan dibuat untuk perangkat, kebijakan tersebut tidak bergantung pada status perangkat. Hal ini menyederhanakan audit dan proses debug kebijakan.