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, ini berbeda dari Linux sistem kontrol akses diskresi (DAC) yang sudah dikenal. Dalam sistem DAC, sebuah konsep kepemilikan, di mana pemilik sumber daya tertentu mengontrol akses izin akses yang terkait dengannya. Hal ini umumnya bersifat umum dan subjektif, terhadap eskalasi akses yang tidak diinginkan. Namun, sistem MAC berkonsultasi dengan otoritas untuk mengambil keputusan atas semua upaya akses.
SELinux telah diimplementasikan sebagai bagian dari Linux Security Module (LSM) , yang mengenali beragam objek kernel, dan tindakan sensitif yang ditampilkan. Pada titik di mana masing-masing tindakan ini akan fungsi hook LSM akan dipanggil untuk menentukan apakah tindakan harus diizinkan berdasarkan informasi untuknya yang disimpan dalam keamanan. SELinux menyediakan implementasi untuk {i>hook<i} ini dan untuk mengelola objek keamanan ini, yang digabungkan dengan kebijakannya sendiri, untuk menentukan keputusan akses.
Bersama dengan langkah keamanan Android lainnya, kontrol akses Android kebijakan ini sangat membatasi potensi kerusakan pada komputer yang disusupi dan menggunakan akun layanan. Menggunakan alat seperti akses wajib dan diskresi Android memberi Anda struktur untuk memastikan perangkat lunak Anda hanya berjalan seminimal mungkin tingkat hak istimewa yang tinggi. Hal ini mengurangi dampak serangan dan mengurangi kemungkinan proses yang salah yang menimpa atau bahkan mengirimkan data.
Di Android 4.3 dan yang lebih tinggi, SELinux menyediakan kontrol akses wajib (MAC) menaungi lingkungan kontrol akses diskresi (DAC) tradisional. Sebagai {i>instance<i}, perangkat lunak biasanya harus dijalankan sebagai akun pengguna {i>root<i} untuk menulis ke perangkat blok. Di lingkungan Linux berbasis DAC tradisional, jika pengguna {i>root<i} disusupi sehingga pengguna dapat menulis ke setiap perangkat blok mentah. Namun, SELinux dapat digunakan untuk memberi label perangkat ini sehingga proses menetapkan {i>root<i} hanya dapat menulis ke resource yang ditentukan dalam kebijakan terkait. Di sini proses tersebut tidak dapat menimpa data dan setelan sistem di luar perangkat blok mentah tertentu.
Lihat Kasus Penggunaan untuk mengetahui lebih banyak contoh ancaman dan cara mengatasinya dengan SELinux.
Tingkat penegakan kebijakan
SELinux dapat diimplementasikan dalam berbagai mode:
- Permisif - Kebijakan keamanan SELinux tidak diterapkan, hanya dicatat ke dalam log.
- Menegakkan - Kebijakan keamanan diterapkan dan dicatat dalam log. Gagal muncul sebagai error EPERM.
Pilihan ini bersifat biner dan menentukan apakah kebijakan Anda yang mengambil tindakan atau hanya memungkinkan Anda mengumpulkan potensi kegagalan. Permisif sangat berguna selama terlepas dari implementasi layanan.
Jenis, atribut, dan aturan
Android mengandalkan komponen Type Enforcement (TE) dari SELinux untuk
lebih lanjut. Ini berarti bahwa semua objek (seperti, file, proses, atau soket) memiliki
type yang terkait dengannya. Misalnya, secara {i>default<i}, sebuah aplikasi
akan memiliki jenis untrusted_app
. Untuk suatu proses, jenisnya juga
yang dikenal sebagai domain. Hal ini dimungkinkan untuk menganotasi
sebuah jenis dengan satu atau
banyak atribut. Atribut berguna untuk merujuk ke beberapa jenis
secara bersamaan.
Objek dipetakan ke class
(misalnya, file, direktori, tautan simbolis, soket) dan berbagai jenis akses
untuk setiap class diwakili oleh izin.
Misalnya, izin open
ada untuk class tersebut
file
. Sementara jenis dan atribut
diperbarui secara teratur sebagai bagian dari
kebijakan Android SELinux, izin dan kelas ditentukan secara statis
jarang diperbarui sebagai bagian
dari rilis Linux baru.
Aturan kebijakan berbentuk:
allow source target:class permissions;
dalam hal ini:
- Sumber - Jenis (atau atribut) subjek aturan. Siapa yang meminta akses?
- Target - Jenis (atau atribut) objek. Akses diminta ke mana?
- Class - Jenis objek (misalnya file, socket) yang diakses.
- Izin - Operasi (atau serangkaian operasi) (misalnya baca, tulis) yang dilakukan.
Contoh aturan adalah:
allow untrusted_app app_data_file:file { read write };
Hal ini menunjukkan bahwa aplikasi diizinkan
untuk membaca dan menulis file yang diberi label
app_data_file
. Ada jenis lain untuk aplikasi. Sebagai
, isolated_app
digunakan untuk layanan aplikasi dengan
isolatedProcess=true
dalam manifesnya. Alih-alih 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 itu akan secara otomatis diperluas ke daftar domain atau jenis yang terkait dengan . Beberapa atribut penting adalah:
domain
- atribut yang terkait dengan semua jenis proses,file_type
- atribut yang dikaitkan dengan semua jenis file.
Makro
Khususnya untuk akses file, ada banyak jenis izin akses
pertimbangkan. Misalnya, izin read
tidak cukup untuk membuka
atau panggil stat
di dalamnya. Untuk menyederhanakan definisi aturan, Android
menyediakan kumpulan makro untuk menangani kasus yang paling umum. Misalnya, untuk
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 global_macros
dan te_macros
untuk melihat lebih banyak contoh
tentang makro yang berguna. Makro harus digunakan jika memungkinkan
untuk membantu mengurangi kemungkinan
kegagalan akibat penolakan pada
izin akses.
Setelah ditentukan, jenis perlu dikaitkan dengan file atau proses yang diwakilinya. Lihat Mengimplementasikan SELinux untuk detail lebih lanjut tentang bagaimana asosiasi ini dilakukan. Untuk informasi selengkapnya tentang aturan, lihat Notebook SELinux.
Konteks dan Kategori Keamanan
Saat melakukan debug pada kebijakan SELinux atau memberi label file (melalui
file_contexts
atau saat menghubungi ls -Z
), Anda mungkin datang
di seluruh konteks keamanan (juga dikenal sebagai label). Sebagai
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 Kekhususan). type
dijelaskan di bagian sebelumnya. categories
adalah bagian dari
kebijakan Multi-Level Security (MLS)
di SELinux. Sejak Android S, kategori digunakan untuk:
- Isolasi data aplikasi dari akses aplikasi lain,
- Pisahkan data aplikasi dari satu pengguna fisik ke pengguna fisik lainnya.
Kekhususan
Android tidak menggunakan semua fitur yang disediakan oleh SELinux. Saat membaca dokumentasi eksternal, ingatlah hal-hal berikut:
- Sebagian besar kebijakan dalam AOSP ditentukan menggunakan Bahasa Kebijakan Kernel. Ada beberapa pengecualian terkait penggunaan Common Intermediate Language (CIL).
- Pengguna SELinux tidak digunakan. Satu-satunya yang
ditentukan pengguna adalah
u
Jika perlu, pengguna fisik akan diwakili menggunakan kolom kategori dalam konteks keamanan. - roles SELinux dan Role-Based Access Control (RBAC) tidak digunakan. Dua peran default telah ditetapkan dan digunakan:
r
untuk subjek danobject_r
untuk objek. - Sensitivitas SELinux tidak digunakan. Sensitivitas
s0
default selalu ditetapkan. - Boolean SELinux tidak digunakan. Setelah kebijakan dibuat untuk perangkat, kebijakan tidak bergantung pada status perangkat. Hal ini menyederhanakan audit dan {i>debugging<i} terhadap kebijakan.