Menguasai workflow debugging denial SELinux: membaca deny log dengan ausearch, menerjemahkannya menjadi aturan policy dengan audit2allow, membuat dan menginstall modul policy lokal, plus best practice agar tidak terjebak generate policy secara buta.

Di episode 6, kalian belajar memakai boolean untuk menyelesaikan denial tanpa menyentuh policy. Namun tidak semua denial punya boolean. Kadang aplikasi kalian benar-benar membutuhkan hak yang belum diizinkan policy bawaan — misalnya membaca file log dengan format khusus, atau mengakses device tertentu.
Untuk kasus seperti ini, SELinux menyediakan alat yang sangat ampuh sekaligus berbahaya: audit2allow. Alat ini membaca log audit dan menerjemahkan denial menjadi aturan policy yang bisa langsung dipakai. Menariknya, alat ini justru akan membuat kalian lupa cara "membaca" denial — oleh karena itu episode ini fokus pada workflow yang benar, bukan sekadar menyalakan mesin generate.
Sebelum menyentuh audit2allow, pastikan proses debugging mengikuti urutan yang disiplin. Melewatkan satu langkah membuat kalian menganalisis data yang salah:
ausearch atau grep.Important
Langkah 5 adalah pembeda antara engineer yang paham SELinux dan yang sekadar "menembak". Jika sebuah boolean sudah mengizinkan perilaku itu, jangan generate module. Modul policy adalah pilihan terakhir, bukan pertama — setiap aturan allow yang kalian tambahkan memperluas permukaan serangan satu domain.
Log audit adalah sumber kebenaran. Perintah pertama yang harus kalian kuasai:
sudo ausearch -m AVC -ts recentHasilnya kira-kira seperti ini:
type=AVC msg=audit(1710000000.123:456): avc: denied { read } for pid=1234
comm="httpd" name="index.html" dev="sda1" ino=5678
scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:var_log_t:s0 tclass=file permissive=0Inilah "polisi report"-nya SELinux, dan ada lima elemen yang wajib dibaca:
scontext adalah subjek — domain proses yang mencoba akses, di sini httpd_t.tcontext adalah objek — label file atau resource yang dituju, di sini var_log_t.tclass adalah jenis objek — file, dir, tcp_socket, dan seterusnya.{ read } adalah izin yang diminta.permissive=0 menegaskan bahwa akses ini benar-benar diblokir, bukan sekadar dicatat.Untuk memfilter denial milik satu proses, tambahkan flag -c dengan nama command, misalnya ausearch -m AVC -c httpd. Biasakan memfilter — log audit server produksi bisa berisi ribuan denial yang tidak relevan dengan masalah kalian.
Setelah memahami denial, saatnya meminta saran aturan. Jalankan audit2allow -a untuk membaca seluruh log audit dan menghasilkan aturan yang diusulkan:
sudo audit2allow -aJika log kalian hanya berisi denial di atas, keluarannya akan terlihat seperti ini:
#============= httpd_t ==============
allow httpd_t var_log_t:file read;
allow httpd_t var_log_t:file open;Perhatikan: audit2allow hanya menerjemahkan denial menjadi aturan allow satu-ke-satu. Ia tidak tahu konteks bisnis kalian. Bagi mesin ini, membaca file var_log_t adalah "perlu" — padahal secara keamanan, mengizinkan httpd membaca semua file log sistem adalah ide yang buruk. Di sinilah pemahaman kalian atas langkah 4 menentukan kualitas output.
Setelah puas dengan aturan yang diusulkan, generate module dengan flag -M:
sudo audit2allow -a -M myhttpdPerintah ini menghasilkan dua file: myhttpd.te (sumber policy dalam format Type Enforcement) dan myhttpd.pp (paket policy terkompilasi). Ini isi myhttpd.te:
module myhttpd 1.0;
require {
type httpd_t;
type var_log_t;
class file { read open };
}
allow httpd_t var_log_t:file { read open };Instal modul ke policy aktif dengan semodule -i, lalu verifikasi dan uji:
sudo semodule -i myhttpd.pp
sudo semodule -l | grep myhttpdJika ternyata tidak dibutuhkan, hapus dengan semodule -r myhttpd. Menghapus lebih mudah daripada mengedit — jadi jangan ragu mencoba dan membersihkan.
Modul policy lokal adalah alat yang sah, tetapi salah pakai bisa merusak keamanan sistem. Patuhi prinsip berikut:
allow, jangan install.semanage fcontext, bukan dengan memberi domain akses ke seluruh tipe objek.var_log_t dipakai semua file log sistem. Mengizinkan httpd_t membaca var_log_t berarti mengizinkan membaca log audit juga. Lebih aman melabeli direktori log khusus aplikasi dengan tipe baru, lalu mengizinkan akses ke tipe itu saja.-D menghasilkan aturan dontaudit untuk meredam noise. Terlalu banyak dontaudit justru menutupi tanda-tanda serangan nyata — denial yang tadinya bisa menjadi indikator kompromi jadi tak terlihat.Warning
Jangan pernah menjalankan audit2allow -a -M di server produksi yang sudah lama berjalan tanpa memfilter terlebih dahulu. Log audit yang berisi berbulan-bulan denial akan menghasilkan modul raksasa yang mengizinkan segala macam kombinasi domain dan objek — persis kebalikan dari yang diinginkan SELinux. Selalu filter dengan ausearch -c atau -ua agar hanya denial dari satu subjek yang di-generate.
Pada episode 7 ini kalian sudah memegang workflow debugging denial yang benar: membaca record AVC dengan ausearch dan memahami lima elemen pentingnya, meminta saran aturan dengan audit2allow -a, membuat modul dengan audit2allow -M, menginstall dengan semodule -i, serta prinsip agar tidak generate policy secara buta.
Kunci yang harus dibawa pulang:
Sejauh ini kita berbicara tentang proses dan domain — belum tentang manusia yang login ke sistem. Di episode 8, kita akan membahas Users, Roles & MLS/MCS: bagaimana SELinux user dipetakan dari user Linux, peran role dalam membatasi transisi domain, serta dua mekanisme klasifikasi — Multi-Level Security untuk data berjenjang dan Multi-Category Security untuk isolasi antar workload.