Membangun jejak audit: mengaktifkan audit log, tipe event audit, format output file dan index, filtering event, serta pertimbangan compliance GDPR, kebijakan retensi data, dan pelacakan akses.

Autentikasi dan enkripsi membuat akses jadi aman. Tapi keamanan tidak lengkap tanpa akuntabilitas: jika terjadi insiden, kalian harus bisa menjawab "siapa yang mengakses apa, kapan, dan dengan hasil bagaimana?". Itulah peran audit logging — dan jawaban itu juga tuntutan hukum di banyak industri (GDPR, SOC 2, HIPAA).
Episode 17 membahas audit logging di Elasticsearch: mengaktifkannya, jenis-jenis event, format output (file dan index), filtering event agar tidak membebani storage, serta praktik compliance — GDPR, kebijakan retensi, penanganan data pribadi, dan pelacakan akses.
Audit logging adalah fitur keamanan Elasticsearch yang mencatat aktivitas terkait keamanan dan akses. Aktifkan di elasticsearch.yml:
xpack.security.audit.enabled: true
xpack.security.audit.logfile.events.include:
- access_denied
- access_granted
- authentication_failed
- connection_denied
- run_as_granted
- run_as_denied
- anonymous_access_deniedSetelah restart, setiap event yang terpilih tercatat di file log audit. Karena fitur ini sensitif terhadap performa dan storage, aktifkan hanya event yang benar-benar kalian butuhkan.
Event audit dikelompokkan dalam beberapa kategori:
| Event | Arti |
|---|---|
authentication_success | Login berhasil |
authentication_failed | Login gagal (salah password) |
access_granted | User diberi akses ke resource |
access_denied | User ditolak akses ke resource |
run_as_granted / run_as_denied | Eksekusi dengan identitas lain (impersonation) |
connection_granted / connection_denied | Koneksi jaringan diterima/ditolak |
index_document / document_deleted | Aktivitas tulis ke dokumen |
security_config_change | Perubahan konfigurasi keamanan |
Warning
Mencatat index_document dan document_deleted di cluster dengan lalu lintas tulis tinggi bisa meledakkan ukuran log dan menekan performa. Aktifkan hanya saat memang dibutuhkan — misalnya saat investigasi, bukan di seluruh beban production.
Default audit logging menulis ke file (logs/<cluster>-audit.log). Formatnya JSON per baris, mudah diparsing:
{"type":"audit","event_type":"authentication_success","principal":"arman","request.method":"POST","request.path":"/_security/user","result.type":"success"}File cocok untuk pengarsipan offline dan analisis forensik.
Audit event juga bisa dikirim ke index audit khusus di dalam Elasticsearch sendiri — memudahkan pencarian dan dashboard. Konfigurasi tambahan:
xpack.security.audit.index.settings.enabled: true
xpack.security.audit.index.events.include: [access_denied, access_granted, authentication_failed]Danger
Hati-hati menulis audit log ke index Elasticsearch yang sama dengan data bisnis: jika cluster down karena insiden, kalian justru kehilangan jejak audit saat paling dibutuhkan. Praktik baik: kirim audit ke cluster terpisah, atau simpan di file dan archive berkala. Beberapa organisasi menggunakan cross-cluster (episode 22) untuk ini.
Tidak semua event layak dicatat — misalnya log health check yang muncul setiap detik. Filtering mengurangi noise dan storage:
xpack.security.audit.logfile.events.ignore_filters:
health_check:
users: ["system"]
actions: ["access_granted"]
paths: ["/_cluster/health", "/_nodes/stats"]Dengan filter di atas, akses user system ke endpoint health check tidak masuk audit. Aturan praktis: filter selektif dan terdokumentasi — jangan sampai meniadakan manfaat audit. Security team biasanya menetapkan apa yang boleh difilter.
GDPR (dan regulasi lain) menuntut tiga hal dari pengelola data pribadi:
Retensi bukan sekadar "simpan semua selamanya" — menyimpan data pribadi lebih lama dari yang dibutuhkan justru melanggar GDPR. Terapkan kebijakan retensi berlapis:
Ini semua bisa diotomasi dengan ILM (episode 10) — fase delete di akhir siklus hidup, plus downsampling/anonimisasi untuk data yang perlu dipertahankan.
Sebelum data pribadi masuk Elasticsearch, tanyakan: apakah field ini benar-benar perlu diindeks? Gunakan pola berikut:
{
"mappings": {
"properties": {
"email": { "type": "keyword", "index": false },
"credit_card": { "type": "keyword", "index": false },
"ip_address": { "type": "ip" }
}
}
}Field index: false tidak bisa dicari — mematikan kemampuan pencarian field pribadi sejak mapping. Untuk data yang bahkan tidak boleh tampil di _source, gunakan ingest pipeline (episode 12) untuk menghapusnya sebelum masuk, atau FLS di episode 15.
Tip
Compliance adalah sistem, bukan fitur: kebijakan retensi, kontrol akses, audit log, dan proses penghapusan harus bekerja sebagai satu kesatuan dan diuji. Simulasikan permintaan akses data subjek (DSAR): bisakah kalian menunjukkan semua akses ke data seorang user dalam 30 hari terakhir? Jika jawabannya tidak dalam hitungan menit, audit logging kalian belum cukup.
Aktifkan semua event. Storage dan performa jebol — pilih event yang relevan.
Audit log di cluster yang sama dengan data. Hilang saat insiden — pisahkan cluster atau archive.
Menyimpan data pribadi tanpa batas. Melanggar GDPR — terapkan retensi dengan ILM.
Filter yang terlalu agresif. Jejak audit jadi kosong — dokumentasikan dan setujui oleh security.
Mengindeks field pribadi yang bisa dicari. Pertimbangkan index: false atau hapus di pipeline.
Di episode 17 kalian menguasai audit logging dan compliance: aktivasi audit log, kategori event (authentication, access, run_as, tulis dokumen), output ke file dan index, filtering event, serta praktik compliance — GDPR, kebijakan retensi berlapis dengan ILM, penanganan data pribadi dengan index: false dan pipeline, serta pelacakan akses untuk DSAR.
Inti yang harus dibawa pulang:
index: false) sejak mapping.Sejauh ini kita bekerja di cluster kecil. Saatnya membesar. Di episode 18 kita bahas scaling cluster Elasticsearch: scaling horizontal dengan menambah node, strategi alokasi shard, ukuran shard ideal 10–50 GB, implementasi hot-warm-cold, kapan scale up vs scale out, serta pertimbangan storage SSD vs HDD. Sampai jumpa!