E-posta altyapısında SPF ve DMARC yapılandırması yapmak, artık bir seçenek değil zorunluluk haline geldi. Gmail, Outlook ve diğer büyük sağlayıcılar bu kayıtları olmayan sunuculardan gelen e-postaları direkt spam klasörüne atıyor ya da tamamen reddediyor. Exim kullanan bir sistem yöneticisi olarak bu konuyu doğru anlamak ve uygulamak, hem teslim edilebilirlik oranlarını artırır hem de domain’inin sahte e-postalarda kullanılmasını engeller.
Bu yazıda Exim üzerinde SPF doğrulaması nasıl yapılır, DMARC politikası nasıl uygulanır ve tüm bu yapıyı monitoring ile birlikte nasıl ayakta tutarsınız bunları adım adım anlatacağım. Sadece teorik değil, gerçek sunucularda çalışan konfigürasyonları paylaşıyorum.
SPF Nedir ve Neden Önemli?
SPF (Sender Policy Framework), bir domain adına e-posta göndermeye yetkili IP adreslerini tanımlayan bir DNS kaydıdır. Alıcı mail sunucusu, gelen e-postanın “From” başlığındaki domain için DNS’e bakıp bu IP’nin yetkili olup olmadığını kontrol eder.
Örnek vermek gerekirse, sirket.com adresinden gelen bir e-posta alındığında, alıcı sunucu sirket.com için TXT DNS kaydına bakıp gönderen IP’nin orada tanımlı olup olmadığını kontrol eder. Eğer yoksa, SPF “fail” döner.
SPF kaydı nasıl görünür:
# DNS TXT kaydı örneği
sirket.com. IN TXT "v=spf1 ip4:203.0.113.10 ip4:203.0.113.11 include:_spf.google.com ~all"
Buradaki parametrelerin anlamları:
- v=spf1: SPF versiyonu, her zaman bu olmalı
- ip4:203.0.113.10: Bu IP’den gönderim yetkilidir
- include:_spf.google.com: Google’ın SPF kaydını dahil et (G Suite kullanıyorsan)
- ~all: Listede olmayan IP’lerden gelenleri “softfail” olarak işaretle
- -all: Listede olmayan IP’lerden gelenleri “fail” olarak işaretle (daha sıkı)
- ?all: Nötral, hiçbir şey yapma
Üretim ortamında -all kullanmak daha güvenlidir ama önce ~all ile başlayıp logları izlemek iyi bir pratik.
Exim’de SPF Doğrulamasını Aktif Etmek
Exim, SPF kontrolü için libspf2 kütüphanesine ihtiyaç duyar. Distro’ya göre kurulum farklılık gösterir.
# Debian/Ubuntu
apt-get install libspf2-2 libspf2-dev
# CentOS/RHEL
yum install libspf2 libspf2-devel
# Exim'in SPF desteğiyle derlenip derlenmediğini kontrol et
exim -bV | grep -i spf
Eğer exim -bV çıktısında Experimental_SPF görüyorsanız, SPF desteği mevcut demektir. cPanel/WHM veya Plesk gibi kontrol panelleri genellikle bu desteği hazır getirir.
SPF kontrolünü Exim konfigürasyonuna eklemek için acl_check_rcpt bölümüne aşağıdaki bloğu ekliyoruz:
# /etc/exim/exim.conf veya /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
acl_check_rcpt:
# SPF kontrolü - authenticated kullanıcıları atla
accept authenticated = *
# Lokal ağdan geliyorsa atla
accept hosts = +relay_from_hosts
# SPF kontrolü yap
warn spf = fail : softfail : neutral : none
log_message = SPF check: $spf_result for $sender_address from $sender_host_address
# SPF fail durumunda reddet (opsiyonel, dikkatli kullan)
deny message = [SPF] $sender_host_address is not allowed to send mail from $sender_address_domain
log_message = SPF hard fail from $sender_host_address for $sender_address
spf = fail
Bu konfigürasyonu kaydettikten sonra Exim’i yeniden başlatıyoruz:
# Konfigürasyonu test et
exim -bV
exim -C /etc/exim/exim.conf -bP > /dev/null
# Servisi yeniden başlat
systemctl restart exim
# veya
service exim restart
DMARC Nedir?
DMARC (Domain-based Message Authentication, Reporting and Conformance), SPF ve DKIM sonuçlarını birleştirip bir politika uygulayan üst katman bir mekanizmadır. SPF ve DKIM’in doğrulama sonuçlarına göre e-postanın ne yapılacağını tanımlar ve raporlama sağlar.
DMARC’ın kritik özelliği “alignment” kavramıdır. Yani sadece SPF veya DKIM geçmesi yetmez, aynı zamanda bu kayıtlardaki domain ile “From” başlığındaki domain aynı olmalıdır.
DMARC DNS kaydı örneği:
# DNS TXT kaydı - _dmarc.sirket.com
_dmarc.sirket.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; sp=reject; adkim=s; aspf=s; pct=100; fo=1"
Parametrelerin anlamları:
- v=DMARC1: DMARC versiyonu
- p=quarantine: Politika (none / quarantine / reject)
- rua: Aggregate raporların gönderileceği adres
- ruf: Forensic (detaylı) raporların gönderileceği adres
- sp=reject: Alt domainler için politika
- adkim=s: DKIM alignment strict modda (relaxed için
r) - aspf=s: SPF alignment strict modda
- pct=100: Politikanın uygulanacağı e-posta yüzdesi
- fo=1: Forensik rapor gönderme koşulu (1=SPF veya DKIM başarısız olunca)
DMARC politika seviyeleri:
- p=none: Sadece raporla, bir şey yapma (başlangıç için ideal)
- p=quarantine: Spam klasörüne at
- p=reject: Tamamen reddet (en güçlü koruma)
Yeni başlıyorsanız mutlaka p=none ile başlayın, en az 2 hafta raporları izleyin, sonra quarantine‘e geçin, birkaç hafta daha bekleyin, sonra reject‘e alın.
Exim’de DMARC Doğrulamasını Yapılandırmak
DMARC kontrolü için Exim’in DMARC desteğiyle derlenmiş olması gerekiyor. Modern Exim sürümlerinde (4.86+) bu genellikle dahili geliyor.
# DMARC desteğini kontrol et
exim -bV | grep -i dmarc
# Gerekli kütüphane
apt-get install libopendmarc-dev # Debian/Ubuntu
yum install opendmarc-devel # CentOS/RHEL
Exim konfigürasyonuna DMARC bloğunu ekliyoruz:
# /etc/exim/exim.conf - Main configuration section
# DMARC ana ayarlar
DMARC_FORENSIC_SENDER = [email protected]
DMARC_TLD_FILE = /etc/exim/opendmarc/effective_tld_names.dat
# ACL bölümüne eklenecek kontrol
acl_check_rcpt:
# DMARC kontrolü
warn dmarc_status = accept : none : off
log_message = DMARC check passed for $sender_address_domain
warn dmarc_status = reject : quarantine
log_message = DMARC check FAILED: $dmarc_status_text for $sender_address_domain
add_header = X-DMARC-Status: $dmarc_status
# DMARC reject politikasındaki e-postaları reddet
deny condition = ${if eq{$dmarc_status}{reject}{yes}{no}}
message = DMARC policy violation: $sender_address_domain instructs us to reject this message
log_message = DMARC reject policy applied for $sender_address_domain from $sender_host_address
TLD dosyasını indirmek için:
mkdir -p /etc/exim/opendmarc
wget -O /etc/exim/opendmarc/effective_tld_names.dat
https://publicsuffix.org/list/public_suffix_list.dat
# Periyodik güncelleme için cron
echo "0 3 * * 0 root wget -q -O /etc/exim/opendmarc/effective_tld_names.dat https://publicsuffix.org/list/public_suffix_list.dat"
>> /etc/cron.d/update-tld
DKIM ile Birlikte Kullanım
DMARC’ın düzgün çalışması için DKIM imzalamasının da aktif olması gerekiyor. DKIM olmadan sadece SPF ile DMARC alignment sağlamak daha kısıtlı olur. Exim’de DKIM imzalamayı nasıl aktif edeceğinizi görelim:
# DKIM anahtar çifti oluşturma
mkdir -p /etc/exim/dkim
cd /etc/exim/dkim
openssl genrsa -out sirket.com.private 2048
openssl rsa -in sirket.com.private -pubout -out sirket.com.public
chmod 640 sirket.com.private
chown root:Debian-exim sirket.com.private # Exim kullanıcısını kontrol et
DKIM DNS kaydını oluşturmak için public key’i alıyoruz:
# Public key içeriğini DNS için formatla
cat sirket.com.public | grep -v '^-' | tr -d 'n'
Bu çıktıyı DNS’e TXT kaydı olarak ekliyoruz:
# DNS TXT kaydı - mail._domainkey.sirket.com
mail._domainkey.sirket.com. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
Exim konfigürasyonuna DKIM imzalamayı ekliyoruz:
# /etc/exim/exim.conf - Transport bölümü
remote_smtp:
driver = smtp
dkim_domain = ${sender_address_domain}
dkim_selector = mail
dkim_private_key = /etc/exim/dkim/${dkim_domain}.private
dkim_canon = relaxed
dkim_sign_headers = From:To:Subject:Date:Message-ID:MIME-Version:Content-Type
dkim_timestamps = 1
# Headers ekle
headers_add = "X-Mailer: Exim ${version_number}"
SPF ve DMARC Testleri
Yapılandırmayı tamamladıktan sonra test etmek kritik. Bunun için birkaç farklı yöntem kullanıyorum:
# Exim log'larında SPF/DMARC sonuçlarını izle
tail -f /var/log/exim/mainlog | grep -E 'SPF|DMARC|dkim'
# Test e-postası gönder ve logları izle
echo "Test mesaji" | mail -s "SPF DMARC Test" [email protected]
# SPF kaydını doğrula
dig TXT sirket.com | grep spf
# DMARC kaydını doğrula
dig TXT _dmarc.sirket.com
# DKIM kaydını doğrula
dig TXT mail._domainkey.sirket.com
Online araçlar da işe yarıyor ama komut satırından doğrulamak daha hızlı. mail-tester.com veya mxtoolbox.com gibi sitelerden kapsamlı test yapabilirsiniz.
DMARC Raporlarını İşlemek
DMARC raporları XML formatında geliyor ve ham haliyle okunması zor. Bu raporları analiz etmek için opendmarc-reports veya dmarc-srg gibi araçlar kullanılabilir.
# dmarc-srg kurulumu (PHP tabanlı, web arayüzü var)
apt-get install php php-xml php-mbstring
# Basit bir DMARC rapor parser scripti
cat > /usr/local/bin/parse-dmarc-report.sh << 'EOF'
#!/bin/bash
# DMARC aggregate raporu parse et
REPORT_FILE=$1
if [ -z "$REPORT_FILE" ]; then
echo "Kullanim: $0 <rapor_dosyasi.xml>"
exit 1
fi
# XML dosyasını parse et
python3 << PYEOF
import xml.etree.ElementTree as ET
import sys
tree = ET.parse('$REPORT_FILE')
root = tree.getroot()
print("=== DMARC Rapor Ozeti ===")
print(f"Org: {root.find('./report_metadata/org_name').text}")
print(f"Email: {root.find('./report_metadata/email').text}")
print(f"Domain: {root.find('./policy_published/domain').text}")
print(f"Politika: {root.find('./policy_published/p').text}")
print("n--- Kayitlar ---")
for record in root.findall('./record'):
source_ip = record.find('./row/source_ip').text
count = record.find('./row/count').text
dkim = record.find('./row/policy_evaluated/dkim').text
spf = record.find('./row/policy_evaluated/spf').text
print(f"IP: {source_ip} | Adet: {count} | DKIM: {dkim} | SPF: {spf}")
PYEOF
EOF
chmod +x /usr/local/bin/parse-dmarc-report.sh
Gerçek Dünya Senaryosu: E-Posta Teslim Sorunu
Bir e-ticaret firmasında çalışırken yaşadığım gerçek bir senaryoyu paylaşayım. Transactional e-postalar (sipariş bildirimleri) Gmail’e düşmüyordu, spam klasörüne gidiyordu. Sorun incelendiğinde üç ayrı IP’den gönderim yapıldığını ama SPF kaydında sadece birinin tanımlı olduğunu gördük.
# Hangi IP'lerden gönderim yapıldığını bul
grep "Completed" /var/log/exim/mainlog |
awk '{print $9}' |
grep -oP '[K[^]]+' |
sort | uniq -c | sort -rn | head -20
# SPF kaydındaki IP'leri kontrol et
dig TXT sirket.com +short | grep spf
Sonuç olarak SPF kaydını güncelledik ve ~all yerine -all kullandık. DMARC politikasını da none‘dan quarantine‘e aldık. İki hafta sonra teslim oranı %94’ten %99.2’ye çıktı.
Log Analizi ve Monitoring
Sürekli izleme olmadan ne DMARC ne de SPF sizi tam koruyamaz. Şu monitoring scriptini kullanıyorum:
#!/bin/bash
# /usr/local/bin/mail-auth-monitor.sh
# Her gece çalıştırılır, sorunları raporlar
LOG_FILE="/var/log/exim/mainlog"
YESTERDAY=$(date -d "yesterday" +"%Y-%m-%d")
REPORT_TO="[email protected]"
SPF_FAIL=$(grep "$YESTERDAY" $LOG_FILE | grep -c "SPF.*fail")
DMARC_FAIL=$(grep "$YESTERDAY" $LOG_FILE | grep -c "DMARC.*reject|DMARC.*quarantine")
DKIM_FAIL=$(grep "$YESTERDAY" $LOG_FILE | grep -c "DKIM.*fail|dkim.*fail")
TOTAL_SENT=$(grep "$YESTERDAY" $LOG_FILE | grep -c "Completed")
TOTAL_RECEIVED=$(grep "$YESTERDAY" $LOG_FILE | grep -c "<=")
# Rapor oluştur
REPORT="=== Mail Auth Gunluk Raporu: $YESTERDAY ===
Toplam Gonderilen: $TOTAL_SENT
Toplam Alinan: $TOTAL_RECEIVED
SPF Fail: $SPF_FAIL
DMARC Fail: $DMARC_FAIL
DKIM Fail: $DKIM_FAIL"
echo "$REPORT" | mail -s "Mail Auth Raporu - $YESTERDAY" $REPORT_TO
# Kritik esik asildiysa alarm gonder
if [ $SPF_FAIL -gt 100 ]; then
echo "UYARI: SPF fail sayisi yuksek: $SPF_FAIL" |
mail -s "KRITIK: SPF Fail Artisi" $REPORT_TO
fi
Bu scripti cron’a ekleyin:
echo "0 7 * * * root /usr/local/bin/mail-auth-monitor.sh" >> /etc/cron.d/mail-auth
Yaygın Sorunlar ve Çözümleri
Forward edilen e-postalar SPF’yi bozuyor: Bu çok yaygın bir problem. Birisi e-postasını başka bir adrese forward ettiğinde, orijinal gönderen IP adresi değişiyor ve SPF başarısız oluyor. Bu durumda DKIM devreye giriyor çünkü DKIM kriptografik imza içeriğe dayalı.
Çözüm olarak DMARC alignment modunu relaxed yapmak sorunları azaltır:
# Daha permissive DMARC kaydı
_dmarc.sirket.com. IN TXT "v=DMARC1; p=quarantine; adkim=r; aspf=r; rua=mailto:[email protected]; pct=100"
SPF lookup limiti aşılıyor: SPF’de maksimum 10 DNS lookup hakkınız var. include: direktifleri bu limiti hızlıca tüketiyor. spf-tools ile analiz yapın:
# SPF lookup sayısını kontrol et
pip install pyspf
python3 -c "
import spf
result, code, explanation = spf.check2(
i='203.0.113.1',
s='[email protected]',
h='mail.sirket.com'
)
print(f'Sonuc: {result}')
"
DKIM imza doğrulanamıyor: Genellikle DNS’te public key yanlış formatlanmış oluyor. Key’i test etmek için:
# DKIM imzasını doğrula
opendkim-testkey -d sirket.com -s mail -k /etc/exim/dkim/sirket.com.private -vvv
Exim Konfigürasyonunu Test Etme
Her değişiklikten sonra konfigürasyonu validate etmek zorunlu:
# Syntax kontrolü
exim -C /etc/exim/exim.conf -bP
# Test modu ile e-posta gönderimi simule et
exim -bt [email protected]
# Routing testı
exim -bv [email protected]
# Verbose test
exim -d+all -bt [email protected] 2>&1 | head -100
Sonuç
Exim üzerinde SPF ve DMARC yapılandırması yapmak birkaç adımdan oluşuyor ama asıl önemli olan doğru sırayla ilerlemek. Önce DNS kayıtlarınızı hazırlayın, sonra Exim’de doğrulama mekanizmalarını aktif edin, DMARC politikasını none ile başlatın ve raporları en az iki hafta izleyin. Ancak ondan sonra quarantine‘e, ardından reject‘e geçin.
DKIM olmadan DMARC yarım kalıyor, bu yüzden üçünü birlikte düşünün. SPF gönderen IP’yi doğrular, DKIM mesajın değiştirilmediğini kanıtlar, DMARC ise her ikisini koordineli şekilde uygular ve size raporlama sağlar.
Monitoring’i ihmal etmeyin. DMARC raporları size hem kendi altyapınızı hem de domain’inizi kötüye kullananları gösterir. Bu raporlarda beklenmedik IP’ler görürseniz hemen araştırın, çünkü bu domain spoofing saldırısının göstergesi olabilir.
Doğru yapılandırılmış bir mail altyapısında teslim edilebilirlik oranları ciddi ölçüde artıyor ve domain itibarınız korunuyor. Biraz zaman ayırıp bu yapıyı kurmak uzun vadede hem güvenlik hem de operasyonel açıdan çok değer yaratıyor.