Konfigurasi HAProxy di Zimbra (untuk SSL offloading)

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.

By Zaidan

Leave a Reply

Your email address will not be published. Required fields are marked *