Mail sunucunuzu kurup çalıştırdınız, DNS kayıtlarınızı ayarladınız, ama kullanıcılarınız hala “Authentication failed” hatası alıyor. Ya da daha kötüsü, sunucunuz open relay olarak çalışıyor ve spam listelere girdiniz. Exim’de kimlik doğrulama yapılandırması, hem güvenlik hem de kullanılabilirlik açısından kritik bir adım. Bu yazıda Exim SMTP kimlik doğrulamasını A’dan Z’ye ele alacağız.
SMTP Kimlik Doğrulama Nedir ve Neden Önemlidir?
SMTP kimlik doğrulama, mail istemcilerinin sunucunuza bağlanırken kendilerini kanıtlamasını sağlar. Temel olarak iki senaryoda kullanılır:
- Outbound mail gönderimi: Kullanıcılarınızın mail istemcisi (Outlook, Thunderbird vb.) üzerinden mail göndermesi
- Relay kontrolü: Sadece yetkili kullanıcıların sunucunuzu üçüncü kişilere mail göndermek için kullanması
Kimlik doğrulama olmadan sunucunuz açık röle haline gelir ve dünya genelindeki spam gönderenler için ücretsiz bir altyapıya dönüşür. Bu durumda kara listeye girmek an meselesidir.
Exim, kimlik doğrulama için SASL (Simple Authentication and Security Layer) protokolünü kullanır ve birden fazla mekanizmayı destekler.
Exim Yapılandırma Dosyasına Genel Bakış
Başlamadan önce Exim’in yapılandırma yapısını netleştirelim. Genellikle iki farklı yapıyla karşılaşırsınız:
Tek dosya yapısı: /etc/exim/exim.conf veya /etc/exim4/exim4.conf
Bölünmüş yapı (Debian/Ubuntu): /etc/exim4/conf.d/ dizini altında parçalı dosyalar
Debian tabanlı sistemlerde update-exim4.conf komutu bu parçaları birleştirir. Yapılandırma değişikliklerinizi test etmek için her zaman şu komutu çalıştırın:
exim -bV
# Veya daha detaylı test için:
exim -C /etc/exim4/exim4.conf -bV
Yapılandırmayı uygulamadan önce sözdizimi hatalarını yakalamak için:
exim -bV 2>&1 | grep -i error
Temel Kimlik Doğrulama Mekanizmaları
Exim’de en yaygın kullanılan kimlik doğrulama mekanizmaları şunlardır:
- PLAIN: Kullanıcı adı ve parola base64 kodlanmış olarak gönderilir. TLS olmadan kullanmak tehlikelidir.
- LOGIN: PLAIN’e benzer ama iki adımlı bir dialog kullanır. Eski istemcilerle uyumludur.
- CRAM-MD5: Parola hiçbir zaman açık gönderilmez, challenge-response mekanizması kullanılır. Daha güvenlidir ama sunucu tarafında düz metin parola saklamayı gerektirir.
- DIGEST-MD5: CRAM-MD5’in daha gelişmiş versiyonu, modern sistemlerde nadiren kullanılır.
Pratikte çoğu kurulum PLAIN ve LOGIN mekanizmalarını TLS ile birlikte kullanır. Bu kombinasyon hem güvenli hem de tüm istemcilerle uyumludur.
Passwd Dosyası ile Basit Kimlik Doğrulama
En basit yöntemden başlayalım: Exim’in kendi passwd dosyasını kullanmak. Bu yöntem küçük kurulumlar için idealdir.
Önce parola dosyasını oluşturun:
# Parola dosyası oluştur
touch /etc/exim4/passwd
chmod 640 /etc/exim4/passwd
chown root:Debian-exim /etc/exim4/passwd
# Kullanıcı ekle (format: kullanici:sifre_hash)
# SHA-256 hash oluşturmak için:
echo -n "gizliparola" | sha256sum
# Veya openssl ile:
openssl passwd -6 "gizliparola"
Parola dosyasının formatı şöyledir:
# /etc/exim4/passwd
# Format: kullanici:hash:real_name (yorum satırları # ile başlar)
ahmet:{SHA256}5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
mehmet:$6$rounds=5000$salt$hashdeğeri
[email protected]:{SHA256}başkabir_hash_değeri
Şimdi Exim yapılandırmasına authenticator bloğunu ekleyelim:
# /etc/exim4/exim4.conf veya conf.d/auth/ dizinindeki ilgili dosyaya ekle
begin authenticators
PLAIN:
driver = plaintext
server_set_id = $auth2
server_prompts = :
server_condition =
${if and {
{!eq{$auth2}{}}
{!eq{$auth3}{}}
{crypteq{$auth3}{${extract{1}{:}{${lookup{$auth2}lsearch{/etc/exim4/passwd}{$value}{*:*}}}}}}
} {yes}{no}}
server_advertise_condition = ${if def:tls_in_cipher}
LOGIN:
driver = plaintext
server_set_id = $auth1
server_prompts = Username:: : Password::
server_condition =
${if and {
{!eq{$auth1}{}}
{!eq{$auth2}{}}
{crypteq{$auth2}{${extract{1}{:}{${lookup{$auth1}lsearch{/etc/exim4/passwd}{$value}{*:*}}}}}}
} {yes}{no}}
server_advertise_condition = ${if def:tls_in_cipher}
Buradaki server_advertise_condition direktifi çok önemli. ${if def:tls_in_cipher} ifadesi, kimlik doğrulama mekanizmalarının sadece TLS bağlantısında ilan edilmesini sağlar. TLS olmadan kullanıcı adı/parola gönderimini engeller.
PAM ile Sistem Kullanıcıları Üzerinden Kimlik Doğrulama
Eğer kullanıcılarınız Linux sistem hesaplarıyla eşleşiyorsa, PAM entegrasyonu mükemmel bir çözüm sunar. Bu sayede ayrı parola dosyası tutmanıza gerek kalmaz.
Önce gerekli paketi yükleyin:
# Debian/Ubuntu
apt-get install libpam-exim4
# RHEL/CentOS
yum install exim-pam
Exim’in PAM kullanabilmesi için binary’nin bu özellikle derlenmiş olması gerekir:
exim -bV | grep -i "Support for:"
# Çıktıda "Cryptographic hashing support" ve PAM ile ilgili satırları kontrol edin
PAM kimlik doğrulama yapılandırması:
begin authenticators
PLAIN:
driver = plaintext
server_set_id = $auth2
server_prompts = :
server_condition = ${if pam{$auth2:$auth3}}
server_advertise_condition = ${if def:tls_in_cipher}
LOGIN:
driver = plaintext
server_set_id = $auth1
server_prompts = Username:: : Password::
server_condition = ${if pam{$auth1:$auth2}}
server_advertise_condition = ${if def:tls_in_cipher}
PAM yapılandırma dosyası /etc/pam.d/exim oluşturun:
#%PAM-1.0
auth required pam_unix.so
account required pam_unix.so
LDAP/Active Directory ile Kimlik Doğrulama
Kurumsal ortamlarda kullanıcı veritabanı genellikle LDAP veya Active Directory’de bulunur. Bu yapılandırma biraz daha karmaşık ama çok güçlüdür.
begin authenticators
PLAIN:
driver = plaintext
server_set_id = $auth2
server_prompts = :
server_condition =
${if ldapauth
{user="cn=$auth2,ou=Users,dc=sirketim,dc=com"
pass=$auth3
ldap://ldap.sirketim.com/ou=Users,dc=sirketim,dc=com?
?sub?(uid=$auth2)}
{yes}{no}}
server_advertise_condition = ${if def:tls_in_cipher}
Active Directory için biraz farklı bir yaklaşım gerekebilir:
PLAIN:
driver = plaintext
server_set_id = $auth2
server_prompts = :
server_condition =
${if ldapauth
{user="[email protected]"
pass=$auth3
ldap://ad.sirketim.com/dc=sirketim,dc=com?
?sub?(sAMAccountName=${quote_ldap:$auth2})}
{yes}{no}}
server_advertise_condition = ${if def:tls_in_cipher}
LDAP bağlantısını test etmek için:
# ldap-utils paketinin kurulu olması gerekir
ldapsearch -x -H ldap://ldap.sirketim.com
-D "cn=kullanici,ou=Users,dc=sirketim,dc=com"
-w "parola"
-b "ou=Users,dc=sirketim,dc=com"
"(uid=testuser)"
MySQL/PostgreSQL ile Kimlik Doğrulama
Büyük ölçekli hosting ortamlarında kullanıcı bilgileri veritabanında tutulur. Exim bu durumu da destekler.
MySQL yapılandırması için önce Exim’in MySQL desteğiyle derlendiğini kontrol edin:
exim -bV | grep mysql
Veritabanı sorgusunu yapılandırma dosyasına ekleyin:
# Ana yapılandırma bölümünde (begin main) veya makro olarak
MYSQL_HOST = localhost
MYSQL_DB = mailserver
MYSQL_USER = exim
MYSQL_PASS = dbparola
begin authenticators
PLAIN:
driver = plaintext
server_set_id = $auth2
server_prompts = :
server_condition =
${if and {
{!eq{$auth2}{}}
{!eq{$auth3}{}}
{crypteq{$auth3}{
${lookup mysql{SELECT password FROM mailbox
WHERE username='${quote_mysql:$auth2}'
AND active='1'}{$value}fail}
}}
} {yes}{no}}
server_advertise_condition = ${if def:tls_in_cipher}
Veritabanı tablosu örneği:
# MySQL'de tablo yapısı oluşturma
mysql -u root -p mailserver << 'EOF'
CREATE TABLE mailbox (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
active TINYINT(1) DEFAULT 1,
created DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Test kullanıcısı ekle (SHA-512 hash)
INSERT INTO mailbox (username, password) VALUES (
'[email protected]',
'${sha512:gizliparola}'
);
EOF
TLS/SSL Yapılandırması ile Kimlik Doğrulamayı Güçlendirme
Kimlik doğrulama TLS olmadan anlamsızdır. Exim’de TLS yapılandırması:
# Ana yapılandırma bölümüne ekle
tls_advertise_hosts = *
tls_certificate = /etc/ssl/certs/mail.sirketim.com.pem
tls_privatekey = /etc/ssl/private/mail.sirketim.com.key
# TLS 1.2 ve üzerini zorla
tls_require_ciphers = ECDHE+AESGCM:DHE+AESGCM:ECDHE+AES256:DHE+AES256:
ECDHE+AES128:DHE+AES:!aNULL:!MD5:!DSS
openssl_options = +no_sslv2 +no_sslv3 +no_tlsv1 +no_tlsv1_1
# STARTTLS için port 587 yapılandırması
daemon_smtp_ports = 25 : 465 : 587
tls_on_connect_ports = 465
Let’s Encrypt sertifikası kullanıyorsanız, sertifika yenileme sonrası Exim’i yeniden başlatmak için bir hook oluşturun:
# /etc/letsencrypt/renewal-hooks/deploy/exim-reload.sh
#!/bin/bash
systemctl reload exim4
chmod +x /etc/letsencrypt/renewal-hooks/deploy/exim-reload.sh
ACL ile Kimlik Doğrulamayı Relay Kontrolüne Bağlamak
Kimlik doğrulamayı yapılandırdıktan sonra, doğrulanmış kullanıcıların relay yapabilmesine izin vermek için ACL (Access Control List) bölümünü güncellemeniz gerekir.
begin acl
# RCPT TO kontrolü için ACL
acl_check_rcpt:
# Yerel teslim her zaman kabul et
accept domains = +local_domains
# Kimlik doğrulanmış kullanıcılar relay yapabilir
accept authenticated = *
control = submission/sender_retain
# Yerel ağdan relay'e izin ver (opsiyonel)
accept hosts = +relay_from_hosts
# Diğer relay girişimlerini reddet
deny message = relay not permitted
control = submission/sender_retain direktifi önemlidir. Bu, kimlik doğrulanmış kullanıcının kendi adresini gönderen olarak kullanmasına izin verir. Eğer bunu istemiyorsanız ve kullanıcının sadece kendi hesabından mail göndermesini istiyorsanız:
accept authenticated = *
condition = ${if eq{$authenticated_id}{${address:$sender_address}}{yes}{no}}
control = submission
Kimlik Doğrulama Sorunlarını Debug Etmek
Gerçek hayatta en çok vakit harcanan kısım bu olur. Exim’in log dosyaları çok değerlidir:
# Ana log dosyası
tail -f /var/log/exim4/mainlog
# Sadece kimlik doğrulama hatalarını filtrele
grep "authenticator" /var/log/exim4/mainlog | tail -50
# Daha detaylı debug için Exim'i verbose modda çalıştır
exim -d+auth -bh 1.2.3.4
Belirli bir IP’den gelen bağlantıyı simüle etmek ve kimlik doğrulamayı test etmek için:
# Exim'in debug modunda SMTP bağlantısı simülasyonu
exim -d -bh 192.168.1.100
# Çıktıda şunları arayın:
# "authenticators offered: PLAIN LOGIN"
# "authenticated user is: [email protected]"
Manuel SMTP kimlik doğrulama testi için:
# Base64 ile kullanıcı adı ve parola encode et
echo -n "[email protected]" | base64
# Çıktı: AHRlc3RAc2lya2V0aW0uY29tAGdpemxpcGFyb2xh
# openssl ile bağlan ve test et
openssl s_client -connect mail.sirketim.com:587 -starttls smtp
# Bağlandıktan sonra:
# EHLO test.com
# AUTH PLAIN AHRlc3RAc2lya2V0aW0uY29tAGdpemxpcGFyb2xh
Yaygın hata mesajları ve çözümleri:
- “535 Incorrect authentication data”: Kullanıcı adı veya parola yanlış. Hash formatını kontrol edin.
- “503 AUTH command used when not advertised”: TLS aktif değil.
tls_in_cipherkontrolünü geçici olarak kaldırıp test edin. - “334”: Sunucu challenge bekliyor, doğru mekanizmayı kullandığınızdan emin olun.
- “Authenticator configuration”: Yapılandırma sözdizimi hatası,
exim -bVile kontrol edin.
Rate Limiting ve Brute Force Koruması
Kimlik doğrulama sisteminizi kaba kuvvet saldırılarına karşı korumak kritik önem taşır.
# acl_check_connect bölümüne ekle
acl_check_connect:
# Aynı IP'den çok fazla başarısız bağlantıyı engelle
drop condition = ${if > {${eval:$connection_reject_count}}{5}}
message = Too many failed attempts
accept
Fail2ban ile entegrasyon için bir filtre oluşturun:
# /etc/fail2ban/filter.d/exim-auth.conf
[Definition]
failregex = S+ authenticator failed for .*[<HOST>].*: 535
S+ SMTP protocol synchronization error .* [<HOST>]
ignoreregex =
# /etc/fail2ban/jail.d/exim-auth.conf
[exim-auth]
enabled = true
filter = exim-auth
logpath = /var/log/exim4/mainlog
maxretry = 5
bantime = 3600
findtime = 600
action = iptables-multiport[name=exim, port="25,465,587"]
# Fail2ban'ı yeniden başlat
systemctl restart fail2ban
fail2ban-client status exim-auth
Yapılandırmayı Test Etmek ve Devreye Almak
Tüm değişiklikleri yaptıktan sonra sistematik bir test süreci izleyin:
# 1. Sözdizimi kontrolü
exim -bV
# 2. Yapılandırmayı yeniden derle (Debian split config için)
update-exim4.conf
# 3. Servisi yeniden başlat
systemctl restart exim4
# 4. Portu kontrol et
ss -tlnp | grep exim
# 5. Servis durumunu kontrol et
systemctl status exim4
# 6. Logları izle
journalctl -u exim4 -f
Uzak bir istemciden test:
# Önce telnet ile ham bağlantı testi
telnet mail.sirketim.com 587
# Bağlantı sonrası:
EHLO test.example.com
# AUTH mekanizmalarının listelendiğini kontrol edin
# swaks ile kapsamlı test (önce kur: apt install swaks)
swaks --to [email protected]
--from [email protected]
--server mail.sirketim.com:587
--auth LOGIN
--auth-user [email protected]
--auth-password "gizliparola"
--tls
Güvenlik Sertleştirme Önerileri
Üretim ortamına geçmeden önce şu kontrol listesini uygulayın:
- TLS’i zorunlu hale getirin: Kimlik doğrulama sadece şifreli bağlantıda yapılmalı.
- Güçlü cipher suite kullanın: Zayıf şifreleme algoritmalarını devre dışı bırakın.
- Port 25’te AUTH ilan etmeyin: Port 25 sunucular arası iletişim içindir, istemci bağlantıları için 587 veya 465 kullanın.
- Başarısız denemeleri loglayin: Her kimlik doğrulama hatasını kaydedin ve izleyin.
- SPF, DKIM ve DMARC kurun: Kimlik doğrulama sadece SMTP seviyesinde değil, DNS seviyesinde de olmalı.
- Parola politikası belirleyin: Minimum uzunluk, karmaşıklık gereksinimleri.
- Hesap kilitleme mekanizması: Belirli sayıda başarısız denemeden sonra hesabı geçici olarak kilitleyin.
Port 25’te AUTH ilan etmemek için:
# authenticators bölümündeki her mekanizmaya ekle
server_advertise_condition =
${if and {{def:tls_in_cipher}{!eq{$interface_port}{25}}}}
Sonuç
Exim’de SMTP kimlik doğrulama yapılandırması ilk bakışta karmaşık görünebilir, ama mantığını kavradıktan sonra son derece esnek ve güçlü bir sistem elde ediyorsunuz. Küçük bir VPS’teki tek domainli kurulumdan, binlerce kullanıcıya sahip kurumsal ortamlara kadar aynı temel prensipler geçerli.
En kritik nokta şu: Kimlik doğrulamayı her zaman TLS ile birlikte kullanın. Şifrelenmemiş bağlantıda parola göndermek, hiç parola kullanmamaktan farksızdır. Sertifikalarınızı güncel tutun, fail2ban gibi bir brute force koruması ekleyin ve log dosyalarınızı düzenli olarak inceleyin.
Passwd dosyasıyla başlayıp işler büyüdükçe LDAP veya veritabanı entegrasyonuna geçiş yapabilirsiniz. Her aşamada exim -d -bh komutu ve swaks aracı en iyi arkadaşlarınız olacak. Sorun çıktığında panik yapmak yerine logları okuyun. Exim’in hata mesajları genellikle neyin yanlış gittiğini açıkça söyler.