Belajar SELinux - audit2allow & Local Policy Generation
Episode 7 of 23

Belajar SELinux - audit2allow & Local Policy Generation

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

Alur Debug Denial yang Benar

Sebelum menyentuh audit2allow, pastikan proses debugging mengikuti urutan yang disiplin. Melewatkan satu langkah membuat kalian menganalisis data yang salah:

  1. Pastikan mode enforcing aktif — denial hanya menimbulkan log saat enforcing, bukan sekadar permissive.
  2. Reproduksi masalah — denial hanya muncul jika aplikasi benar-benar mencoba operasi yang diblokir.
  3. Temukan denial di log dengan ausearch atau grep.
  4. Baca dan pahami denial — subjek, objek, izin, dan class-nya.
  5. Pilih solusi paling sempit: boolean dulu, lalu konteks file, baru modul policy.
  6. Generate, install, dan uji module, lalu verifikasi denial benar-benar hilang.

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.

Membaca Denial dengan ausearch

Log audit adalah sumber kebenaran. Perintah pertama yang harus kalian kuasai:

Cari denial AVC terbaru
sudo ausearch -m AVC -ts recent

Hasilnya kira-kira seperti ini:

LinuxContoh record denial
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=0

Inilah "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 objekfile, 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.

audit2allow: Penerjemah Denial

Setelah memahami denial, saatnya meminta saran aturan. Jalankan audit2allow -a untuk membaca seluruh log audit dan menghasilkan aturan yang diusulkan:

Lihat aturan yang disarankan
sudo audit2allow -a

Jika log kalian hanya berisi denial di atas, keluarannya akan terlihat seperti ini:

LinuxSaran aturan dari audit2allow
#============= 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.

Membuat dan Menginstall Modul Policy

Setelah puas dengan aturan yang diusulkan, generate module dengan flag -M:

Generate modul policy lokal
sudo audit2allow -a -M myhttpd

Perintah ini menghasilkan dua file: myhttpd.te (sumber policy dalam format Type Enforcement) dan myhttpd.pp (paket policy terkompilasi). Ini isi myhttpd.te:

LinuxIsi 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:

Install, cek, dan uji modul
sudo semodule -i myhttpd.pp
sudo semodule -l | grep myhttpd

Jika ternyata tidak dibutuhkan, hapus dengan semodule -r myhttpd. Menghapus lebih mudah daripada mengedit — jadi jangan ragu mencoba dan membersihkan.

Best Practice: Jangan Generate Buta

Modul policy lokal adalah alat yang sah, tetapi salah pakai bisa merusak keamanan sistem. Patuhi prinsip berikut:

  • Pahami setiap aturan sebelum install. Jika kalian tidak bisa menjelaskan satu baris allow, jangan install.
  • Prefer solusi yang lebih sempit. Ada boolean yang pas? Pakai boolean. Masalahnya soal label file? Label dengan semanage fcontext, bukan dengan memberi domain akses ke seluruh tipe objek.
  • Waspadai tipe objek yang terlalu umum. Pada contoh di atas, 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.
  • Hindari dontaudit berlebihan. Flag -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.
  • Uji di host terpisah dulu, lalu propagasikan modul yang sama dengan config management agar konsisten.

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.

Penutup

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:

  • Log audit adalah sumber kebenaran; baca sebelum generate.
  • Pilih solusi paling sempit: boolean dulu, fcontext kedua, modul terakhir.
  • Waspadai tipe objek yang terlalu umum dan dontaudit yang berlebihan.

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.