Mail sunucusu kurmak bir şeydir, onu güvenli hale getirmek bambaşka bir iştir. Postfix’i ilk kurduğunuzda her şey çalışıyor gibi görünebilir, ama kimlik doğrulama olmadan açık bir relay kurmuş olursunuz ve bu da sunucunuzun spam fabrikasına dönüşmesi anlamına gelir. Bu yazıda Postfix üzerinde SMTP Auth’u nasıl düzgün konfigüre edeceğinizi, Cyrus SASL ile nasıl entegre edeceğinizi ve gerçek dünya senaryolarında karşılaşılan sorunları nasıl çözeceğinizi ele alacağım.
SMTP Kimlik Doğrulama Neden Bu Kadar Önemli?
Açık relay kavramını bilmeyenler için kısaca açıklayayım: Eğer SMTP sunucunuz herkesin kimlik doğrulamadan mail gönderebileceği şekilde yapılandırılmışsa, tüm dünya sizin sunucunuzu kullanarak spam gönderebilir. Birkaç saat içinde IP adresiniz kara listeye girer, meşru mailleriniz hiçbir yere ulaşamaz hale gelir ve hosting sağlayıcınız sizi aramaya başlar.
SMTP Auth (SMTP Authentication), RFC 4954 standardıyla tanımlanmış bir mekanizmadır. Kullanıcılar mail göndermeden önce kullanıcı adı ve parola ile kendilerini doğrularlar. Postfix bu işlemi doğrudan yapmaz, bunun için Cyrus SASL (Simple Authentication and Security Layer) kütüphanesini kullanır. Bu ayrımı anlamak konfigürasyon sürecini çok daha mantıklı hale getirir.
Gerekli Paketlerin Kurulumu
Ubuntu/Debian tabanlı sistemlerde başlayalım:
apt update
apt install postfix libsasl2-2 libsasl2-modules sasl2-bin
RHEL/CentOS/Rocky Linux için:
dnf install postfix cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5
Kurulum sonrası hangi SASL plugin’lerinin mevcut olduğunu kontrol etmek iyi bir alışkanlıktır:
saslauthd --version
ls /usr/lib/sasl2/
# veya
ls /usr/lib/x86_64-linux-gnu/sasl2/
Cyrus SASL Yapılandırması
SASL daemon’ı olan saslauthd servisi, kimlik doğrulama isteklerini işler. Bu servisi yapılandırmadan önce hangi authentication mekanizmasını kullanacağınıza karar vermeniz gerekir.
En yaygın seçenekler:
- pam: Sistem PAM modüllerini kullanır, sistem kullanıcılarıyla authentication yapar
- shadow: /etc/shadow dosyasını doğrudan okur
- sasldb: Kendi veritabanını kullanır, sistem kullanıcılarından bağımsız çalışır
- ldap: LDAP/Active Directory entegrasyonu için
Debian/Ubuntu’da /etc/default/saslauthd dosyasını düzenleyin:
nano /etc/default/saslauthd
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/run/saslauthd"
RHEL tabanlı sistemlerde /etc/sysconfig/saslauthd dosyası kullanılır:
SOCKETDIR=/run/saslauthd
MECH=pam
FLAGS=
Şimdi Postfix’in SASL socket’ine erişebilmesi için postfix kullanıcısını sasl grubuna ekleyin. Bu adımı atlayanların yaşadığı “permission denied” hatası en klasik problemlerden biridir:
usermod -aG sasl postfix
saslauthd’yi başlatın ve boot’ta otomatik çalışmasını sağlayın:
systemctl enable saslauthd
systemctl start saslauthd
Postfix SASL Entegrasyon Konfigürasyonu
Postfix, SASL ile haberleşmek için kendi konfigürasyon dosyasına ihtiyaç duyar. Bu dosyayı oluşturun:
nano /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
log_level: 3
mech_list satırına dikkat edin. PLAIN ve LOGIN mekanizmaları şifrelenmemiş olarak parola iletir, bu yüzden bunları sadece TLS ile birlikte kullanmalısınız. DIGEST-MD5 veya CRAM-MD5 kullanmak isterseniz ekleyebilirsiniz, ancak modern istemcilerin çoğu bunları desteklemez ve gereksiz karmaşıklık yaratır. TLS + PLAIN kombinasyonu pratikte en temiz çözümdür.
Postfix main.cf Konfigürasyonu
Şimdi işin kalbi olan main.cf konfigürasyonuna geliyoruz. /etc/postfix/main.cf dosyasına aşağıdaki satırları ekleyin ya da mevcut değerleri güncelleyin:
# SASL Authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
# SASL ile ilgili kısıtlamalar
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
# TLS zorunluluğu (önerilir)
smtpd_tls_auth_only = yes
Bu parametrelerin ne anlama geldiğine bakalım:
- smtpd_sasl_auth_enable: SASL authentication’ı aktif eder
- smtpd_sasl_security_options:
noanonymousanonim girişleri engeller,noplaintextise şifrelenmemiş mekanizmaları devre dışı bırakır (TLS kullanıyorsanız buna gerek yoktur) - smtpd_sasl_local_domain: Authentication realm’ını belirler
- broken_sasl_auth_clients: Eski Microsoft Outlook istemcileri gibi RFC’ye tam uymayan istemcilerle uyumluluk sağlar
- smtpd_tls_auth_only: Authentication’ı sadece TLS bağlantıları üzerinden kabul eder, bu kritik bir güvenlik ayarıdır
Değişiklikleri uygulamak için Postfix’i yeniden yükleyin:
postfix reload
# veya
systemctl reload postfix
TLS ile Güvenli Authentication
Production ortamında SMTP Auth’u asla düz TCP üzerinden kullanmayın. TLS sertifikanızı zaten yapılandırmış olduğunuzu varsayarak gerekli main.cf ayarlarına bakalım:
# TLS Konfigürasyonu
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# Authentication sadece TLS üzerinden
smtpd_tls_auth_only = yes
Port 587 (submission) üzerinden authentication için master.cf dosyasını da düzenlemeniz gerekir:
nano /etc/postfix/master.cf
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=cyrus
-o smtpd_sasl_path=smtpd
-o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
Port 465 (smtps, SSL/TLS wrapper mode) için:
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
Test Ortamı ve Doğrulama
Konfigürasyonu test etmeden geçmeyin. Önce testsaslauthd komutuyla SASL authentication’ın çalıştığını doğrulayın:
testsaslauthd -u testuser -p testpassword -s smtp
# 0: OK "Success."
Eğer hata alıyorsanız socket path’ini belirterek deneyin:
testsaslauthd -u testuser -p testpassword -s smtp -f /var/run/saslauthd/mux
Şimdi Postfix’in SMTP Auth sunduğunu doğrulamak için openssl ile bağlanalım:
openssl s_client -connect mail.example.com:587 -starttls smtp
Bağlantı kurulduktan sonra aşağıdaki gibi bir çıktı görmelisiniz:
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN LOGIN satırını görüyorsanız her şey yolunda demektir. Manuel test yapmak için Base64 encoded credentials hazırlayın:
echo -ne '00testuser00testpassword' | base64
# Çıktı: AHRlc3R1c2VyAHRlc3RwYXNzd29yZA==
Sonra SMTP oturumunda:
AUTH PLAIN AHRlc3R1c2VyAHRlc3RwYXNzd29yZA==
235 2.7.0 Authentication successful
sasldb Kullanımı (Sistem Kullanıcılarından Bağımsız)
Sistem kullanıcıları yerine ayrı bir veritabanı tutmak istiyorsanız sasldb mekanizması işe yarar. Bu özellikle mail kullanıcılarını sistem kullanıcılarından ayırt etmek istediğinizde kullanışlıdır:
# Kullanıcı ekle
saslpasswd2 -c -u example.com ahmet
# Parola sormadan eklemek için:
echo "supersecretpassword" | saslpasswd2 -c -u example.com mehmet -p
# Kullanıcıları listele
sasldblistusers2
# Kullanıcı sil
saslpasswd2 -d -u example.com eski_kullanici
# Parola değiştir
saslpasswd2 -u example.com ahmet
sasldb kullanmak için /etc/postfix/sasl/smtpd.conf dosyasını güncelleyin:
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: /etc/sasldb2
mech_list: PLAIN LOGIN DIGEST-MD5 CRAM-MD5
sasldb2 dosyasını Postfix’in okuyabilmesi için izinleri ayarlayın:
chown postfix:postfix /etc/sasldb2
chmod 640 /etc/sasldb2
/etc/default/saslauthd veya /etc/sysconfig/saslauthd içindeki MECHANISMS değerini sasldb olarak değiştirip servisi yeniden başlatın.
Gerçek Dünya Senaryoları ve Sorun Giderme
Senaryo 1: “SASL authentication failure: Password verification failed”
Bu hatanın en yaygın nedeni PAM konfigürasyon sorunudur. /etc/pam.d/smtp dosyasını kontrol edin:
cat /etc/pam.d/smtp
# veya
cat /etc/pam.d/saslauthd
Dosya yoksa oluşturun:
cat > /etc/pam.d/smtp << 'EOF'
auth required pam_unix.so
account required pam_unix.so
EOF
Senaryo 2: Outlook Bağlanamıyor
Bazı eski Outlook sürümleri broken_sasl_auth_clients = yes ayarını gerektiren non-standard AUTH advertisement kullanır. Bu ayarı main.cf‘e ekleyin ve Postfix’i yeniden yükleyin. 250-AUTH=PLAIN LOGIN satırını (= işaretiyle) görüyorsanız bu uyumluluk modu aktif demektir.
Senaryo 3: “relay access denied” Hatası
Authenticated kullanıcılar mail gönderemiyor ama reject alıyorsa, smtpd_relay_restrictions veya smtpd_recipient_restrictions parametrelerinizi kontrol edin. permit_sasl_authenticated mutlaka reject_unauth_destination‘dan önce gelmelidir:
postconf smtpd_relay_restrictions
postconf smtpd_recipient_restrictions
Postfix loglarını anlık izlemek için:
tail -f /var/log/mail.log | grep -E "(sasl|auth|reject)"
Daha detaylı debug için Postfix log seviyesini geçici olarak artırabilirsiniz:
postconf -e "smtpd_tls_loglevel=2"
postfix reload
# Test sonrası eski haline döndürün
postconf -e "smtpd_tls_loglevel=1"
postfix reload
Senaryo 4: Rate Limiting ile Brute Force Koruması
Kimlik doğrulama kaba kuvvet saldırılarına karşı savunmasız olabilir. main.cf‘e aşağıdaki kısıtlamaları ekleyin:
# Başarısız auth limitasyonu
smtpd_client_auth_rate_limit = 10
anvil_rate_time_unit = 60s
smtpd_client_connection_rate_limit = 10
smtpd_client_connection_count_limit = 10
Bunun yanında fail2ban ile Postfix auth hatalarını izleyip IP banlamak production’da vazgeçilmezdir:
# fail2ban postfix-sasl jail aktifleştirme
cat /etc/fail2ban/jail.d/postfix-sasl.conf
[postfix-sasl]
enabled = true
port = smtp,submission,465
filter = postfix-sasl
logpath = /var/log/mail.log
maxretry = 5
bantime = 3600
findtime = 600
Konfigürasyonu Test Etme ve Doğrulama
Her şeyi yapılandırdıktan sonra kapsamlı bir kontrol listesi üzerinden geçin:
# Postfix konfigürasyonunu kontrol et
postfix check
# SASL ile ilgili ayarları görüntüle
postconf -n | grep sasl
# Çalışan servisleri kontrol et
systemctl status postfix saslauthd
# Mail kuyruğunu kontrol et
mailq
# SMTP portlarının dinlendiğini doğrula
ss -tlnp | grep -E "(25|587|465)"
Mail log’larında başarılı bir authentication şöyle görünür:
postfix/smtpd[12345]: NOQUEUE: client=unknown[192.168.1.100], sasl_method=PLAIN, [email protected]
Eğer sasl_method ve sasl_username alanlarını log’larda görüyorsanız SMTP Auth düzgün çalışıyor demektir.
Özet ve Önerilen Konfigürasyon
Tüm bu yapılandırmaları bir araya getirdiğinizde kontrol etmeniz gereken dosyalar şunlardır:
- /etc/default/saslauthd veya /etc/sysconfig/saslauthd: SASL daemon mekanizması
- /etc/postfix/sasl/smtpd.conf: Postfix SASL entegrasyon ayarları
- /etc/postfix/main.cf: Ana Postfix konfigürasyonu
- /etc/postfix/master.cf: Port 587 ve 465 servisleri
Güvenlik açısından kesinlikle uygulamanız gereken birkaç nokta var: TLS olmadan AUTH kabul etmeyin, smtpd_tls_auth_only = yes ayarını açın, fail2ban kullanın ve authentication loglarını düzenli takip edin. sasldb kullanıyorsanız güçlü parolalar zorunlu tutun ve kullanılmayan hesapları temizleyin.
Sonuç
Postfix SMTP Auth kurulumu ilk bakışta karmaşık görünse de aslında birbirine bağlı birkaç bileşenden oluşuyor: Postfix, Cyrus SASL ve PAM ya da sasldb. Bu bileşenlerin birbirini nasıl çağırdığını kavradığınızda konfigürasyon mantığı oturmuş oluyor.
Production ortamında mutlaka TLS ile birlikte kullanın, fail2ban ile brute force korumasını aktif edin ve logları düzenli takip edin. Açık relay bırakmak dakikalar içinde IP reputasyonunuzu mahvedebilir, doğru yapılandırılmış bir mail sunucusu ise yıllarca sorunsuz çalışır. Sorun yaşarsanız her zaman ilk bakılacak yer tail -f /var/log/mail.log komutunun çıktısıdır, neredeyse her hatanın cevabı oradadır.