Konsep SELinux

Tinjau halaman ini untuk mengenal konsep SELinux.

Kontrol akses wajib

Security Enhanced Linux (SELinux), adalah sistem kontrol akses wajib (MAC) untuk sistem operasi Linux. Sebagai sistem MAC, ini berbeda dari sistem kontrol akses diskresioner (DAC) yang lazim di Linux. Dalam sistem DAC, terdapat konsep kepemilikan, dimana pemilik sumber daya tertentu mengontrol izin akses yang terkait dengannya. Hal ini umumnya bersifat kasar dan dapat menyebabkan peningkatan hak istimewa yang tidak disengaja. Namun, sistem MAC berkonsultasi dengan otoritas pusat untuk mengambil keputusan mengenai semua upaya akses.

SELinux telah diimplementasikan sebagai bagian dari kerangka Modul Keamanan Linux (LSM), yang mengenali berbagai objek kernel, dan tindakan sensitif yang dilakukan pada objek tersebut. Pada titik di mana setiap tindakan ini akan dilakukan, fungsi kait LSM dipanggil untuk menentukan apakah tindakan tersebut diperbolehkan atau tidak berdasarkan informasi yang disimpan dalam objek keamanan buram. SELinux menyediakan implementasi untuk kaitan ini dan pengelolaan objek keamanan ini, yang digabungkan dengan kebijakannya sendiri, untuk menentukan keputusan akses.

Bersamaan dengan langkah-langkah keamanan Android lainnya, kebijakan kontrol akses Android sangat membatasi potensi kerusakan mesin dan akun yang disusupi. Menggunakan alat seperti kontrol akses diskresi dan wajib Android memberi Anda struktur untuk memastikan perangkat lunak Anda hanya berjalan pada tingkat hak istimewa minimum. Hal ini mengurangi dampak serangan dan mengurangi kemungkinan proses yang salah menimpa atau bahkan mengirimkan data.

Di Android 4.3 dan lebih tinggi, SELinux menyediakan payung kontrol akses wajib (MAC) atas lingkungan kontrol akses diskresioner (DAC) tradisional. Misalnya, perangkat lunak biasanya harus dijalankan sebagai akun pengguna root untuk menulis ke perangkat blok mentah. Dalam lingkungan Linux berbasis DAC tradisional, jika pengguna root disusupi, pengguna dapat menulis ke setiap perangkat blok mentah. Namun, SELinux dapat digunakan untuk memberi label pada perangkat ini sehingga proses yang diberi hak akses root hanya dapat menulis ke perangkat yang ditentukan dalam kebijakan terkait. Dengan cara ini, proses tidak dapat menimpa data dan pengaturan sistem di luar perangkat blok mentah tertentu.

Lihat Kasus Penggunaan untuk contoh ancaman lainnya dan cara mengatasinya dengan SELinux.

Tingkat penegakan hukum

SELinux dapat diimplementasikan dalam berbagai mode:

  • Permisif - Kebijakan keamanan SELinux tidak diterapkan, hanya dicatat.
  • Penegakan - Kebijakan keamanan diterapkan dan dicatat. Kegagalan muncul sebagai kesalahan EPERM.

Pilihan ini bersifat biner dan menentukan apakah kebijakan Anda mengambil tindakan atau hanya memungkinkan Anda mengumpulkan potensi kegagalan. Permisif 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 tipe yang terkait dengannya. Misalnya, secara default, aplikasi akan memiliki tipe untrusted_app . Untuk suatu proses, tipenya juga dikenal sebagai domainnya . Dimungkinkan untuk memberi anotasi pada suatu tipe dengan satu atau banyak atribut . Atribut berguna untuk merujuk ke beberapa tipe sekaligus.

Objek dipetakan ke kelas (misalnya, file, direktori, link simbolik, soket) dan berbagai jenis akses untuk setiap kelas diwakili oleh izin . Misalnya, izin open ada untuk file kelas. Meskipun tipe dan atribut diperbarui secara rutin sebagai bagian dari kebijakan SELinux Android, izin dan kelas ditentukan secara statis dan jarang diperbarui sebagai bagian dari rilis Linux baru.

Aturan kebijakan hadir dalam bentuk: allow source target : class permissions ; Di mana:

  • Sumber - Jenis (atau atribut) subjek aturan. Siapa yang meminta akses?
  • Target - Jenis (atau atribut) objek. Akses apa yang diminta?
  • Kelas - Jenis objek (misalnya file, soket) yang sedang diakses.
  • Izin - Operasi (atau serangkaian operasi) (misalnya membaca, menulis) yang sedang dilakukan.

Contoh aturannya adalah:

allow untrusted_app app_data_file:file { read write };

Ini menyatakan bahwa aplikasi diizinkan membaca dan menulis file berlabel app_data_file . Ada tipe 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 };

Ketika aturan ditulis yang menentukan nama atribut, nama tersebut secara otomatis diperluas ke daftar domain atau tipe 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

Khususnya 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 sekumpulan makro untuk menangani kasus paling umum. Misalnya, untuk menyertakan izin yang hilang seperti open , aturan di atas dapat ditulis ulang menjadi:

allow appdomain app_data_file:file rw_file_perms;

Lihat file global_macros dan te_macros untuk mengetahui lebih banyak contoh makro yang berguna. Makro harus digunakan bila memungkinkan untuk membantu mengurangi kemungkinan kegagalan karena penolakan izin terkait.

Setelah suatu tipe ditentukan, tipe tersebut perlu dikaitkan dengan file atau proses yang diwakilinya. Lihat Menerapkan SELinux untuk rincian lebih lanjut tentang bagaimana asosiasi ini dilakukan. Untuk informasi lebih lanjut mengenai aturan, lihat Notebook SELinux .

Konteks dan Kategori Keamanan

Saat men-debug kebijakan SELinux atau memberi label pada file (melalui 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 bidang user , role , dan sensitivity suatu konteks (lihat Kekhususan ). Bidang type dijelaskan di bagian sebelumnya. categories adalah bagian dari dukungan Multi-Level Security (MLS) di SELinux. Sejak Android S, kategori digunakan untuk:

  • Pisahkan data aplikasi dari akses aplikasi lain,
  • Pisahkan data aplikasi dari satu pengguna fisik ke pengguna lainnya.

Kekhususan

Android tidak menggunakan semua fitur yang disediakan SELinux. Saat membaca dokumentasi eksternal, ingatlah hal-hal berikut:

  • Mayoritas kebijakan di AOSP didefinisikan menggunakan Bahasa Kebijakan Kernel. Ada beberapa pengecualian untuk menggunakan Common Intermediate Language (CIL).
  • Pengguna SELinux tidak digunakan. Satu-satunya yang ditentukan pengguna adalah u . Bila diperlukan, pengguna fisik diwakili menggunakan bidang kategori konteks keamanan.
  • Peran SELinux dan Kontrol Akses Berbasis Peran (RBAC) tidak digunakan. Dua peran default didefinisikan dan digunakan: r untuk subjek dan object_r untuk objek.
  • Sensitivitas SELinux tidak digunakan. Sensitivitas s0 default selalu disetel.
  • Boolean SELinux tidak digunakan. Setelah kebijakan dibuat untuk suatu perangkat, kebijakan tersebut tidak bergantung pada status perangkat tersebut. Hal ini menyederhanakan audit dan debugging kebijakan.