Pada artikel sebelumnya yang berjudul Script History Login Email Server Zimbra, saya sempat membagikan script perl yang berguna untuk melakukan parsing history login pengguna dari file log /opt/zimbra/log/audit.log ke dalam format tabel ASCII, CSV, dan JSON. Script tersebut sangat memudahkan kita dalam melakukan monitoring siapa saja pengguna yang aktif mengakses email, protokol apa yang digunakan (Webmail, ActiveSync, POP3, IMAP), serta status penggunaan fitur keamanan seperti 2FA.
Namun, ketika script versi pertama tersebut saya gunakan dalam kebutuhan investigasi dan audit keamanan pada skala server produksi yang lebih masif, saya menemukan satu celah evaluasi yang sangat krusial: Script versi awal belum mampu mendeteksi dan membedakan antara login yang berhasil (Success) dengan login yang gagal (Failed Login).
Bahkan yang lebih mengejutkan, pada kondisi tertentu, percobaan login yang sebenarnya gagal (misalnya karena salah password, akun dikunci, atau status akun sudah nonaktif/closed) justru ikut terhitung sebagai login normal yang sukses! Hal ini tentu berbahaya jika dijadikan acuan audit keamanan, karena administrator bisa mengira akun yang bersangkutan aktif digunakan secara wajar, padahal akun tersebut sedang menjadi sasaran brute force atau mengalami kegagalan autentikasi berulang kali. Oleh karena itu, saya melakukan pembaruan besar-besaran dan merilis zm-audit-log-v2.
Mengapa Script Versi Pertama Bisa “Tertipu”?
Untuk memahami letak permasalahannya, kita perlu melihat bagaimana Zimbra mencatat aktivitas autentikasi ke dalam file audit.log. Ketika sebuah percobaan login terjadi dan mengalami kegagalan, Zimbra mencatatnya dengan status WARN dan menyertakan parameter error=... seperti contoh berikut:
2026-11-06 10:18:34,123 WARN [qtp123456-78:https://localhost:7071/service/admin/soap/AuthRequest] [ip=182.8.226.227;] security - cmd=Auth; account=mantan.karyawan@colamen.id; protocol=imap; error=authentication failed for [mantan.karyawan@colamen.id], account status is closed;
Pada script versi awal (v1), logika regex yang digunakan hanya mencocokkan keberadaan string protokol seperti protocol=(pop3|imap); atau tag ZimbraWebClient. Script tidak memvalidasi apakah baris tersebut berstatus INFO atau WARN, serta tidak memeriksa apakah terdapat keterangan error=authentication failed. Akibatnya, baris log kegagalan autentikasi di atas tetap diekstrak, akun mantan.karyawan@colamen.id dimasukkan ke dalam daftar login sukses, dan jumlah hit-nya bertambah.
Pada server dengan ribuan akun, hal ini menimbulkan bias data yang cukup besar. Dalam satu kasus investigasi yang saya tangani baru-baru ini, terdapat lebih dari 30.000 percobaan login gagal yang sebelumnya tidak terdeteksi secara akurat oleh script versi lama.
Real Use Case
Dalam proses penyempurnaan script ke versi kedua, ada dua kendala teknis lapangan yang cukup menarik untuk dibahas:
1. Log Internal Port 7073 (Postfix SASL Lookup)
Jika rekan-rekan memeriksa audit.log, seringkali muncul log autentikasi gagal yang mengarah ke port 7073 dengan IP sumber server lokal (misalnya 192.168.10.15 atau 127.0.0.1). Log ini sebenarnya berasal dari daemon Postfix/SASL lokal yang menanyakan validitas kredensial SMTP ke Zimbra mailbox. Pada port 7073 ini, IP asli pengirim email tidak diteruskan ke audit.log (IP asli client pengirim sebenarnya sudah tercatat di /var/log/zimbra.log atau maillog). Jika baris ini tidak difilter, tabel audit Zimbra akan dipenuhi oleh IP internal server sendiri seolah-olah server yang melakukan percobaan login.
2. Masalah IP Proxy / Cloudflare dan Atribut zimbraMailTrustedIP
Bagi email server Zimbra yang webmail-nya ditempatkan di balik Reverse Proxy (seperti NGINX eksternal) atau Content Delivery Network / WAF seperti Cloudflare, IP yang terbaca di audit.log secara default adalah IP proxy tersebut. Agar Zimbra mau membaca header X-Forwarded-For dari proxy, IP reverse proxy harus didaftarkan ke dalam konfigurasi zimbraMailTrustedIP:
# Cek daftar trusted IP saat ini
zmprov gacf zimbraMailTrustedIP
# Tambahkan IP reverse proxy / gateway internal (contoh: 192.168.10.15)
zmprov mcf +zimbraMailTrustedIP 127.0.0.1 +zimbraMailTrustedIP 192.168.10.15
# Restart mailboxd agar konfigurasi diterapkan
zmmailboxdctl restart
Setelah zimbraMailTrustedIP diaktifkan di belakang Cloudflare, Zimbra akan mencatat header oip (Original IP). Namun, header ini berbentuk rantai IP (multi-IP chain), misalnya oip=103.120.170.102, 104.23.232.44, di mana IP pertama adalah IP publik asli pengguna dan IP kedua adalah node edge Cloudflare. Script zm-audit-log-v2 sudah dilengkapi dengan fungsi normalisasi IP untuk memecah rantai tersebut dan mengambil murni IP asli pengguna saja.
Fitur Baru pada zm-audit-log-v2
Berikut adalah beberapa peningkatan fitur yang saya tambahkan pada zm-audit-log-v2:
- Pemisahan Kolom OK dan FAIL: Pada tampilan daftar pengguna (tabel default), sekarang tersedia kolom terpisah antara
OK(jumlah login sukses) danFAIL(jumlah percobaan gagal), sehingga administrator dapat langsung membedakan akun yang beraktivitas normal vs akun yang sedang diserang. - Mode Audit Keamanan Khusus (
--failed): Parameter ini akan memfilter dan hanya menampilkan akun-akun yang mengalami kegagalan login, diurutkan dari jumlah kegagalan terbanyak. Dilengkapi dengan ringkasan alasan kegagalan (Account Closed, Invalid Credentials/LDAP, Account Locked) dan daftar IP sumbernya. - Investigasi Detail Akun (
--user=EMAIL): Menampilkan profil lengkap sebuah akun, riwayat IP login sukses, status 2FA, serta 10 log percobaan gagal terakhir lengkap dengan waktu kejadian, protokol, IP penyerang, dan penyebab error. - Dukungan Format Lengkap (Table, CSV, JSON): Mendukung ekspor data dengan rapi menggunakan opsi
--format=csvatau--format=json, yang sangat memudahkan integrasi dengan dashboard monitoring (seperti Grafana, ELK) maupun olah data di spreadsheet.
Cara Download dan Instalasi Script zm-audit-log-v2
Rekan-rekan dapat mengunduh script zm-audit-log-v2 langsung ke server Zimbra melalui terminal Linux menggunakan perintah berikut:
# Pindah ke direktori /srv/ atau direktori bin pilihan Anda
cd /srv/
# Download script versi 2
wget -c https://colamen.id/zimbra/zm-audit-log-v2
# Berikan hak akses eksekusi
chmod u+x /srv/zm-audit-log-v2
Catatan: Pastikan modul Perl Time::Piece, Term::ANSIColor, dan JSON::PP sudah terpasang di sistem operasi server Anda. Modul-modul ini umumnya sudah tersedia secara bawaan di instalasi Perl standar Linux.
Panduan Penggunaan dan Contoh Output
1. Melihat Daftar Semua Akun (OK vs FAIL)
Cukup jalankan script tanpa parameter untuk menganalisis file audit.log hari ini:
/srv/zm-audit-log-v2
Output yang dihasilkan akan menampilkan perbandingan login sukses dan gagal:
Processing /opt/zimbra/log/audit.log...
+--------------------------+---------------------+----------------------+---------------------------------+-----+------+
| Email | Last Seen | Auth Methods | IP Addresses | OK | FAIL |
+--------------------------+---------------------+----------------------+---------------------------------+-----+------+
| admin@colamen.id | 2026-11-06 10:35:59 | WebClient | 103.120.170.102 | 13 | 0 |
| raihan@colamen.id | 2026-11-06 10:49:59 | WebClient, IMAP | 36.91.5.178, 182.253.95.10 | 25 | 0 |
| staff@colamen.id | 2026-11-06 10:46:57 | POP3 | 202.46.93.123 | 12 | 0 |
| mantan.staff@colamen.id | N/A | None (Only Failures) | None | 0 | 85 |
| sales@colamen.id | 2026-11-06 09:48:24 | WebClient | 114.10.67.159 | 4 | 0 |
+--------------------------+---------------------+----------------------+---------------------------------+-----+------+
Perhatikan baris mantan.staff@colamen.id. Pada script lama, akun ini akan tercatat memiliki aktivitas login sukses sebanyak 85 kali. Namun pada v2, script dengan tepat menandai bahwa akun ini 0 OK dan 85 FAIL.
2. Mode Audit Keamanan: Menampilkan Akun yang Mengalami Kegagalan Login
Untuk memfilter hanya akun-akun bermasalah atau sedang menjadi target serangan, gunakan parameter --failed:
/srv/zm-audit-log-v2 --failed
Contoh output investigasi kegagalan login:
Processing /opt/zimbra/log/audit.log...
+--------------------------+----------+---------------------+----------------------------+-----------+-----------------------------------------+
| Target Account | Failures | Last Failed | Reasons | Protocols | Source IPs |
+--------------------------+----------+---------------------+----------------------------+-----------+-----------------------------------------+
| mantan.staff@colamen.id | 85 | 2026-11-06 10:52:15 | Account Closed | pop3 | 153.76.64.249, 182.2.68.38, 182.2.85.38 |
| ex.user@colamen.id | 80 | 2026-11-06 10:27:47 | Account Closed | pop3 | 182.4.69.179, 182.9.200.13 |
| dev@colamen.id | 10 | 2026-11-06 10:48:13 | Invalid Credentials (LDAP) | imap | 103.121.134.92, 182.2.189.249 |
| testing@colamen.id | 1 | 2026-11-06 10:45:13 | Account Locked | pop3 | 182.9.37.168 |
| budi@colamen.id | 1 | 2026-11-06 10:45:24 | Invalid Credentials (LDAP) | soap | 202.46.93.123 |
+--------------------------+----------+---------------------+----------------------------+-----------+-----------------------------------------+
Dari output di atas, sysadmin dapat langsung mengambil keputusan mitigasi: apakah memblokir IP penyerang di firewall/Fail2ban, menginformasikan pengguna terkait password yang salah, atau menghapus profil email client lama yang masih aktif menembak akun tertutup.
3. Investigasi Mendalam Satu Akun Tertentu
Jika rekan-rekan ingin melihat riwayat lengkap akses sebuah akun (misalnya akun administrator atau akun yang dicurigai disusupi), gunakan parameter --user=EMAIL:
/srv/zm-audit-log-v2 --user=admin@colamen.id
Contoh output investigasi akun:
Processing /opt/zimbra/log/audit.log...
=======================================================
Activity Report for: admin@colamen.id
=======================================================
Web Client Access:
+---------------------+-----------------+-------------------------+
| Last Seen | Last IP | User Agent |
+---------------------+-----------------+-------------------------+
| 2026-11-06 10:35:59 | 103.120.170.102 | zclient/10.1.21_GA_4899 |
+---------------------+-----------------+-------------------------+
Successful Login IP History:
+-----------------+---------------------+---------------+
| IP Address | Last Seen | Success Count |
+-----------------+---------------------+---------------+
| 103.120.170.102 | 2026-11-06 10:35:59 | 1 |
| 192.168.10.15 | 2026-11-06 09:08:32 | 12 |
+-----------------+---------------------+---------------+
Overall Authentication Summary:
+-----------------------+-------+
| Metric | Count |
+-----------------------+-------+
| Successful Logins | 13 |
| Failed Attempts | 0 |
| Two-Factor Auth | 0 |
| Trusted Device | 0 |
| App-Specific Password | 0 |
| POP3 Access | 0 |
| IMAP Access | 0 |
+-----------------------+-------+
4. Memproses Seluruh Arsip Log dan Ekspor ke CSV / JSON
Jika rekan-rekan ingin mengaudit seluruh file log audit yang tersimpan di direktori (termasuk file kompresi audit.log.2026-xx-xx.gz), tambahkan parameter --all. Anda juga bisa mengarahkannya ke format CSV atau JSON:
# Ekspor daftar akun bermasalah (failed logins) dari seluruh arsip log ke CSV
/srv/zm-audit-log-v2 --all --failed --format=csv > /tmp/failed_logins_all.csv
# Ekspor data ke format JSON untuk diintegrasikan ke sistem logging eksternal
/srv/zm-audit-log-v2 --all --failed --format=json > /tmp/failed_logins_all.json
Penutup
Monitoring history login email server bukan sekadar mengetahui siapa yang sedang mengakses email, tetapi juga merupakan tools untuk mendeteksi anomali akses dan percobaan peretasan aun. Dengan pembaruan zm-audit-log-v2 ini, pelaporan aktivitas menjadi jauh lebih presisi, bersih, dan mampu menyajikan data kegagalan login secara akurat.
Bagi rekan-rekan yang membutuhkan bantuan dalam pemeliharaan, audit keamanan, optimasi performa, maupun penanganan insiden pada Email Server Zimbra, PT. Excellent Infotama Kreasindo menyediakan layanan maintenance berkala dan support profesional. Rekan-rekan dapat berkonsultasi langsung dengan tim kami melalui email ke sales@excellent.co.id.