Mengamankan SMTP Haraka dengan TLS Authentication (Zimbra LDAP)

Project kecil yang sedang saya kerjakan saat ini dan belum juga selesai 😀 adalah SMTP Haraka. Hari ini saya akan kembali menulis salah satu bagian kecil dari project yang saya kerjakan ini. Project kali ini memakan waktu cukup lama dalam pengerjaannya dikarenakan terbatasnya referensi yang ada, sehingga saya perlu melakukan pengoprekan terhadap SMTP Haraka ini. Salah satu contoh kasusnya adalah saat saya ingin Haraka menggunakan akun yang ada di Zimbra LDAP untuk autentikasi kiriman email dari luar. Untuk oprek SMTP Haraka dan Zimbra LDAP ini, saya membutuhkan waktu lebih kurang 1 bulan 😀 karena memang belum ada dokumentasi yang spesifik membahas hubungan antara SMTP Haraka dan Zimbra LDAP. Tapi tidak apa-apa, waktu 1 bulan worth it kok untuk memecahkan masalah ini 😀 .

Sebelumnya, saya sudah pernah menulis artikel/tutorial Haraka sejenis (Baca : Mengamankan SMTP Haraka dengan TLS Authentication (auth_flat_file)). Dalam tutorial tersebut saya menunjukkan bagaimana melakukan improvement terhadap keamanan SMTP Haraka dengan cara menutup koneksi incoming port 25 (Port plain tanpa autentikasi) dan menggantinya dengan port 587 (Port TLS dengan autentikasi), sehingga kiriman email via SMTP Haraka harus menggunakan autentikasi username dan password.

Metode auth_flat_file sebenarnya ok-ok saja jika teman-teman baru membangun cluster SMTP menggunakan Haraka only, tapi bagaimana jika teman-teman sudah punya cluster SMTP existing dengan berbagai macam engine SMTP serta username & password existing yang digunakan untuk autentikasi port 587? Tentu saja akan sangat merepotkan, karena teman-teman harus input secara manual username & password existing ke dalam file auth_flat_file Haraka. Nah solusinya adalah memusatkan semua username & password untuk autentikasi dalam 1 LDAP, dalam hal ini LDAP-nya Zimbra. Sysadmin cukup konfigurasi SMTP Haraka supaya mengambil username & password dari Zimbra LDAP tersebut, dan jika ada penambahan cukup dilakukan dari sisi Zimbra LDAP. Jadi Lebih simple dan mudah kan?

Selain itu, auth_flat_file juga tidak memiliki kemampuan untuk enkripsi (seperti namanya : flat) sehingga jika server disusupi dan file tersebut diambil maka semua username dan password yang ada bisa diketahui. Sedangkan password akun pada Zimbra LDAP sudah dienkripsi menggunakan hash sebelum dimasukkan ke dalam sebuah file, jadi walaupun file username & password didapatkan, password asli tidak bisa diketahui karena password pada file tersebut berbentuk hash. Sehingga secara prinsip lebih terjaga keamanannya.

Berikut merupakan langkah-langkah untuk konfigurasi Haraka supaya bisa mengambil autentikasi dari Zimbra LDAP.

Persiapan

