Postfix ile LDAP Entegrasyonu: Adım Adım Yapılandırma Rehberi

Büyük ölçekli bir mail altyapısında kullanıcı hesaplarını tek tek Postfix konfigürasyonuna eklemek hem zahmetli hem de sürdürülemez bir yaklaşım. Şirketinizde 500 kullanıcı varsa ve bunların hepsini aliases dosyasına yazmaya çalışıyorsanız, muhtemelen birkaç gün sonra saçlarınızı yolmaya başlarsınız. İşte tam bu noktada LDAP entegrasyonu devreye giriyor. Postfix, OpenLDAP veya Active Directory üzerinden kullanıcı bilgilerini dinamik olarak sorgulayabilir; yeni kullanıcı eklendiğinde ya da silindiğinde mail sisteminiz otomatik olarak güncel kalır. Bu yazıda gerçek bir şirket senaryosu üzerinden Postfix-LDAP entegrasyonunu adım adım ele alacağız.

Neden LDAP Entegrasyonu?

Klasik Postfix kurulumlarında kullanıcı bilgileri genellikle /etc/aliases, virtual ya da virtual_mailbox_maps dosyalarında tutulur. Küçük ekipler için bu yöntem yeterlidir, ancak ölçek büyüdüğünde sorunlar da büyür.

LDAP entegrasyonunun sağladığı avantajlar:

  • Merkezi yönetim: Kullanıcı bilgileri tek bir noktadan yönetilir, birden fazla servisi ayrı ayrı güncellemenize gerek kalmaz.
  • Gerçek zamanlı güncelleme: LDAP’e eklenen yeni kullanıcı anında mail alabilir hale gelir.
  • Active Directory uyumu: Windows tabanlı kurumsal ortamlarda AD üzerindeki hesaplar doğrudan kullanılabilir.
  • Güvenlik: Kullanıcı devre dışı bırakıldığında mail teslimatı da otomatik olarak durur.
  • Ölçeklenebilirlik: Binlerce kullanıcı için bile performans sorunu yaşanmaz.

Senaryo olarak şunu varsayalım: example.com domaininde çalışan bir şirket, OpenLDAP kullanıyor ve tüm çalışanların mail hesaplarını LDAP üzerinden yönetmek istiyor. Postfix sunucumuz Ubuntu 22.04 üzerinde çalışıyor.

Ön Gereksinimler ve Ortam Hazırlığı

Başlamadan önce birkaç şeyin hazır olması gerekiyor. Postfix’in LDAP paketini yükleyelim:

apt update
apt install postfix postfix-ldap libsasl2-modules-ldap ldap-utils -y

LDAP bağlantısını test etmek için ldap-utils paketinden ldapsearch aracını kullanacağız. Önce LDAP sunucusuna bağlanabildiğimizi doğrulayalım:

ldapsearch -x -H ldap://ldap.example.com 
  -D "cn=postfix,ou=service-accounts,dc=example,dc=com" 
  -w "ServicePassword123" 
  -b "ou=users,dc=example,dc=com" 
  "(objectClass=inetOrgPerson)" mail uid

Bu komutun çıktısında kullanıcıların mail ve uid attribute’larını görebiliyorsanız LDAP bağlantısı sağlıklı demektir. Eğer hata alıyorsanız ldap.example.com adresine olan ağ erişimini, bind DN bilgilerini ve arama tabanını kontrol edin.

LDAP yapımızın şöyle olduğunu varsayalım:

  • Base DN: dc=example,dc=com
  • Kullanıcı OU: ou=users,dc=example,dc=com
  • Servis hesabı: cn=postfix,ou=service-accounts,dc=example,dc=com
  • Mail attribute: mail
  • Kullanıcı adı attribute: uid

Postfix LDAP Yapılandırma Dosyaları

Postfix, LDAP sorgularını ayrı konfigürasyon dosyaları üzerinden yönetir. Bu dosyalar genellikle /etc/postfix/ altında .cf uzantısıyla tutulur. Her harita (map) için ayrı bir dosya oluşturmanız hem düzeni korur hem de hata ayıklamayı kolaylaştırır.

Oluşturacağımız dosyalar:

  • ldap_virtual_mailbox_domains.cf: Hangi domainlerin bu sunucu tarafından yönetileceğini belirler
  • ldap_virtual_mailbox_maps.cf: Mail adresi-kullanıcı eşleştirmesi
  • ldap_virtual_alias_maps.cf: Alias ve yönlendirme eşleştirmeleri

