Siapa yang mengubah /etc/passwd tadi malam? Log aplikasi biasa hanya bisa menjawab sebatas yang dilaporkan programnya — dan program yang berniat jahat tidak akan melapor. Linux punya sumber cerita kedua yang lebih tegas: subsystem audit di dalam kernel, yang mencatat setiap syscall penting tanpa peduli aplikasinya mau bercerita atau tidak. Chapter ini membahas cara kerja auditd, cara menulis aturan dengan flag -w, -p, dan -k, cara menyelidiki dengan ausearch dan aureport, serta daftar event yang wajib masuk radar. Karena daemon audit menuntut aturan yang dimuat ke kernel, kita berlatih dengan file aturan dan potongan log tiruan yang formatnya sama persis dengan yang asli.

Log Aplikasi vs Audit Kernel #

Dua jalur log berjalan berdampingan di Linux, dan keduanya menjawab pertanyaan berbeda. journald dan rsyslog mengumpulkan kesaksian para program: sshd melaporkan login gagal, web server melaporkan request yang datang. Sifatnya kooperatif — isinya benar selama programnya jujur. auditd bekerja di tempat yang lebih dalam: kernel mencatat sendiri setiap syscall yang cocok dengan aturan kita — file mana yang ditulis, proses mana yang lahir, siapa pelakunya — dan program tidak punya cara untuk memilih tidak tercatat, karena pendaftarannya terjadi di dalam kernel sebelum program tahu apa-apa.

AspekLog aplikasi (journald, rsyslog)Audit kernel (auditd)
Siapa mencatatprogram itu sendirikernel, saat syscall lewat
Contoh isisshd: Failed password for rootsyscall rename pada /etc/passwd oleh usermod
Bisa dilewati program?bisa — program cukup diamtidak — syscall wajib melewati kernel
Alat pembacajournalctl, grepausearch, aureport

Secara arsitektur, auditd adalah daemon pengurus: kernel menghasilkan event, auditd yang menuliskannya ke /var/log/audit/audit.log. Aturan kita dimuat ke kernel oleh auditctl untuk uji cepat, atau ditempatkan permanen di /etc/audit/rules.d/ lalu dirangkai menjadi /etc/audit/audit.rules oleh augenrules setiap boot.

Aturan paling mudah dibaca adalah watch rule: awasi sebuah path, catat izin mana yang disentuh, beri label. Beginilah wujud berkas aturan untuk event-event paling sensitif:

bash
printf '%s\n' \
  '-w /etc/passwd -p wa -k identitas' \
  '-w /etc/group -p wa -k identitas' \
  '-w /etc/sudoers -p wa -k akses-sudo' \
  '-w /etc/audit/ -p wa -k aturan-audit' \
  '-a always,exit -F arch=b64 -S execve -k eksekusi' \
  > audit-rules.latihan
cat audit-rules.latihan

Output yang Dihasilkan:

text
-w /etc/passwd -p wa -k identitas
-w /etc/group -p wa -k identitas
-w /etc/sudoers -p wa -k akses-sudo
-w /etc/audit/ -p wa -k aturan-audit
-a always,exit -F arch=b64 -S execve -k eksekusi

Lima baris itu baris per baris:

  1. -w /etc/passwd -p wa -k identitas: awasi file identitas utama. -w adalah path yang diawasi, -p wa memicu pencatatan saat file ditulis (w) atau atributnya diubah (a), dan -k identitas menempelkan kunci — label yang nanti kita pakai untuk mencari.
  2. -w /etc/group -p wa -k identitas: file group diberi kunci yang sama, sehingga satu pencarian identitas mengumpulkan seluruh perubahan keanggotaan.
  3. -w /etc/sudoers -p wa -k akses-sudo: kebijakan sudo adalah pintu menuju root — setiap sentuhan padanya layak meninggalkan jejak bernama sendiri.
  4. -w /etc/audit/ -p wa -k aturan-audit: aturan audit mengawasi dirinya sendiri. Langkah pertama penyerang setelah masuk biasanya memadamkan pengawas; aturan ini memastikan pemadaman itu sendiri terekam.
  5. -a always,exit -F arch=b64 -S execve -k eksekusi: bentuk kedua — syscall rule. Setiap execve (program baru dijalankan) dicatat tanpa peduli file mana. -a always,exit menempelkan aturan pada daftar keputusan saat syscall selesai, -F arch=b64 membatasi ke arsitektur 64-bit agar tidak dobel dengan versi 32-bit.

Menyelidiki dengan Kunci #

Kunci dari aturan tadi adalah alamat pencarian: ausearch -k identitas mengembalikan semua rekaman berlabel itu. Karena mesin latihan kita tidak menjalankan auditd, kita tiru isinya dengan potongan log yang formatnya sama dengan /var/log/audit/audit.log sungguhan:

bash
printf '%s\n' \
  'type=SYSCALL msg=audit(1767225600.362:331): arch=c000003e syscall=316 success=yes auid=1000 uid=0 comm="usermod" exe="/usr/sbin/usermod" key="identitas"' \
  'type=SYSCALL msg=audit(1767225603.104:332): arch=c000003e syscall=257 success=yes auid=1000 uid=1000 comm="cat" exe="/usr/bin/cat" key="eksekusi"' \
  'type=SYSCALL msg=audit(1767225604.870:333): arch=c000003e syscall=316 success=yes auid=1000 uid=0 comm="vipw" exe="/usr/sbin/vipw" key="identitas"' \
  > audit-mock.log
echo '== seluruh rekaman =='
cat audit-mock.log
echo '== rekaman berkunci identitas =='
grep 'key="identitas"' audit-mock.log