Konfigurasi Haraka & Zimbra LDAP

  • Instal plugin LDAP tambahan untuk Haraka dengan perintah
    # npm install --prefix /usr/local/haraka haraka-plugin-ldap
    > dtrace-provider@0.8.8 install /usr/local/haraka/node_modules/dtrace-provider
    > node-gyp rebuild || node suppress-error.js
    
    make: Entering directory '/usr/local/haraka/node_modules/dtrace-provider/build'
      TOUCH Release/obj.target/DTraceProviderStub.stamp
    make: Leaving directory '/usr/local/haraka/node_modules/dtrace-provider/build'
    npm WARN saveError ENOENT: no such file or directory, open '/usr/local/haraka/package.json'
    npm notice created a lockfile as package-lock.json. You should commit this file.
    npm WARN enoent ENOENT: no such file or directory, open '/usr/local/haraka/package.json'
    npm WARN package No description
    npm WARN package No repository field.
    npm WARN package No README data
    npm WARN package No license field.
    
    + haraka-plugin-ldap@1.0.2
    added 39 packages from 90 contributors and audited 49 packages in 3.486s
    found 0 vulnerabilities
  • Aktifkan plugin LDAP tambahan dengan cara edit file plugins pada direktori /usr/local/haraka/config/plugins/ dan tambahkan teks berikut pada baris paling akhir
    ldap
  • Akses server Zimbra dan jalankan perintah berikut untuk mendapatkan password LDAP. Catat password LDAP karena akan digunakan untuk koneksi Haraka dengan Zimbra LDAP. Misalnya, disini password yang saya dapat adalah MtotP2OLZA
    # su - zimbra -c "zmlocalconfig -s | grep zimbra_ldap_password"
    zimbra_ldap_password = MtotP2OLZA
  • Kembali ke server Haraka. Buat file ldap.ini pada direktori /etc/service/haraka/config/ dengan pola sebagai berikut. Catatan : Sesuaikan bagian server, domain, LDAP password
    server[] = ldap://zimbra.colamen.id:389
    binddn = uid=zimbra,cn=admins,cn=zimbra
    bindpw = MtotP2OLZA 
    basedn = colamen.id
    scope = base
    
    [authn]
    scope = sub
    searchfilter = (&(objectClass=zimbraAccount)(ou:dn:=people))
    dn[] = uid=%u,ou=people,dc=colamen,dc=id
  • Restart service Haraka
    # systemctl restart haraka

Uji Coba Kirim Email via Port 587

  • Testing kirim email ke gmail.com menggunakan swaks dengan perintah berikut menggunakan username akun Zimbra (tanpa domain, misalnya akun admin@colamen.id, cukup ditulis admin) dan juga passwordnya
    # apt-get install swaks -y
    # swaks -s haraka.colamen.id -p 587 -tls -t muhammadraihan519@gmail.com -f raihan@colamen.id --auth-user admin --auth-password Password2020!
    === Trying 192.168.100.49:587...
    === Connected to 192.168.100.49.
    <- 220 haraka.colamen.id ESMTP Haraka/2.8.25 ready
    -> EHLO HP-Notebook
    <- 250-haraka.colamen.id Hello [192.168.100.13]Haraka is at your service.
    <- 250-PIPELINING
    <- 250-8BITMIME
    <- 250-SMTPUTF8
    <- 250-SIZE 0
    <- 250 STARTTLS
    -> STARTTLS
    <- 220 Go ahead.
    === TLS started with cipher TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256
    === TLS no local certificate set
    === TLS peer DN="/C=ID/ST=Jawa Barat/L=Bekasi/O=Colamen Inc/OU=IT Support/CN=*.colamen.id/emailAddress=support@colamen.id"
    ~> EHLO HP-Notebook
    <~ 250-haraka.colamen.id Hello [192.168.100.13]Haraka is at your service.
    <~ 250-PIPELINING
    <~ 250-8BITMIME
    <~ 250-SMTPUTF8
    <~ 250-SIZE 0
    <~ 250 AUTH PLAIN LOGIN
    ~> AUTH LOGIN
    <~ 334 VXNlcm5hbWU6
    ~> YWRtaW4=
    <~ 334 UGFzc3dvcmQ6
    ~> UmFoYXNpYTEyMyE=
    <~ 235 2.7.0 Authentication successful
    ~> MAIL FROM:<raihan@colamen.id>
    <~ 250 sender <raihan@colamen.id> OK
    ~> RCPT TO:<muhammadraihan519@gmail.com>
    <~ 250 recipient <muhammadraihan519@gmail.com> OK
    ~> DATA
    <~ 354 go ahead, make my day
    ~> Date: Thu, 07 May 2020 09:20:44 +0700
    ~> To: muhammadraihan519@gmail.com
    ~> From: raihan@colamen.id
    ~> Subject: test Thu, 07 May 2020 09:20:44 +0700
    ~> Message-Id: <20200507092044.003915@HP-Notebook>
    ~> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
    ~> 
    ~> This is a test mailing
    ~> 
    ~> .
    <~ 250 Message Queued (8E28B666-5096-42B3-8C7E-B1CE36BE8534.1)
    ~> QUIT
    <~ 221 haraka.colamen.id closing connection. Have a jolly good day.
    === Connection closed with remote host.

Leave a Reply

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