Integrasi LDAP ke Dovecot dan Postfix di Debian 13
Integrasi LDAP ke
Postfix & Dovecot
Full tutorial konfigurasi virtual mail server dengan LDAP authentication. Syntax Dovecot 2.4+ yang baru, step-by-step, beserta tips & tricks dari lapangan.
Overview & Arsitektur
Tutorial ini cover setup virtual mail server di Debian 13 menggunakan Postfix sebagai MTA, Dovecot sebagai IMAP/LMTP server, dan OpenLDAP sebagai backend autentikasi. Yang bikin setup ini berbeda: kita tidak pakai PAM — Dovecot query LDAP secara langsung (direct LDAP), lebih efisien dan modern.
vmail user (UID 9999) jadi "parent" yang mengelola semua maildir. Jauh lebih efisien untuk virtual mail setup.Prerequisites
mail_location diganti mail_driver + mail_path. Format passdb { driver = ldap } diganti passdb ldap { }. Variable %n dan %d diganti %{user|username} dan %{user|domain}. Tutorial ini sudah menggunakan syntax terbaru.Install Packages
# Install semua komponen yang dibutuhkan
# apt install postfix postfix-ldap dovecot-core dovecot-imapd dovecot-lmtpd
# Saat instalasi Postfix, pilih: Internet Site
# System mail name: konco.co.id
# Buat dedicated virtual mail user (PENTING!)
# groupadd -g 9999 vmail
# useradd -u 9999 -g 9999 -s /usr/sbin/nologin -d /var/vmail vmail
# Buat base maildir directory
# mkdir -p /var/vmail
# chown -R vmail:vmail /var/vmail
# chmod 700 /var/vmail
Konsep Virtual User
Sebelum masuk ke konfigurasi, penting untuk paham model virtual user yang kita pakai. Ini yang bikin setup ini efisien.
| Aspek | Virtual User (Direct LDAP) | System User (PAM) |
|---|---|---|
Entry di /etc/passwd |
Tidak ada (virtual) | Ada per-user |
| UID/GID management | 1 UID (vmail=9999) untuk semua | UID unik per user |
| SSH/Shell access | Tidak bisa (secure) | Bisa (perlu dibatasi) |
| Skalabilitas | 1000 user = 1 system entry | 1000 user = 1000 system entry |
| Cocok untuk | Mail-only service | Multi-service (SSH+mail+FTP) |
Konfigurasi Postfix
/etc/postfix/main.cf
Tambahkan/modifikasi directive berikut. Postfix perlu tahu bahwa user dikelola via LDAP dan delivery dilakukan via LMTP ke Dovecot.
# Format mailbox: Maildir (bukan mbox)
home_mailbox = Maildir/
# Virtual mailbox: base directory semua mail
virtual_mailbox_base = /var/vmail
# Domain yang dihandle (sesuaikan domain lu)
virtual_mailbox_domains = konco.co.id
# Lookup user di LDAP (file konfigurasi terpisah)
virtual_mailbox_maps = ldap:/etc/postfix/ldap-users.cf
# UID/GID semua virtual mailbox (harus match vmail user)
virtual_uid_maps = static:9999
virtual_gid_maps = static:9999
# Kirim ke Dovecot via LMTP unix socket
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Reject jika sender/recipient tidak terdaftar
smtpd_reject_unlisted_sender = yes
smtpd_reject_unlisted_recipient = yes
# Enable SASL authentication via Dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
# Relay restrictions: izinkan mynetworks & authenticated users
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
smtpd_reject_unlisted_sender hanya muncul sekali di main.cf. Kalau duplikat, Postfix hanya baca yang terakhir — bisa bikin konflik config yang subtle./etc/postfix/master.cf
Tambahkan service submissions untuk SMTPS (port 465 dengan TLS wrapper mode).
# Format kolom: service type private unpriv chroot wakeup maxproc command
# Tambahkan di akhir file:
submissions inet n - y - - smtpd
-o syslog_name=postfix/submissions
-o smtpd_tls_wrappermode=yes # SMTPS: TLS dari awal koneksi
-o smtpd_sasl_auth_enable=yes # Enable SASL di port ini
- artinya default (y = private). Kolom ke-5 (unpriv) y artinya jalankan sebagai non-root. Kolom ke-6 (chroot) y artinya chroot aktif. Pastikan format konsisten atau Postfix bisa throw error saat reload.LDAP Mapping Files
/etc/postfix/ldap-users.cf
File ini digunakan Postfix untuk lookup apakah recipient address valid di LDAP sebelum menerima email.
# LDAP server address
server_host = ldap://int-01.konco.co.id
# Search base: OU tempat mail user disimpan di LDAP
search_base = ou=mail,dc=konco,dc=co,dc=id
# Query filter: cari object dengan uid = local part email
# %u = local part dari address (john dari john@konco.co.id)
query_filter = (&(uid=%u)(objectClass=inetOrgPerson))
# Attribute yang dikembalikan (email address)
result_attribute = mail
# Search scope: subtree (cari rekursif di bawah search_base)
scope = sub
# Bind ke LDAP dengan credentials (bukan anonymous)
bind = yes
bind_dn = cn=admin,dc=konco,dc=co,dc=id
bind_pw = Skills39
# Test apakah Postfix bisa lookup user di LDAP
# postmap -q john@konco.co.id ldap:/etc/postfix/ldap-users.cf
# Output yang diharapkan:
# john@konco.co.id
# Kalau tidak ada output = user tidak ditemukan di LDAP
# Cek query_filter dan search_base
Konfigurasi Dovecot
/etc/dovecot/dovecot.conf
# Aktifkan protokol IMAP dan LMTP
protocols = imap lmtp
# Listen di semua interface (IPv4 & IPv6)
listen = *
/etc/dovecot/conf.d/10-auth.conf
# Larang autentikasi cleartext (tanpa TLS)
auth_allow_cleartext = no
# Enable debug auth (bagus untuk troubleshooting, nonaktifkan di production)
auth_debug = yes
# Include konfigurasi LDAP auth (pastikan baris ini ada, uncomment jika perlu)
!include auth-ldap.conf.ext
/etc/dovecot/conf.d/10-mail.conf
# Dovecot 2.4+: gunakan mail_driver bukan mail_location
mail_driver = maildir
# Path ke maildir — %{user|domain} = domain, %{user|username} = username
mail_path = /var/vmail/%{user|domain}/%{user|username}/Maildir
# Home directory user (parent dari Maildir)
mail_home = /var/vmail/%{user|domain}/%{user|username}
—
%d (domain) → %{user|domain}
—
%n atau %u (username) → %{user|username}
—
%u (full user@domain) → %{user}
/etc/dovecot/conf.d/10-master.conf
# Disable plain IMAP (port 143), hanya izinkan IMAPS (port 993)
service imap-login {
inet_listener imap {
port = 0 # 0 = disable
}
inet_listener imaps {
port = 993
ssl = yes
}
}
# Disable submission ports di Dovecot (Postfix yang handle)
service submission-login {
inet_listener submission {
port = 0 # 0 = disable
}
inet_listener submissions {
port = 0 # 0 = disable
}
}
# LMTP unix socket — Postfix kirim mail ke sini
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0666
user = postfix
group = postfix
}
}
# Auth socket untuk Dovecot userdb
service auth {
unix_listener auth-userdb {
mode = 0666
user = vmail
group = vmail
}
# Auth socket untuk Postfix SASL
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
}
# Stats writer permission (Dovecot 2.4+ requirement)
service stats {
unix_listener stats-writer {
mode = 0666
user = dovecot
group = vmail
}
}
/etc/dovecot/conf.d/10-ssl.conf
# Wajibkan SSL — koneksi tanpa TLS akan ditolak
ssl = required
# Path ke certificate dan private key (sesuaikan)
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
/etc/dovecot/conf.d/auth-ldap.conf.ext
File paling krusial — ini yang handle direct LDAP auth di Dovecot 2.4+ dengan syntax baru.
# passdb: verifikasi password user dari LDAP
# Syntax Dovecot 2.4+: "passdb ldap { }" bukan "passdb { driver = ldap }"
passdb ldap {
ldap_auth_dn = cn=admin,dc=konco,dc=co,dc=id # DN untuk bind ke LDAP
ldap_auth_dn_password = Skills39 # Password LDAP admin
ldap_uris = ldap://int-01.konco.co.id # URI LDAP server
ldap_base = ou=mail,dc=konco,dc=co,dc=id # Search base
ldap_version = 3 # LDAP v3
ldap_filter = (&(objectClass=inetOrgPerson)(uid=%{user|username}))
ldap_scope = subtree
fields {
password=%{ldap:userPassword} # Ambil password dari attribute userPassword
}
}
# userdb: ambil info user (home, uid, gid) dari LDAP
userdb ldap {
ldap_uris = ldap://int-01.konco.co.id
ldap_base = ou=mail,dc=konco,dc=co,dc=id
ldap_version = 3
ldap_filter = (&(objectClass=inetOrgPerson)(uid=%{user|username}))
ldap_scope = subtree
fields {
home=/var/vmail/%{user|domain}/%{user|username} # Home dir per user
uid = vmail # Semua mail file owned by vmail
gid = vmail # Group ownership: vmail
}
}
home= di userdb ldap fields sama persis dengan mail_home di 10-mail.conf. Kalau beda, Dovecot akan buat maildir di lokasi yang salah dan delivery bisa gagal.Setup vmail User & Permissions
# Buat group vmail dengan GID 9999
# groupadd -g 9999 vmail
# Buat user vmail: no shell, no login, home = /var/vmail
# useradd -u 9999 -g 9999 \
# -s /usr/sbin/nologin \
# -d /var/vmail \
# -c "Virtual Mail User" \
# vmail
# Buat base directory
# mkdir -p /var/vmail
# Set ownership ke vmail
# chown -R vmail:vmail /var/vmail
# Set permission: hanya vmail yang bisa masuk
# chmod 700 /var/vmail
# Verify
# id vmail
# uid=9999(vmail) gid=9999(vmail) groups=9999(vmail)
# ls -la /var/vmail
# drwx------ vmail vmail /var/vmail ← ini yang benar
Verifikasi & Testing
# Cek syntax Postfix — harus tidak ada error
# postfix check
# Cek syntax Dovecot — output = effective config
# doveconf -n
# Cek status service
# systemctl status postfix dovecot
# Test lookup user di LDAP via Postfix
# postmap -q john@konco.co.id ldap:/etc/postfix/ldap-users.cf
# Expected output: john@konco.co.id
# Kalau kosong: user tidak ditemukan di LDAP
# Cek query_filter, search_base, dan LDAP objectClass
# Test autentikasi Dovecot untuk user john@konco.co.id
# doveadm auth test john@konco.co.id passwordnya
# Expected output:
# passdb: john@konco.co.id auth succeeded
# extra fields: user=john@konco.co.id home=/var/vmail/konco.co.id/john
# Test user info lookup
# doveadm user john@konco.co.id
# Expected: uid=9999, gid=9999, home=/var/vmail/konco.co.id/john
# Kirim test email
$ echo "Test mail delivery" | mail -s "Test Subject" john@konco.co.id
# Cek apakah maildir sudah terbuat
# ls -la /var/vmail/konco.co.id/john/Maildir/new/
# Harus ada file email baru di sini
# Cek Postfix mail log
# tail -f /var/log/mail.log
# Cari: status=sent (250 2.0.0 OK)
# Cek semua port mail yang listening
# ss -tlnp | grep -E "25|143|465|587|993"
# Expected output:
# tcp LISTEN *:25 (postfix smtpd)
# tcp LISTEN *:465 (postfix submissions)
# tcp LISTEN *:993 (dovecot imaps)
Tips & Tricks
auth_debug = yes di 10-auth.conf sementara, lalu tail -f /var/log/dovecot/dovecot.log. Log akan show detail setiap langkah LDAP query. Matikan setelah troubleshooting selesai (overhead di production).home= di userdb ldap fields harus sama persis dengan mail_home di 10-mail.conf. Kalau beda, Dovecot akan buat maildir di lokasi yang berbeda dan email tidak akan ditemukan saat login IMAP.dovecot-lmtp dan private/auth) — kalau Postfix start duluan, socket belum ada dan service bisa error./var/spool/postfix/private/ harus bisa dibaca Postfix. Set mode = 0666, user = postfix, group = postfix. Kalau permission salah, LMTP delivery akan gagal dengan error "Connection refused".ldap-users.cf dan auth-ldap.conf.ext berisi bind_pw dan ldap_auth_dn_password. Tambahkan ke .gitignore dan set permission chmod 600 di kedua file tersebut agar hanya root yang bisa baca.ldapsearch -x -H ldap://int-01.konco.co.id -D "cn=admin,dc=konco,dc=co,dc=id" -w Skills39 -b "ou=mail,dc=konco,dc=co,dc=id" "(uid=john)". Kalau ini gagal, masalahnya ada di LDAP, bukan di Postfix/Dovecot.doveconf -n menampilkan semua config yang aktif (non-default). Gunakan ini untuk memastikan nilai yang Dovecot benar-benar baca, bukan yang lu tulis. Jauh lebih reliable daripada buka file satu-satu.Troubleshooting Quick Reference
## MASALAH: User tidak bisa login IMAP
# Cek Dovecot auth log
# tail -100 /var/log/dovecot/dovecot.log | grep "john@konco.co.id"
# Cek apakah user exist di LDAP
# doveadm user john@konco.co.id
## MASALAH: Email tidak terdeliver (bounce)
# Cek Postfix log
# tail -50 /var/log/mail.log | grep "john@konco.co.id"
# Test LDAP lookup dari Postfix
# postmap -q john@konco.co.id ldap:/etc/postfix/ldap-users.cf
## MASALAH: "SASL authentication failed"
# Cek apakah Dovecot auth socket exists
# ls -la /var/spool/postfix/private/auth
# Restart Dovecot dulu, baru Postfix
# systemctl restart dovecot && systemctl restart postfix
## MASALAH: "Permission denied" saat delivery LMTP
# Cek permission socket LMTP
# ls -la /var/spool/postfix/private/dovecot-lmtp
# Harus: srw-rw-rw- root postfix
# systemctl restart dovecot
## MASALAH: Maildir tidak terbuat
# Cek ownership /var/vmail
# ls -la /var/vmail/
# Harus: drwx------ vmail vmail
# chown -R vmail:vmail /var/vmail && chmod 700 /var/vmail
Glosarium
/etc/passwd). Hanya ada di LDAP, tapi bisa kirim/terima email.cur/, new/, tmp/. Lebih aman dari mbox.uid, mail, dan userPassword.
Comments
Post a Comment