Virtual Mailbox Domains

cat > /etc/postfix/ldap_virtual_mailbox_domains.cf << 'EOF'
server_host = ldap://ldap.example.com
server_port = 389
search_base = ou=domains,dc=example,dc=com
query_filter = (&(objectClass=domainRelatedObject)(associatedDomain=%s))
result_attribute = associatedDomain
bind = yes
bind_dn = cn=postfix,ou=service-accounts,dc=example,dc=com
bind_pw = ServicePassword123
version = 3
timeout = 10
EOF

Virtual Mailbox Maps

Bu dosya, gelen bir mail adresinin sistemde gerçekten var olup olmadığını kontrol eder. Postfix bir mail aldığında önce bu sorguyu çalıştırır ve bir sonuç döndüğünde teslim işlemini başlatır:

cat > /etc/postfix/ldap_virtual_mailbox_maps.cf << 'EOF'
server_host = ldap://ldap.example.com
server_port = 389
search_base = ou=users,dc=example,dc=com
query_filter = (&(objectClass=inetOrgPerson)(mail=%s)(!(pwdAccountLockedTime=*)))
result_attribute = mail
result_format = %d/%u/
bind = yes
bind_dn = cn=postfix,ou=service-accounts,dc=example,dc=com
bind_pw = ServicePassword123
version = 3
cache = no
timeout = 10
EOF

query_filter içindeki !(pwdAccountLockedTime=*) ifadesine dikkat edin. Bu filtre, kilitlenen LDAP hesaplarına mail teslim edilmesini engeller. Devre dışı bırakılan çalışanların hesaplarına mail gelmeye devam etmesini istemiyorsanız bu filtre son derece önemli.

Virtual Alias Maps

cat > /etc/postfix/ldap_virtual_alias_maps.cf << 'EOF'
server_host = ldap://ldap.example.com
server_port = 389
search_base = ou=users,dc=example,dc=com
query_filter = (&(objectClass=inetOrgPerson)(mailAlias=%s))
result_attribute = mail
bind = yes
bind_dn = cn=postfix,ou=service-accounts,dc=example,dc=com
bind_pw = ServicePassword123
version = 3
timeout = 10
EOF

Bu yapılandırma sayesinde LDAP’te bir kullanıcının mailAlias attribute’una [email protected] yazarsanız, o adrese gelen mailler kullanıcının asıl mail adresine yönlendirilir.

Dosya izinlerini doğru ayarlamayı unutmayın. Şifre içeren bu dosyalara yalnızca root erişebilmeli:

chown root:postfix /etc/postfix/ldap_*.cf
chmod 640 /etc/postfix/ldap_*.cf

main.cf Yapılandırması

LDAP harita dosyalarını oluşturduktan sonra Postfix’in ana yapılandırma dosyasını güncellememiz gerekiyor:

# /etc/postfix/main.cf içine eklenecek veya güncellenecek parametreler

postconf -e "virtual_mailbox_domains = ldap:/etc/postfix/ldap_virtual_mailbox_domains.cf"
postconf -e "virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf"
postconf -e "virtual_alias_maps = ldap:/etc/postfix/ldap_virtual_alias_maps.cf"
postconf -e "virtual_mailbox_base = /var/mail/vhosts"
postconf -e "virtual_minimum_uid = 100"
postconf -e "virtual_uid_maps = static:5000"
postconf -e "virtual_gid_maps = static:5000"

virtual_uid_maps ve virtual_gid_maps için statik değer kullanıyoruz. Bu, tüm sanal mailboxların tek bir sistem kullanıcısı altında çalışması anlamına gelir. Önce bu kullanıcıyı oluşturun:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail/vhosts -m
mkdir -p /var/mail/vhosts/example.com
chown -R vmail:vmail /var/mail/vhosts

LDAP Sorgularını Test Etme

Yapılandırmayı tamamladıktan sonra postmap komutuyla sorguları test edebilirsiniz. Bu, Postfix’i yeniden başlatmadan önce yapmanız gereken kritik bir adım:

# Domain sorgusunu test et
postmap -q "example.com" ldap:/etc/postfix/ldap_virtual_mailbox_domains.cf

# Kullanıcı sorgusunu test et
postmap -q "[email protected]" ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf

