Membedah tiga mode SELinux — enforcing, permissive, dan disabled — beserta cara berpindah antar mode secara aman lewat runtime, parameter kernel, dan konfigurasi /etc/selinux/config. Ditutup dengan praktik membaca log AVC untuk mendiagnosis denial menggunakan ausearch.

Di episode 2 kita membangun bahasa dasar SELinux: domain, type, security context, dan arsitektur. Sekarang saatnya mempraktikkannya di terminal. Episode ini akan membahas tiga mode SELinux, bagaimana berpindah antar mode dengan aman dan sadar konsekuensi, serta troubleshooting dasar — membaca dan mendiagnosis denial pertama kalian.
Ini episode yang paling sering menyelamatkan kalian di dunia nyata. Mayoritas pertanyaan "kenapa aplikasi saya tidak bisa baca file?" di server production, jawabannya ada di sini: mode yang salah atau denial yang tidak dibaca.
SELinux memiliki tiga mode yang menentukan bagaimana policy diperlakukan:
| Mode | Perilaku | Log AVC |
|---|---|---|
| Enforcing | Policy ditegakkan — akses terlarang diblokir | Dicatat |
| Permissive | Policy tidak ditegakkan — akses terlarang diizinkan | Dicatat |
| Disabled | Policy tidak dimuat — SELinux mati total | Tidak dicatat |
Cara termudah memahaminya: permissive itu rehearsal tanpa konsekuensi — sistem mencatat apa yang akan diblokir seandainya enforcing, tapi tetap membiarkan semuanya berjalan. Itulah mengapa permissive adalah alat debugging yang sangat berharga: kalian bisa melihat semua denial tanpa memutus akses aplikasi.
Di mode disabled, kernel sama sekali tidak memuat policy — seluruh fitur SELinux nonaktif. Perlu diingat: mode ini bukan "lebih santai daripada permissive", melainkan memutus seluruh perlindungan dan tidak bisa diubah tanpa reboot.
Warning
Jangan pernah menjadikan disabled sebagai solusi rutin. Menonaktifkan SELinux di server production menghapus seluruh lapisan MAC yang sudah kalian pelajari — dan beberapa aplikasi serta skrip kepatuhan justru mendeteksi ini dan menolak berjalan. Biarkan SELinux tetap enforcing; jika ada masalah, gunakan permissive hanya saat debugging.
Ada tiga mekanisme berpindah mode, dan kalian wajib paham perbedaannya — ini sering menjadi titik uji pemahaman.
setenforce mengubah mode tanpa reboot, tapi hanya berlaku sampai sistem di-restart:
sudo setenforce 0
sudo setenforce 1setenforce 0 berpindah ke permissive, setenforce 1 kembali ke enforcing. Perintah ini juga menerima argumen Permissive dan Enforcing. Catatan penting: dari mode disabled, setenforce tidak bisa menyalakan SELinux — policy belum dimuat di kernel.
Mode bisa ditentukan saat boot lewat parameter kernel enforcing=0 (atau selinux=0 untuk menonaktifkan total). Mekanisme ini berguna untuk sistem yang tidak bisa boot karena policy yang bermasalah, misalnya lewat prompt GRUB. Efeknya bertahan sampai boot berikutnya.
Untuk mengubah mode secara permanen, edit file /etc/selinux/config:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targetedBaris SELINUX= menentukan mode default saat boot. Perhatikan: perubahan ke disabled hanya berlaku setelah reboot — begitu pula dari disabled kembali ke enforcing. Sedangkan perubahan ke atau dari permissive berlaku di runtime juga. Jadi kalau kalian mengubah ke permissive, mode langsung berubah tanpa restart.
Ringkasan cepat perbedaannya:
| Mekanisme | Berlaku | Butuh Reboot | Contoh |
|---|---|---|---|
setenforce 0 | Runtime | Tidak | Debugging sementara |
enforcing=0 (kernel param) | Boot | Ya (di boot berikutnya) | Sistem tidak bisa boot |
SELINUX=disabled | Permanen | Ya | Menonaktifkan total |
Dua perintah untuk melihat kondisi sistem saat ini:
getenforceOutput berupa satu kata: Enforcing, Permissive, atau Disabled. Untuk detail lebih lengkap, gunakan sestatus yang sudah kita kenal di episode 0 — ia menampilkan mode saat ini, mode dari file konfigurasi, dan policy yang dimuat. Perbedaan keduanya: getenforce cepat dan singkat untuk scripting, sestatus lengkap untuk diagnosis.
Denial SELinux dicatat di log audit. Jika service auditd berjalan (kita aktifkan di episode 0), log ada di /var/log/audit/audit.log. Jika tidak, pesan muncul di journald dan bisa dilihat dengan journalctl.
Untuk mencari semua denial AVC, jalankan ausearch -m avc -ts recent:
sudo ausearch -m avc -ts recentOutputnya berupa baris AVC seperti yang kita lihat di episode 1. Ini pola membaca yang akan kalian pakai berulang kali:
type=AVC msg=audit(1754256000.123:456): avc: denied { read } for pid=1234 comm="nginx" name="index.html" dev="sda1" ino=5678 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:user_home_t:s0 tclass=fileBaca dari bagian yang paling informatif:
avc: denied { read } — operasi apa yang ditolak (dalam hal ini: baca).comm="nginx" — perintah/proses yang mencoba akses.scontext=...httpd_t:s0 — domain (subjek) yang mencoba.tcontext=...user_home_t:s0 — type (objek) yang dituju.tclass=file — kelas objek (file, dir, tcp_socket, dan seterusnya).Terjemahan bebas baris di atas: "proses nginx dalam domain httpd_t ditolak membaca file berlabel user_home_t". Dari sini diagnosa dimulai: apakah label objeknya salah (perlu restorecon — episode 4), atau apakah memang perlu aturan baru (audit2allow — episode lanjutan).
Tip
Waktu (timestamp) adalah sahabatmu. Saat memecahkan masalah, catat kapan error terjadi, lalu cari denial AVC pada rentang waktu tersebut dengan ausearch -m avc -ts 12:30:00. Jangan membaca seluruh log — saring dulu berdasarkan waktu dan proses (comm) yang bermasalah.
Pada episode 3 ini kita telah menguasai tiga mode SELinux — enforcing (ditegakkan), permissive (dicatat tapi dibiarkan), dan disabled (mati total) — beserta tiga mekanisme berpindah mode: setenforce (runtime), parameter kernel enforcing=0, dan /etc/selinux/config (permanen). Kita juga belajar membaca denial pertama dari /var/log/audit/audit.log dengan ausearch.
Inti yang harus kalian bawa:
setenforce 0 berlaku sampai reboot; SELINUX=disabled butuh reboot dan tidak bisa dibalik di runtime.getenforce untuk status singkat; sestatus untuk detail lengkap.scontext, tcontext, tclass, dan operasi yang ditolak.Di episode 4 selanjutnya, kita akan membahas labeling & filesystem context — melihat konteks dengan ls -Z dan stat -Z, mengubahnya sementara dengan chcon, memetakannya secara permanen dengan semanage fcontext, memulihkannya dengan restorecon, hingga relabeling penuh dengan fixfiles. Pastikan tetap semangat, karena keterampilan episode inilah yang paling sering menyelamatkan kalian di produksi!