Output yang Dihasilkan:

text
== seluruh rekaman ==
type=SYSCALL msg=audit(1767225600.362:331): arch=c000003e syscall=316 success=yes auid=1000 uid=0 comm="usermod" exe="/usr/sbin/usermod" key="identitas"
type=SYSCALL msg=audit(1767225603.104:332): arch=c000003e syscall=257 success=yes auid=1000 uid=1000 comm="cat" exe="/usr/bin/cat" key="eksekusi"
type=SYSCALL msg=audit(1767225604.870:333): arch=c000003e syscall=316 success=yes auid=1000 uid=0 comm="vipw" exe="/usr/sbin/vipw" key="identitas"
== rekaman berkunci identitas ==
type=SYSCALL msg=audit(1767225600.362:331): arch=c000003e syscall=316 success=yes auid=1000 uid=0 comm="usermod" exe="/usr/sbin/usermod" key="identitas"
type=SYSCALL msg=audit(1767225604.870:333): arch=c000003e syscall=316 success=yes auid=1000 uid=0 comm="vipw" exe="/usr/sbin/vipw" key="identitas"

Bedah isinya — terutama dua kolom yang membuat audit kernel begitu tajam:

  1. Baris 1-5 (printf ... > audit-mock.log): menulis tiga rekaman contoh. Nomor dalam audit(detik:nomor) adalah cap waktu dan urutan event; arch=c000003e adalah kode arsitektur x86-64.
  2. uid=0 vs auid=1000: inilah pasangan paling penting. uid adalah user yang menjalankan operasi saat itu — 0 berarti root. auid (audit user ID) adalah manusia di balik sesi login yang memulai semuanya — tetap 1000 (budi) meski perintahnya dijalankan lewat sudo. usermod pada baris pertama bisa diketahui bukan dijalankan root dari terminal langsung, melainkan oleh budi yang meminjam hak root.
  3. syscall=316 dan comm/exe: nomor 316 adalah renameat2 — cara usermod menulis /etc/passwd secara aman (menulis file baru lalu mengganti nama). comm adalah nama proses yang terlihat di ps; exe adalah jalur programnya — keduanya dicatat kernel, bukan dilaporkan program.
  4. Baris 9 (grep 'key="identitas"'): dari tiga rekaman, hanya dua berlabel identitas yang kembali — cat yang berlabel eksekusi tertinggal. Inilah persis pekerjaan ausearch -k.

Pada sistem yang menjalankan auditd, ausearch menghasilkan rekaman yang lebih kaya daripada potongan kita. Berikut contoh tampilan hasil ausearch -k identitas untuk satu event:

text
----
time->Thu Jan  1 00:00:00 2026
type=PROCTITLE msg=audit(1767225600.362:331): proctitle=757365726D6F640062756469002D6147007375646F
type=PATH msg=audit(1767225600.362:331): item=0 name="/etc/passwd" inode=35201 dev=08:02 mode=0100644 ouid=0 ogid=0 nametype=NORMAL
type=SYSCALL msg=audit(1767225600.362:331): arch=c000003e syscall=316 success=yes exit=0 a0=7f1a a1=7f2b items=2 ppid=4122 pid=4189 auid=1000 uid=0 gid=0 euid=0 tty=pts1 ses=3 comm="usermod" exe="/usr/sbin/usermod" key="identitas"

Tiga rekaman itu satu event yang sama: PROCTITLE menyimpan perintah lengkap dalam heksadesimal (usermod budi -aG sudo), PATH menyimpan file yang tersentuh beserta inode-nya, dan SYSCALL adalah intinya seperti pada latihan kita. Saat investigasi, nomor event 331 mengikat ketiganya menjadi satu kejadian.

aureport dan Event yang Wajib Masuk Radar #

Jika ausearch menjawab satu pertanyaan spesifik, aureport merangkum seluruh log menjadi laporan harian: aureport --login meringkas keberhasilan login, aureport -f menyusun file-file yang paling sering disentuh, dan aureport -x menghitung eksekusi program. Laporan seperti ini layak dikirim rutin ke surel admin — kejanggalan yang berulang terlihat jauh lebih cepat di ringkasan daripada di gunung log mentah. Daftar minimal yang sebaiknya terpantau:

Event yang dipantauAturan atau sumbernyaMengapa penting
Login sukses dan gagaltercatat bawaan via PAM; ausearch --loginpintu masuk utama; pola brute force terlihat di sini
Perubahan file identitas-w /etc/passwd -p wa -k identitasuser baru adalah kunci baru ke sistem
Naiknya hak lewat sudojejak auid pada event; log sudo di journaldmenjawab “manusia siapa yang jadi root”
Eksekusi program-a always,exit -S execve -k eksekusiinventaris proses — bahan forensik saat terjadi hal buruk
Perubahan aturan audit-w /etc/audit/ -p wa -k aturan-auditpengawas yang dimatikan diam-diam harus tetap bersuara

Dengan aturan dan alat baca di tangan, sistem kini meninggalkan jejak yang bisa ditanya kapan saja. Pertanyaan berikutnya lebih menantang: bagaimana mengenali bahwa jejak yang tertulis itu milik penyusup — tanda-tanda malware dan rootkit pada Linux, materi chapter berikutnya.

Referensi lanjut: auditd(8) untuk perilaku daemon-nya, audit.rules(7) untuk rujukan lengkap sintaks aturan, ausearch(8) untuk opsi penyelidikan, serta wiki Arch Linux tentang audit framework untuk contoh penerapan.