Hai semuanya, apa kabar? Kali ini kita akan coba ulik Zimbra lagi, lebih tepatnya tentang per-SSL-an. Karena makin hari masa aktif SSL akan makin singkat (198/199 hari saat tulisan ini dibuat), akan menjadi 90 hari, bahkan 47 hari di masa depan.
Peran HAProxy di sini adalah untuk SSL Termination atau tempat SSL komersial (Sectigo, Digicert, dll) yang letaknya di depan. Server Zimbra-nya di belakang dan menggunakan SSL self-signed dengan masa aktif yang diset lebih panjang. Jadi, apabila kita melakukan renewal/reissue SSL cukup melakukannya pada sisi HAProxynya saja. Sehingga kita bisa renewal SSL-nya tanpa mengganggu operasional mail server (intinya begitu).
PERINGATAN!:
- Proses konfigurasi ini membutuhkan downtime. Perubahan port internal dan inisialisasi HAProxy akan memutus koneksi email sementara. Lakukan prosedur ini pada jadwal pemeliharaan (maintenance window). - Lakukan backup pada tiap file yang diubah
Konfigurasi Zimbra
Nginx
Kita siapkan terlebih dahulu mail server-nya agar siap menerima data dari HAProxy. Masuk ke direktori Nginx Zimbra di /opt/zimbra/conf/nginx/templates dan edit file nginx.conf.mail.imaps.default.template. Tambahkan dua baris berikut di bawah entri sasl_service_name.
listen 1993 ssl proxy_protocol;
set_real_ip_from 192.168.1.100;
sesuaikan alamat IP-nya dengan IP lokal Zimbra
Selanjutnya, ubah file nginx.conf.mail.pop3s.default.template dan tambahkan dua baris berikut di bawah entri sasl_service_name.
listen 1995 ssl proxy_protocol;
set_real_ip_from 192.168.1.100;
sesuaikan alamat IP-nya dengan IP lokal Zimbra
Postfix
Backup terlebih dahulu file konfigurasinya.
cp /opt/zimbra/common/conf/master.cf.in /opt/zimbra/common/conf/master.cf.in-backup
cp /opt/zimbra/common/conf/master.cf.in /tmp/
chmod u+w /tmp/master.cf.in
Nantinya, kita akan ubah port yang digunakan. HAProxy akan takeover port 465 (SMTPS) & 587 (Submission). Maka dari itu, kita “geser” port-nya Postfix (465 -> 466 dan 587/submission -> 588).
Kita edit file konfigurasi yang /tmp/master.cf.in dulu. Cari baris yang diawali angka 465. Ubah jadi 466.
Asal:
465 inet n - n - - smtpd
Edit jadi:
466 inet n - n - - smtpd
Selanjutnya, masih di blok tersebut, cari baris terbawah (di blok tersebut), di bawah entri -o smtpd_tls_cert_file=..., tambahkan entri berikut:
-o smtpd_upstream_proxy_protocol=haproxy
-o smtpd_tls_wrappermode=no
-o smtpd_tls_auth_only=no
-o smtpd_tls_security_level=none
Selanjutnya, kita perlu ubah blok yang ada entri submission-nya. Kita akan ganti jadi 588 (masih di file yang sama).
Asal:
submission inet n - n - - smtpd
Edit jadi:
588 inet n - n - - smtpd
Dari blok submission tersebut, tambahkan entri berikut pada bagian paling bawah.
-o smtpd_upstream_proxy_protocol=haproxy
Apabila sudah diedit (kita editnya di /tmp), salin file yang baru saja kita buat ke lokasi aslinya (pada direktori konfigurasinya Zimbra). Sesuaikan juga ownership-nya.
cp /tmp/master.cf.in /opt/zimbra/common/conf/master.cf.in
chown zimbra:zimbra /opt/zimbra/common/conf/master.cf.in
Geser Port Zimbra
Jalankan perintah berikut dengan user = zimbra untuk proses geser internal port-nya Zimbra.
zmprov ms $(zmhostname) zimbraImapSSLProxyBindPort 2993 zimbraMailSSLProxyPort 1443 zimbraPop3SSLProxyBindPort 2995 zimbraReverseProxyAdminEnabled TRUE zimbraAdminProxyPort 19071
Selanjutnya, kita bisa buat self-signed SSL-nya untuk digunakan pada Zimbra. Pada pengujian kali ini kita gunakan masa aktif self-signed SSL-nya selama 10 tahun (3650 days).
/opt/zimbra/bin/zmcertmgr createca -new
/opt/zimbra/bin/zmcertmgr deployca
/opt/zimbra/bin/zmcertmgr createcrt -new -days 3650
/opt/zimbra/bin/zmcertmgr deploycrt self
Konfigurasi HAProxy
Instalasi:
- Ubuntu/Debian:
apt update && apt install haproxy -y - Rocky/RHEL-related:
dnf install haproxy -y
Backup terlebih dahulu file konfigurasi default HAProxy-nya.
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-backup
Kita lanjut edit filenya (/etc/haproxy/haproxy.cfg). Masukkan konfigurasi berikut (atau ditimpa – sesuaikan juga IP lokalnya):
global
log /dev/log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
ssl-default-bind-options ssl-min-ver TLSv1.2
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:TLS_AES_256_GCM_SHA384:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:3DES
ssl-server-verify none
tune.ssl.default-dh-param 2048
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
maxconn 3000
listen webmail
bind *:443 name webssl ssl crt /opt/zimbra/ssl/zimbra/commercial/ssl.pem
mode http
option tcplog
option tcp-check
log global
option forwardfor
balance roundrobin
cookie SERVER insert indirect nocache
server lokal1 192.168.1.100:1443 cookie lokal1 ssl verify none
listen zimbra-admin
bind *:9071 name webssl ssl crt /opt/zimbra/ssl/zimbra/commercial/ssl.pem
mode http
acl is_root path -i /
http-request redirect location /zimbraAdmin/ if is_root
http-response replace-header Location (.*):19071(.*) \1:9071\2
option tcplog
option tcp-check
log global
option forwardfor
balance roundrobin
cookie SERVER insert indirect nocache
server lokal1 192.168.1.100:19071 cookie lokal1 ssl verify none
listen pop3s
bind *:995 name pop3ssl ssl crt /opt/zimbra/ssl/zimbra/commercial/ssl.pem
mode tcp
option tcplog
balance leastconn
stick store-request src
stick-table type ip size 200k expire 30m
server lokal 192.168.1.100:1995 send-proxy ssl verify none
listen imaps
bind *:993 name imapssl ssl crt /opt/zimbra/ssl/zimbra/commercial/ssl.pem
mode tcp
option tcplog
balance leastconn
stick store-request src
stick-table type ip size 200k expire 30m
server lokal 192.168.1.100:1993 send-proxy ssl verify none
listen smtp-ssl
bind *:465 name smtpssl ssl crt /opt/zimbra/ssl/zimbra/commercial/ssl.pem
mode tcp
option tcplog
balance leastconn
stick store-request src
stick-table type ip size 200k expire 30m
server lokal 192.168.1.100:466 send-proxy
listen smtp-submission
bind *:587
mode tcp
option tcplog
balance leastconn
stick store-request src
stick-table type ip size 200k expire 30m
server lokal 192.168.1.100:588 send-proxy
Persiapan SSL Komersial
SSL komersial yang dibutuhkan adalah file dalam format .pem. Isinya adalah (harus sesuai urutan) private key -> SSL utama -> CA bundle. File SSL dapat disimpan pada direktori /opt/zimbra/ssl/zimbra/commercial/ssl.pem.
Selain itu, salin file SSL utama ke file /opt/zimbra/conf/smtpd.crt, dan masukkan private key ke file /opt/zimbra/conf/smtpd.key.
Sesuaikan juga hak akses file SSL-nya.
chown -R zimbra:zimbra /opt/zimbra/ssl/zimbra/commercial /opt/zimbra/conf/smtpd.crt /opt/zimbra/conf/smtpd.key
Validasi
- Validasi konfigurasi HAProxy (Pastikan muncul respon Configuration file is valid.):
haproxy -c -f /etc/haproxy/haproxy.cfg - Restart Zimbra dan aktifkan HAProxy:
su - zimbra -c 'zmcontrol restart' systemctl enable haproxy systemctl restart haproxy - Verifikasi dapat dilakukan dari terminal maupun web browser.
openssl s_client -connect mail.domainanda.com:443 openssl s_client -connect mail.domainanda.com:465 openssl s_client -connect mail.domainanda.com:993
Tulisan kali ini sampai di sini dulu ya. Sampai jumpa. Bye.