# Alias sorgusunu test et
postmap -q "[email protected]" ldap:/etc/postfix/ldap_virtual_alias_maps.cf

İlk komutun example.com döndürmesi, ikincisinin example.com/ahmet.yilmaz/ döndürmesi ve üçüncüsünün alias’ın işaret ettiği adresi döndürmesi beklenir. Eğer boş çıktı alıyorsanız LDAP sorgunuzu ve filter ifadesini gözden geçirin.

TLS ile Güvenli LDAP Bağlantısı

Üretim ortamında LDAP trafiğini şifrelemeniz şart. Hem plain LDAP hem de LDAPS seçeneklerini inceleyelim.

LDAPS (port 636) için yapılandırma dosyalarınızı şöyle güncelleyin:

cat > /etc/postfix/ldap_virtual_mailbox_maps.cf << 'EOF'
server_host = ldaps://ldap.example.com
server_port = 636
search_base = ou=users,dc=example,dc=com
query_filter = (&(objectClass=inetOrgPerson)(mail=%s)(!(pwdAccountLockedTime=*)))
result_attribute = mail
result_format = %d/%u/
bind = yes
bind_dn = cn=postfix,ou=service-accounts,dc=example,dc=com
bind_pw = ServicePassword123
version = 3
timeout = 10
start_tls = no
tls_ca_cert_file = /etc/ssl/certs/ca-certificates.crt
tls_require_cert = yes
EOF

StartTLS kullanmak istiyorsanız server_port = 389 ve start_tls = yes yapın. Self-signed sertifika kullanıyorsanız tls_require_cert = no diyebilirsiniz ama bu güvenlik açısından önerilmez. Sertifikayı sisteme ekleyip tls_require_cert = yes tutmak çok daha doğru.

Active Directory Entegrasyonu

Kurumsal ortamların büyük çoğunluğunda OpenLDAP değil, Microsoft Active Directory kullanılıyor. AD ile entegrasyon biraz farklı attribute yapısı gerektiriyor. AD’de kullanıcı hesapları için objectClass=user ve mail adresi için proxyAddresses ya da mail attribute’u kullanılır:

