Mail sunucunuzu çalıştırmak bir şeydir, güvenli çalıştırmak bambaşka bir şeydir. Bugün Exim üzerinde TLS/SSL yapılandırmasını en ince ayrıntısına kadar ele alacağız. Özellikle “mail gidiyor ya, ne gerek var şifrelemede” diye düşünüyorsanız, bu yazı tam size göre. SMTP trafiğini açık akan bir kanalda taşımak, kredi kartı bilgilerini kartpostal üzerine yazıp göndermek gibi bir şey.
TLS/SSL’in Mail Güvenliğindeki Yeri
Exim yapılandırmasına geçmeden önce temel kavramları netleştirelim. Mail iletiminde iki farklı TLS senaryosu söz konusu:
- STARTTLS: Düz metin bağlantıyla başlayıp TLS’e yükseltme yapar. 25 ve 587 portlarında kullanılır.
- SMTPS (SSL/TLS): Doğrudan TLS bağlantısı açar. 465 portunda çalışır.
Sunucular arası iletimde (MTA-to-MTA) genellikle STARTTLS tercih edilir. İstemci bağlantılarında (MUA-to-MTA) ise hem STARTTLS hem de SMTPS yaygın olarak kullanılmaktadır. Exim her iki senaryoyu da destekler ve doğru yapılandırıldığında oldukça güçlü bir güvenlik katmanı sunar.
Sertifika Hazırlığı
Exim’de TLS’i devreye almadan önce bir sertifikaya ihtiyacınız var. Üretim ortamı için Let’s Encrypt mükemmel bir seçenek. Certbot ile sertifika almak şu kadar basit:
# Certbot kurulumu (Debian/Ubuntu)
apt-get install certbot
# Standalone mod ile sertifika al
certbot certonly --standalone -d mail.ornekdomain.com
# Webroot kullanıyorsanız
certbot certonly --webroot -w /var/www/html -d mail.ornekdomain.com
# Sertifika dosyalarının konumunu kontrol et
ls -la /etc/letsencrypt/live/mail.ornekdomain.com/
Sertifika alındıktan sonra Exim’in bu dosyalara erişebilmesi gerekiyor. Let’s Encrypt sertifikaları varsayılan olarak root’a ait olduğundan, Exim kullanıcısına gerekli izinleri vermeniz gerekir:
# Exim kullanıcısını ve grubunu öğren
id exim
# veya
grep exim /etc/passwd
# Let's Encrypt dizinine grup erişimi ver
chmod 750 /etc/letsencrypt/live/
chmod 750 /etc/letsencrypt/archive/
chown root:Debian-exim /etc/letsencrypt/live/
chown root:Debian-exim /etc/letsencrypt/archive/
# Özel anahtara erişim kontrolü
chmod 640 /etc/letsencrypt/archive/mail.ornekdomain.com/privkey*.pem
chown root:Debian-exim /etc/letsencrypt/archive/mail.ornekdomain.com/privkey*.pem
Test ortamı için self-signed sertifika oluşturabilirsiniz, ancak üretimde bunu kesinlikle kullanmayın. Diğer mail sunucuları self-signed sertifikayla gelen bağlantıları reddedebilir ya da uyarı verebilir.
Exim Konfigürasyonunda Temel TLS Ayarları
Exim’in ana konfigürasyon dosyası genellikle /etc/exim4/exim4.conf ya da /etc/exim4/conf.d/main/ altında parçalı dosyalar şeklinde bulunur. Ana konfigürasyon bloğuna şu ayarları ekleyin:
# /etc/exim4/exim4.conf.template veya ana konfigürasyon dosyası
# Sertifika ve özel anahtar yolları
tls_certificate = /etc/letsencrypt/live/mail.ornekdomain.com/fullchain.pem
tls_privatekey = /etc/letsencrypt/live/mail.ornekdomain.com/privkey.pem
# TLS'i aktif et - gelen bağlantılar için reklam yap
tls_advertise_hosts = *
# Güvenilir CA sertifikaları
tls_verify_certificates = /etc/ssl/certs/ca-certificates.crt
# Minimum TLS versiyonu
tls_require_ciphers = ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL:!MD5:!DSS
# Diffie-Hellman parametreleri
tls_dhparam = /etc/exim4/dhparam.pem
Diffie-Hellman parametrelerini oluşturun. Bu işlem biraz zaman alabilir:
# 2048-bit DH parametresi oluştur (minimum öneri)
openssl dhparam -out /etc/exim4/dhparam.pem 2048
# 4096-bit daha güvenli ama performans etkisi var, üretimde dikkatli kullanın
# openssl dhparam -out /etc/exim4/dhparam.pem 4096
# Dosya izinlerini ayarla
chmod 640 /etc/exim4/dhparam.pem
chown root:Debian-exim /etc/exim4/dhparam.pem
STARTTLS Konfigürasyonu ve Port Ayarları
Mail submission için 587 portunu etkinleştirip STARTTLS zorunlu hale getirmek iyi bir pratiktir. /etc/exim4/exim4.conf dosyasına şunları ekleyin:
# Daemon başlatma seçenekleri - birden fazla port dinle
daemon_smtp_ports = 25 : 465 : 587
# 587 portu için STARTTLS zorunlu hale getir
tls_on_connect_ports = 465
# ACL ile submission portunda kimlik doğrulama zorla
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
ACL konfigürasyonunda port bazlı TLS kontrolü ekleyin:
# ACL konfigürasyonu - /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
acl_check_rcpt:
# 587 portunda TLS zorunlu
deny condition = ${if eq{$interface_port}{587}}
condition = ${if !eq{$tls_in_cipher}{}}
message = TLS required on port 587
!encrypted = *
# Kimlik doğrulanmamış gönderim engelle (relay koruması)
deny message = Relay not permitted
!authenticated = *
!hosts = +relay_from_hosts
!domains = +local_domains
accept
TLS Cipher Suite Optimizasyonu
Günümüzde zayıf şifreleme algoritmalarını devre dışı bırakmak kritik önem taşıyor. SSLv2, SSLv3 ve zayıf cipher’ları kaldırmak için:
# Modern ve güvenli cipher listesi
tls_require_ciphers = ECDHE-ECDSA-AES128-GCM-SHA256:
ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES256-GCM-SHA384:
ECDHE-RSA-AES256-GCM-SHA384:
ECDHE-ECDSA-CHACHA20-POLY1305:
ECDHE-RSA-CHACHA20-POLY1305:
DHE-RSA-AES128-GCM-SHA256:
DHE-RSA-AES256-GCM-SHA384:
!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA
# OpenSSL tabanlı sistemlerde minimum protokol versiyonu
# GnuTLS kullanan sistemler için farklı syntax gerekebilir
openssl_options = +no_sslv2 +no_sslv3 +no_tlsv1 +no_tlsv1_1
GnuTLS kullanan Exim kurulumlarında (Debian/Ubuntu varsayılanı) syntax biraz farklıdır:
# GnuTLS için priority string
tls_require_ciphers = SECURE256:+SECURE128:-VERS-ALL:+VERS-TLS1.3:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC
Hangi kütüphaneyi kullandığınızı öğrenmek için:
exim -bV | grep TLS
# Çıktı: "Support for: crypteq iconv() IPv6 GnuTLS" veya "OpenSSL" gösterecek
Giden Mail Trafiğinde TLS
Exim yalnızca gelen değil, giden bağlantılarda da TLS kullanabilir. Router ve transport konfigürasyonuna TLS ayarları eklemek gerekiyor:
# /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp
remote_smtp:
driver = smtp
# Giden bağlantılarda TLS kullan
tls_certificate = /etc/letsencrypt/live/mail.ornekdomain.com/fullchain.pem
tls_privatekey = /etc/letsencrypt/live/mail.ornekdomain.com/privkey.pem
# Karşı tarafın sertifikasını doğrula
tls_verify_certificates = /etc/ssl/certs/ca-certificates.crt
# TLS müzakere başarısız olursa düz metin kullan (geriye dönük uyumluluk)
# Bunu kapatırsanız TLS desteklemeyen sunuculara mail gidemez
tls_tempfail_tolarate = yes
# DANE desteği için (ileride ele alacağız)
dnssec_request_domains = *
hosts_try_dane = *
Belirli domainler için TLS’i zorunlu kılmak istiyorsanız router konfigürasyonuna ekleyin:
# /etc/exim4/conf.d/router/200_exim4-config_primary
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
# Bu domainler için TLS zorunlu
# tls_verify_hosts ile karşı tarafın sertifikasını doğrula
pass_router = remote_smtp_notls
# TLS desteklemeyen domainler için fallback transport
remote_smtp_notls:
driver = smtp
hosts_require_tls =
DANE (DNS-based Authentication of Named Entities)
DANE, TLS sertifika doğrulamasını DNS üzerinden yapmanıza olanak tanır. TLSA kayıtları sayesinde man-in-the-middle saldırılarına karşı çok daha güçlü koruma sağlar. Exim DANE desteği için DNSSEC şart:
# exim4.conf - DANE etkinleştir
dns_dnssec_ok = 1
# Remote SMTP transport için DANE
remote_smtp:
driver = smtp
dnssec_request_domains = *
hosts_try_dane = *
tls_verify_certificates = /etc/ssl/certs/ca-certificates.crt
Kendi domain’iniz için TLSA kaydı oluşturmak istiyorsanız şu komutları kullanabilirsiniz:
# Sertifikadan TLSA kaydı hash'i oluştur
openssl x509 -in /etc/letsencrypt/live/mail.ornekdomain.com/cert.pem
-noout -pubkey |
openssl pkey -pubin -outform DER |
openssl dgst -sha256 -binary |
xxd -p -c 32
# DNS'e eklenecek TLSA kaydı formatı:
# _25._tcp.mail.ornekdomain.com. IN TLSA 3 1 1 <hash>
Sertifika Yenileme Otomasyonu
Let’s Encrypt sertifikaları 90 günde bir yenilenir. Exim’in yeni sertifikayı sorunsuz kullanabilmesi için yenileme sonrası bir hook ekleyin:
# /etc/letsencrypt/renewal-hooks/post/exim-reload.sh
#!/bin/bash
# Sertifika yenilendikten sonra Exim'i yeniden yükle
echo "Sertifika yenilendi, Exim yeniden başlatılıyor..."
systemctl reload exim4
if [ $? -eq 0 ]; then
echo "Exim başarıyla yeniden yüklendi."
else
echo "HATA: Exim yeniden yüklenemedi!" >&2
exit 1
fi
# Script'i çalıştırılabilir yap
chmod +x /etc/letsencrypt/renewal-hooks/post/exim-reload.sh
# Yenileme sürecini test et
certbot renew --dry-run
# Cron ile düzenli kontrol (eğer certbot timer yoksa)
echo "0 3 * * * root certbot renew --quiet" >> /etc/cron.d/certbot
Exim’in TLS önbelleğini temizlemek için bazen tam restart gerekebilir. Reload genellikle yeterli olsa da kritik güvenlik güncellemelerinde tam restart tercih edin.
TLS Oturum Önbelleği
Performans açısından TLS oturum önbelleğini doğru yapılandırmak önemli. Her bağlantıda tam handshake yapmak yük altında gecikmeye yol açar:
# Exim konfigürasyonuna ekle
tls_resumption_hosts = *
# Oturum ticket anahtarı (genellikle otomatik yönetilir)
# tls_session_id_limit ayarı Exim versiyonuna göre farklılık gösterir
TLS Günlüklerini İzleme ve Hata Ayıklama
Sorunları tespit etmek için Exim loglarını aktif olarak izlemeniz gerekiyor. TLS ile ilgili log kayıtları oldukça bilgilendiricidir:
# TLS bağlantı loglarını izle
tail -f /var/log/exim4/mainlog | grep -i tls
# Belirli bir IP'nin TLS bağlantı durumunu kontrol et
grep "TLS error" /var/log/exim4/mainlog | tail -20
# Başarılı TLS bağlantılarını say
grep "tls_in_cipher" /var/log/exim4/mainlog | wc -l
# Cipher kullanım istatistikleri
grep "X=TLS" /var/log/exim4/mainlog |
grep -oP 'C=K[^:]+' | sort | uniq -c | sort -rn
TLS sorunlarını debug modunda incelemek için:
# Test modu ile TLS bağlantısını simüle et
openssl s_client -starttls smtp -connect mail.ornekdomain.com:25 -servername mail.ornekdomain.com
# SMTPS bağlantısı test et
openssl s_client -connect mail.ornekdomain.com:465
# Submission port test
openssl s_client -starttls smtp -connect mail.ornekdomain.com:587
# Desteklenen cipher'ları listele
openssl s_client -starttls smtp -connect mail.ornekdomain.com:25 -cipher 'ALL' 2>&1 | grep -E "Cipher|Protocol"
Exim debug modunda çalıştırarak daha ayrıntılı bilgi alabilirsiniz:
# Debug modunda test maili gönder
exim -v -d+tls [email protected] <<< "Test maili"
# Belirli bir sunucuya TLS ile bağlantıyı test et
exim -bt [email protected]
Gerçek Dünya Senaryosu: Karma Ortamda TLS Politikası
Diyelim ki hem büyük kurumsal partnerleriniz hem de eski altyapıyla çalışan küçük şirketlerle mail alışverişi yapıyorsunuz. TLS’i tamamen zorunlu kılamıyorsunuz çünkü bazı partnerler hala eski sistemler kullanıyor. Bu durumda domain bazlı politika üretmek en mantıklı yaklaşım:
# /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp
# Güvenilir partnerler için TLS zorunlu transport
remote_smtp_tls_required:
driver = smtp
tls_certificate = /etc/letsencrypt/live/mail.ornekdomain.com/fullchain.pem
tls_privatekey = /etc/letsencrypt/live/mail.ornekdomain.com/privkey.pem
tls_verify_certificates = /etc/ssl/certs/ca-certificates.crt
hosts_require_tls = *
tls_verify_hosts = *
# Eski sistemlerle uyumlu transport (TLS tercihli ama zorunlu değil)
remote_smtp_opportunistic:
driver = smtp
tls_certificate = /etc/letsencrypt/live/mail.ornekdomain.com/fullchain.pem
tls_privatekey = /etc/letsencrypt/live/mail.ornekdomain.com/privkey.pem
hosts_try_starttls = *
Router konfigürasyonunda domain listesi oluşturun:
# /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs
# TLS zorunlu domainler listesi
domainlist tls_required_domains = partner1.com : partner2.com.tr : kurumsal.org
# Router konfigürasyonu
tls_required_partner:
driver = dnslookup
domains = +tls_required_domains
transport = remote_smtp_tls_required
standard_outbound:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp_opportunistic
Mail Güvenlik Testi ve Doğrulama
Konfigürasyonunuzu test etmek için birkaç çevrimiçi araç ve komut satırı yöntemi mevcut:
# Nmap ile TLS versiyonlarını tara
nmap --script ssl-enum-ciphers -p 25,465,587 mail.ornekdomain.com
# testssl.sh ile kapsamlı TLS analizi yap
./testssl.sh --starttls smtp mail.ornekdomain.com:25
# Exim'in TLS durumunu doğrula
exim -bP tls_certificate
exim -bP tls_privatekey
exim -bP tls_advertise_hosts
# Aktif TLS bağlantılarını gör
exim -ps | grep TLS
MX Toolbox, Mail Tester ve CheckTLS gibi çevrimiçi araçlar da TLS yapılandırmanızı harici perspektiften değerlendirmenize yardımcı olur. Bu araçlarla hem gelen hem giden TLS desteğinizi doğrulayabilirsiniz.
Yaygın Sorunlar ve Çözümleri
Pratikte en sık karşılaşılan sorunları ve çözümlerini sıralayalım:
Sertifika okuma hatası: Exim kullanıcısının sertifika dosyasına erişimi yoksa “TLS error on connection” hatası alırsınız. Dosya izinlerini kontrol edin.
DH parametre eksikliği: tls_dhparam ayarlanmamışsa bazı istemciler bağlantıyı reddedebilir. Her zaman DH parametresi oluşturun.
SNI sorunları: Birden fazla domain barındırıyorsanız SNI (Server Name Indication) desteğini aktifleştirmek gerekebilir. Exim 4.83 ve sonrasında otomatik desteklenir.
Eski Exim versiyonu: TLS özellikleri Exim versiyonuna göre farklılık gösterir. exim -bV ile versiyonunuzu ve desteklenen özellikleri kontrol edin.
# Exim versiyon ve özelliklerini kontrol et
exim -bV
# Konfigürasyon sözdizimi kontrolü
exim -C /etc/exim4/exim4.conf -bV
# Konfigürasyon hatalarını test et
exim -bP all 2>&1 | head -50
Sonuç
Exim’de TLS/SSL yapılandırması bir kez yapılıp unutulacak bir iş değil. Cipher suite’leri düzenli güncellemek, sertifika yenileme süreçlerini otomatize etmek ve log’ları aktif izlemek güvenli bir mail altyapısının temel gereksinimleri. Let’s Encrypt ile sertifika maliyeti sıfıra indi, cipher yapılandırması birkaç satır, DH parametresi bir komutla oluşturuluyor. Artık “zaman yok, gerek yok” gibi bir mazeret kalmadı.
Özellikle kurumsal ortamlarda DANE ve domain bazlı TLS politikası uygulamaları hem güvenliği hem de uyumluluk gereksinimlerini karşılamak açısından kritik önem taşıyor. GDPR ve KVKK kapsamında mail iletişimi şifrelenmesi artık teknik tercih değil, yasal zorunluluk haline geliyor. Bu yüzden bu yapılandırmaları bir an önce üretime almak, hem sizi hem de kullanıcılarınızı koruyacaktır.