Kemarin, saya mendapatkan permintaan dari klien untuk meningkatkan standar keamanan pada server Zimbra yang digunakan berdasarkan hasil audit internal yang mereka lakukan. Dari hasil audit tersebut, terdapat 2 poin utama yang perlu diperbaiki:
-
HSTS (HTTP Strict Transport Security): Menghilangkan duplikasi header dan memastikan implementasi yang bersih
-
CSP (Content Security Policy): Menghilangkan semua direktif
unsafe-(khususnyaunsafe-inlinedanunsafe-eval) untuk memitigasi risiko Cross-Site Scripting (XSS).
Dikarenakan permintaan klien ini kaitannya dengan security, jadi saya segera melakukan improvement HSTS serta content security policy pada email server Zimbra. Konfigurasi yang saya lakukan mengacu dari referensi berikut:
- https://blog.zimbra.com/2023/01/did-you-know-zimbra-http-strict-transport-security-hsts/
- https://imanudin.net/2023/08/15/how-to-add-content-security-policy-csp-headers-in-zimbra/
Konfigurasi yang dilakukan sebenarnya cukup mudah, namun untuk konfigurasi CSP kita perlu menghilangkan bagian ‘unsafe-eval’. Berikut adalah perintah untuk mengaktifkan HSTS & CSP dari email server Zimbra:
# su - zimbra # zmprov mcf +zimbraResponseHeader "Strict-Transport-Security: max-age=31536000; includeSubDomains" # zmprov mcf +zimbraResponseHeader "Content-Security-Policy: default-src https: 'self' 'unsafe-inline'; script-src https: 'self' 'unsafe-inline'; object-src 'none'; img-src 'self' data:"
Setelah itu restart all service Zimbra.,
# zmcontrol restart
Sekarang, jika rekan-rekan cek menggunakan perintah curl berikut maka akan muncul CSP headernya:
# raihan@Raihans-MacBook-Pro ~ % curl -I https://mail.aktiva.co.id HTTP/2 200 server: nginx date: Mon, 12 Jan 2026 04:39:37 GMT content-type: text/html;charset=utf-8 content-length: 18974 strict-transport-security: max-age=31536000 x-xss-protection: 1; mode=block x-content-type-options: nosniff x-robots-tag: noindex x-frame-options: SAMEORIGIN expires: -1 cache-control: no-store, no-cache, must-revalidate, max-age=0 pragma: no-cache content-language: en-US set-cookie: ZM_TEST=true set-cookie: ZM_LOGIN_CSRF=15914482-6dd1-4805-b7c0-842084822f3f; HttpOnly vary: User-Agent x-ua-compatible: IE=edge strict-transport-security: max-age=31536000; includeSubdomains content-security-policy: frame-ancestors 'none'; default-src 'self' https:; script-src 'self' https: 'unsafe-inline'; object-src 'none'; img-src 'self' data:;
Namun, masalah muncul saat saya mencoba mengakses zimbra admin console (port 9071). Halaman login berhasil terbuka, tetapi setelah masuk, dashboard hanya menampilkan layar putih kosong (blank). Setelah melakukan pengecekan melalui Developer Tools di browser, saya menemukan penyebabnya:
Content-Security-Policy: The page’s settings blocked a JavaScript eval (script-src) because it violates the following directive: “script-src ‘self’ ‘unsafe-inline'” (Missing ‘unsafe-eval’)
Ternyata, UI Admin Zimbra masih menggunakan kode yang sifatnya legacy sehingga membutuhkan ‘unsafe-eval’ untuk memproses skrip java yang ada.
Setelah berdiskusi dengan klien, akhirnya disepakati bahwa untuk tampilan webmail user tetap mengaktifkan CSP tanpa unsafe-eval, lalu untuk tampilan zimbra admin console juga menggunakan CSP serta tetap dilengkapi dengan unsafe-eval namun aksesnya hanya diperbolehkan dari IP publik klien yang trusted saja. Berikut adalah konfigurasi yang saya lakukan untuk eskalasi kendala ini:
Langkah 1: Menghapus Content Security Policy (Global)
Sebelum kita melakukan rekonfigurasi content security policy, rekan-rekan perlu menghapus terlebih dahulu atribut global config zimbraResponseHeader yang berkaitan dengan CSP (Untuk atribut yang berkaitan dengan HSTS tidak perlu dihapus). Berikut perintah untuk menghapus atribut global config yang dimaksud:
# su - zimbra # zmprov mcf -zimbraResponseHeader "Content-Security-Policy: default-src https: 'self' 'unsafe-inline'; script-src https: 'self' 'unsafe-inline'; object-src 'none'; img-src 'self' data:" # zmprov gcf zimbraResponseHeader zimbraResponseHeader: Strict-Transport-Security: max-age=31536000; includeSubDomains;
Langkah 2: Konfigurasi Content Security Policy (Webmail)
Selanjutnya adalah menambahkan konfigurasi content security policy tanpa ‘unsafe-eval’ untuk webmail dengan cara edit file /opt/zimbra/conf/nginx/templates/nginx.conf.web.https.default.template dan tambahkan baris berikut dibawah “${web.add.headers.default}”:
${web.add.headers.default}
add_header Content-Security-Policy "frame-ancestors 'none'; default-src https: 'self' 'unsafe-inline'; script-src https: 'self' 'unsafe-inline'; object-src 'none'; img-src 'self' data:" always;
Langkah 3: Konfigurasi Content Security Policy (Zimbra Admin Console)
Setelah webmail, kita juga perlu menambahkan konfigurasi content security policy yang dilengkapi ‘unsafe-eval’ untuk webmail dengan cara edit file /opt/zimbra/conf/nginx/templates/nginx.conf.web.admin.default.template dan tambahkan baris berikut dibawah “${web.add.headers.default}”:
${web.add.headers.default}
add_header Content-Security-Policy "frame-ancestors 'none'; default-src https: 'self' 'unsafe-inline'; script-src https: 'self' 'unsafe-inline' 'unsafe-eval'; object-src 'none'; img-src 'self' data:" always;
Langkah 4: Restart Service Zimbra
Supaya rekonfigurasi yang kita lakukan reflect, maka perlu dilakukan restart all service Zimbra dengan perintah berikut:
# su - zimbra # zmcontrol restart
Langkah 5: Batasi Akses Zimbra Admin Console (Firewall External)
Mengingat Admin Console kini memiliki kebijakan CSP yang sedikit lebih longgar untuk Zimbra Admin Console, saya menyarankan untuk menggunakan External Firewall untuk membatasi akses ke port Zimbra Admin Console lalu melakukan whitelist IP publik trusted.
Setelah melakukan rekonfigurasi diatas, jika rekan-rekan cek menggunakan perintah curl berikut maka akan muncul CSP header yang berbeda pada URL webmail & Zimbra Admin Console
Webmail
Zimbra Admin Console
Catatan: Apabila rekan-rekan melakukan upgrade ataupun patching Zimbra, maka kemungkinan besar rekan-rekan perlu melakukan pengecekan bahkan konfigurasi ulang karena pada beberapa proses patch, konfigurasi proxy dikembalikan menjadi default. Saran saya, sebelum melakukan patching, baiknya melakukan backup file berikut:
- /opt/zimbra/conf/nginx/templates/nginx.conf.web.https.default.template
- /opt/zimbra/conf/nginx/templates/nginx.conf.web.admin.default.template
Namun apabila rekan-rekan ragu untuk melakukannya, Excellent juga menyediakan layanan implementasi & maintenance email server Zimbra dan sudah mencakup konfigurasi improvement tersebut. Bagi rekan-rekan yang berminat untuk jasa layanan tersebut bisa langsung kontak & tanya-tanya ke email sales@excellent.co.id.