cat > /etc/postfix/ldap_virtual_mailbox_maps_ad.cf << 'EOF'
server_host = ldap://ad.example.com
server_port = 389
search_base = dc=example,dc=com
query_filter = (&(objectClass=user)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute = mail
result_format = %d/%u/
bind = yes
bind_dn = [email protected]
bind_pw = ServicePassword123
version = 3
timeout = 10
start_tls = yes
tls_ca_cert_file = /etc/ssl/certs/ca-certificates.crt
chase_referrals = no
EOF

userAccountControl:1.2.840.113556.1.4.803:=2 ifadesi, AD’de devre dışı bırakılmış hesapları filtreler. Bu sayede İK’nın hesabını kapattığı bir çalışana mail teslim edilmez. chase_referrals = no ise AD ortamında sık karşılaşılan referral döngüsü sorununu önler.

AD üzerinde proxyAddresses attribute’unu kullanmak istiyorsanız query_filter’ı şöyle değiştirin:

query_filter = (&(objectClass=user)(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))

Bu şekilde kullanıcının birden fazla mail adresi olduğunda da doğru eşleştirme yapılır.

Grup Tabanlı Mail Dağıtımı

Kurumsal ortamlarda [email protected] gibi departman adreslerine gelen maillerin gruba dahil tüm kişilere iletilmesi gerekir. LDAP gruplarını Postfix alias’larına bağlamak için ayrı bir harita dosyası oluşturun:

cat > /etc/postfix/ldap_group_maps.cf << 'EOF'
server_host = ldap://ldap.example.com
server_port = 389
search_base = ou=groups,dc=example,dc=com
query_filter = (&(objectClass=groupOfNames)(mail=%s))
result_attribute = member
leaf_result_attribute = mail
bind = yes
bind_dn = cn=postfix,ou=service-accounts,dc=example,dc=com
bind_pw = ServicePassword123
version = 3
timeout = 10
EOF

Bu haritayı main.cf‘e ekleyin:

postconf -e "virtual_alias_maps = ldap:/etc/postfix/ldap_virtual_alias_maps.cf, ldap:/etc/postfix/ldap_group_maps.cf"

Postfix birden fazla haritayı virgülle ayırarak sırayla sorgular. İlk eşleşmede durur, bu yüzden öncelik sırası önemli.

Önbellek ve Performans Optimizasyonu

LDAP sorguları her mail tesliminde tetiklendiğinden, yüksek trafikli ortamlarda LDAP sunucusunu yorabilir. Postfix’in proxy map özelliğini kullanarak sorgu sonuçlarını önbelleğe alabilirsiniz.

master.cf dosyasında proxymap servisinin aktif olduğundan emin olun:

grep "proxymap" /etc/postfix/master.cf

Ardından main.cf‘te proxy map kullanın:

postconf -e "virtual_mailbox_maps = proxy:ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf"
postconf -e "virtual_alias_maps = proxy:ldap:/etc/postfix/ldap_virtual_alias_maps.cf"

proxy: ön eki eklendiğinde Postfix, aynı sorgu için birden fazla işlemin LDAP’e gitmesi yerine tek bir proxy süreci üzerinden yanıt almasını sağlar. Bu, özellikle burst trafiğinde belirgin bir performans artışı getirir.

Yaygın Sorunlar ve Çözümleri

Gerçek dünyada bu entegrasyonu kurarken en sık karşılaşılan sorunlar şunlar:

Boş sorgu sonuçları: postmap -q komutu boş dönüyorsa önce ldapsearch ile aynı filtreyi çalıştırın. Çoğu zaman sorun query_filter içindeki attribute adı hatasından kaynaklanır.

Bağlantı zaman aşımı: LDAP sunucusuna ağ erişimi yoksa Postfix mail kuyruğunu doldurmaya başlar. timeout değerini makul tutun (5-10 saniye) ve LDAP sunucusuna en az iki adet erişim adresini server_host içinde belirtin:

server_host = ldap://ldap1.example.com ldap://ldap2.example.com

Büyük/küçük harf sorunları: LDAP aramaları varsayılan olarak büyük/küçük harf duyarsızdır ama Postfix tarafında bazen sorun çıkabilir. query_filter içinde tolower() veya benzer bir çözüme ihtiyaç duyabilirsiniz.

Referral hataları: AD entegrasyonunda en sık görülen sorun. chase_referrals = no eklemek genellikle çözer.

Hata ayıklama için Postfix log seviyesini geçici olarak artırabilirsiniz:

postconf -e "loglevel_parameter = 4"
postfix reload
tail -f /var/log/mail.log

İşiniz bitince loglevel’ı eski haline getirmeyi unutmayın, yoksa log dosyalarınız çok hızlı büyür.

Yapılandırmayı Devreye Alma

Her şey hazır olduğunda Postfix’i yeniden yükleyin:

postfix check
postfix reload

postfix check komutu yapılandırma hatalarını önceden yakalar. Temiz çıktı verdikten sonra reload yapın. Test için bir mail gönderin ve logları izleyin:

echo "LDAP test maili" | mail -s "Test" [email protected]
tail -f /var/log/mail.log

Log çıktısında status=sent görüyorsanız entegrasyon başarıyla tamamlanmış demektir. status=bounced görüyorsanız hata mesajını inceleyin; genellikle User unknown ya da relay access denied mesajları spesifik bir probleme işaret eder.

Sonuç

Postfix ile LDAP entegrasyonu ilk bakışta karmaşık görünse de adımları sırayla uyguladığınızda oldukça tutarlı bir yapı ortaya çıkıyor. Kritik noktalara bir kez daha değinelim: servis hesabınızın şifresini içeren .cf dosyalarının izinlerini mutlaka kısıtlayın, üretim ortamında TLS olmadan plain LDAP kullanmayın ve LDAP sunucunuz için yük devretme (failover) mekanizması kurun. Tek bir LDAP sunucusu üzerinden bağımlılık oluşturmak, o sunucu gittiğinde mail akışınızın da durması anlamına gelir.

Entegrasyonu canlıya almadan önce mutlaka test ortamında deneyin. Özellikle userAccountControl veya pwdAccountLockedTime gibi hesap kilitleme filtrelerini doğrulayın; devre dışı hesaplara mail gitmemesi sadece güvenlik değil, depolama ve bakım açısından da önemli. LDAP yapınız değiştikçe Postfix tarafında değişiklik yapmanıza gerek kalmayacak, bu da uzun vadede yönetim yükünü ciddi ölçüde azaltacak.

Yorum yapın