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.
| Aspek | Log aplikasi (journald, rsyslog) | Audit kernel (auditd) |
|---|---|---|
| Siapa mencatat | program itu sendiri | kernel, saat syscall lewat |
| Contoh isi | sshd: Failed password for root | syscall rename pada /etc/passwd oleh usermod |
| Bisa dilewati program? | bisa — program cukup diam | tidak — syscall wajib melewati kernel |
| Alat pembaca | journalctl, grep | ausearch, 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.
Menulis Aturan: Watch dengan Kunci #
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:
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.latihanOutput yang Dihasilkan:
-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 eksekusiLima baris itu baris per baris:
-w /etc/passwd -p wa -k identitas: awasi file identitas utama.-wadalah path yang diawasi,-p wamemicu pencatatan saat file ditulis (w) atau atributnya diubah (a), dan-k identitasmenempelkan kunci — label yang nanti kita pakai untuk mencari.-w /etc/group -p wa -k identitas: file group diberi kunci yang sama, sehingga satu pencarianidentitasmengumpulkan seluruh perubahan keanggotaan.-w /etc/sudoers -p wa -k akses-sudo: kebijakan sudo adalah pintu menuju root — setiap sentuhan padanya layak meninggalkan jejak bernama sendiri.-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.-a always,exit -F arch=b64 -S execve -k eksekusi: bentuk kedua — syscall rule. Setiapexecve(program baru dijalankan) dicatat tanpa peduli file mana.-a always,exitmenempelkan aturan pada daftar keputusan saat syscall selesai,-F arch=b64membatasi 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:
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.logOutput yang Dihasilkan:
== 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:
- Baris 1-5 (
printf ... > audit-mock.log): menulis tiga rekaman contoh. Nomor dalamaudit(detik:nomor)adalah cap waktu dan urutan event;arch=c000003eadalah kode arsitektur x86-64. uid=0vsauid=1000: inilah pasangan paling penting.uidadalah user yang menjalankan operasi saat itu —0berarti root.auid(audit user ID) adalah manusia di balik sesi login yang memulai semuanya — tetap1000(budi) meski perintahnya dijalankan lewatsudo.usermodpada baris pertama bisa diketahui bukan dijalankan root dari terminal langsung, melainkan oleh budi yang meminjam hak root.syscall=316dancomm/exe: nomor 316 adalahrenameat2— carausermodmenulis/etc/passwdsecara aman (menulis file baru lalu mengganti nama).commadalah nama proses yang terlihat dips;exeadalah jalur programnya — keduanya dicatat kernel, bukan dilaporkan program.- Baris 9 (
grep 'key="identitas"'): dari tiga rekaman, hanya dua berlabelidentitasyang kembali —catyang berlabeleksekusitertinggal. Inilah persis pekerjaanausearch -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:
----
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 dipantau | Aturan atau sumbernya | Mengapa penting |
|---|---|---|
| Login sukses dan gagal | tercatat bawaan via PAM; ausearch --login | pintu masuk utama; pola brute force terlihat di sini |
| Perubahan file identitas | -w /etc/passwd -p wa -k identitas | user baru adalah kunci baru ke sistem |
| Naiknya hak lewat sudo | jejak auid pada event; log sudo di journald | menjawab “manusia siapa yang jadi root” |
| Eksekusi program | -a always,exit -S execve -k eksekusi | inventaris proses — bahan forensik saat terjadi hal buruk |
| Perubahan aturan audit | -w /etc/audit/ -p wa -k aturan-audit | pengawas 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.