Cloudflare ile DKIM, SPF ve DMARC Yapılandırması

E-posta altyapınızı doğru yapılandırmak, günümüzde bir lüks değil zorunluluk haline geldi. Özellikle kurumsal iletişimde e-postalarınızın spam klasörüne düşmesi ya da kimlik avı saldırılarında domain’inizin kötüye kullanılması ciddi itibar ve güvenlik sorunlarına yol açıyor. Cloudflare DNS kullanıyorsanız DKIM, SPF ve DMARC kayıtlarını doğru yapılandırmak hem nispeten basit hem de son derece kritik. Bu yazıda bu üç teknolojiyi sıfırdan yapılandıracağız, yaygın hataları inceleyecek ve gerçek dünya senaryolarıyla konuyu pekiştireceğiz.

SPF, DKIM ve DMARC Nedir, Neden Önemlidir?

Önce temelleri sağlam atalım. Bu üç mekanizma birbirini tamamlayan e-posta kimlik doğrulama protokolleridir.

SPF (Sender Policy Framework), domain’iniz adına hangi IP adreslerinin veya sunucuların e-posta gönderebileceğini tanımlar. Alıcı sunucu, gelen e-postanın kaynağını SPF kaydınızla karşılaştırır. Yetkisiz bir IP’den geliyorsa işaretler.

DKIM (DomainKeys Identified Mail), gönderilen e-postalara kriptografik imza ekler. Bu imza, e-postanın gönderim sırasında değiştirilmediğini ve gerçekten iddia edilen domain’den geldiğini kanıtlar. Özel anahtar gönderen sunucuda, açık anahtar ise DNS’te tutulur.

DMARC (Domain-based Message Authentication, Reporting and Conformance), SPF ve DKIM’i bir araya getirerek politika belirler. “SPF veya DKIM doğrulaması başarısız olursa bu e-postayla ne yapılsın?” sorusunun cevabıdır. Aynı zamanda raporlama mekanizması sağlar.

Bu üçlü olmadan domain’iniz e-posta spoofing saldırılarına açık kalır. Birisi sizin domain’iniz adına sahte e-posta gönderebilir, çalışanlarınızı veya müşterilerinizi kandırabilir.

Cloudflare DNS Paneline Giriş ve Hazırlık

Cloudflare DNS yönetim paneline giriş yapıp ilgili domain’i seçtikten sonra sol menüden DNS > Records bölümüne gidin. Tüm kayıtları buradan yöneteceksiniz.

Başlamadan önce mevcut DNS kayıtlarınızı bir yere not edin. Özellikle mevcut TXT kayıtlarına bakın, bazen eski servis sağlayıcıdan kalma SPF kayıtları çakışmalara neden olabilir.

# Mevcut DNS kayıtlarını sorgulamak için
dig TXT example.com
dig MX example.com
dig TXT _dmarc.example.com

# Cloudflare API ile kayıtları listelemek isterseniz
curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records?type=TXT" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json"

Çıktıda mevcut TXT kayıtlarını göreceksiniz. Eğer v=spf1 içeren bir kayıt varsa dikkatli olun, birden fazla SPF kaydı tanımlamak geçersiz bir yapılandırmaya yol açar.

SPF Kaydı Oluşturma

SPF kaydı, DNS’e eklenen bir TXT kaydıdır. Syntax’ı biraz karmaşık görünse de mantığı basittir.

Temel bir SPF kaydı şöyle görünür:

v=spf1 include:_spf.google.com include:sendgrid.net ip4:203.0.113.10 ~all

Bu kaydı parçalayalım:

  • v=spf1: SPF sürümü, her zaman bu şekilde başlar
  • include:_spf.google.com: Google Workspace üzerinden gönderim yapılıyorsa
  • include:sendgrid.net: SendGrid kullanıyorsanız
  • ip4:203.0.113.10: Doğrudan kendi sunucunuzun IP’si
  • ~all: Soft fail, tanımlanmayan kaynaklardan gelen e-postaları işaretle ama reddetme

~all yerine -all kullanırsanız “hard fail” olur, yani tanımsız kaynaklardan gelen e-postalar tamamen reddedilir. Üretim ortamına geçmeden önce ~all ile başlamanızı öneririm.

Cloudflare panelinde SPF kaydını eklemek için:

# Cloudflare API ile SPF kaydı oluşturma
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "type": "TXT",
    "name": "@",
    "content": "v=spf1 include:_spf.google.com ip4:203.0.113.10 ~all",
    "ttl": 300
  }'

Cloudflare arayüzünden yapacaksanız: DNS > Records > Add Record, Type olarak TXT seçin, Name kısmına @ yazın (domain’in kendisi için), Content kısmına SPF değerinizi yapıştırın.

Önemli not: Cloudflare’in proxy özelliği (turuncu bulut ikonu) SPF kayıtları için anlamsızdır çünkü bu bir TXT kaydıdır, proxy’lenemez. DNS-only olarak bırakın.

Yaygın SPF Hataları

Birden fazla SPF TXT kaydı oluşturmak en sık yapılan hatadır. Birleştirmeniz gerekir:

# YANLIS - iki ayrı SPF kaydı
v=spf1 include:_spf.google.com ~all
v=spf1 ip4:203.0.113.10 ~all

# DOGRU - tek bir birlestirilmis kayit
v=spf1 include:_spf.google.com ip4:203.0.113.10 ~all

Ayrıca SPF’de maksimum 10 DNS lookup sınırı vardır. include mekanizmaları her biri bir lookup tüketir. Çok fazla servis entegrasyonu varsa bu sınırı aşabilirsiniz. Bunu test etmek için MXToolbox veya dmarcian gibi araçları kullanın.

DKIM Kaydını Yapılandırma

DKIM yapılandırması kullandığınız e-posta servisine göre değişir. Servis sağlayıcınız size bir açık anahtar verir, bunu DNS’e TXT kaydı olarak eklemeniz gerekir.

Google Workspace için DKIM

Google Admin konsolundan Apps > Google Workspace > Gmail > Authenticate email bölümüne gidin. Domain’inizi seçin ve “Generate new record” butonuna tıklayın. Size şuna benzer bir değer verecektir:

# Google Workspace DKIM kaydı
# Name: google._domainkey.example.com
# Value:
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2a7...

Bu kaydı Cloudflare’e ekleyin:

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "type": "TXT",
    "name": "google._domainkey",
    "content": "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2a7...",
    "ttl": 300
  }'

Kendi Posta Sunucunuz için DKIM (Postfix + OpenDKIM)

Eğer kendi Postfix sunucunuzu yönetiyorsanız OpenDKIM ile anahtar çifti oluşturmanız gerekir:

# OpenDKIM kurulumu (Debian/Ubuntu)
apt-get install opendkim opendkim-tools

# Anahtar dizinini oluştur
mkdir -p /etc/opendkim/keys/example.com
cd /etc/opendkim/keys/example.com

# 2048-bit RSA anahtar cifti olustur
opendkim-genkey -b 2048 -d example.com -s mail

# Olusturulan dosyalar:
# mail.private - ozel anahtar (sunucuda kalacak)
# mail.txt     - DNS'e eklenecek acik anahtar

cat mail.txt

mail.txt dosyasının içeriği şuna benzer görünecektir:

mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
  "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxyz..."
  "devam eden anahtar degeri..." )

Parantez içindeki tüm değerleri birleştirip Cloudflare’e TXT kaydı olarak ekleyin. Name kısmı mail._domainkey olacak.

OpenDKIM yapılandırması:

# /etc/opendkim.conf temel ayarlari
Domain                  example.com
KeyFile                 /etc/opendkim/keys/example.com/mail.private
Selector                mail
Socket                  inet:8891@localhost
UserID                  opendkim
UMask                   007
Canonicalization        relaxed/relaxed
Mode                    sv
SubDomains              no
AutoRestart             yes
AutoRestartRate         10/1M
Background              yes
DNSTimeout              5
SignatureAlgorithm      rsa-sha256

# Postfix ile entegrasyon icin /etc/postfix/main.cf
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

DKIM Doğrulama Testi

Kaydı ekledikten sonra doğrulamak için:

# DKIM kaydini sorgula
dig TXT mail._domainkey.example.com

# Beklenen cikti (kisaltilmis)
# mail._domainkey.example.com. 300 IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIBIj..."

# nslookup ile de kontrol edebilirsiniz
nslookup -type=TXT mail._domainkey.example.com 1.1.1.1

DMARC Kaydı Oluşturma

DMARC, SPF ve DKIM’in üstüne oturan politika katmanıdır. _dmarc.example.com adında bir TXT kaydı olarak eklenir.

En temel DMARC kaydı:

v=DMARC1; p=none; rua=mailto:[email protected]

Daha kapsamlı bir DMARC kaydı:

v=DMARC1; p=quarantine; pct=100; rua=mailto:[email protected]; ruf=mailto:[email protected]; sp=reject; adkim=s; aspf=s

Parametreleri açıklayalım:

  • v=DMARC1: Protokol sürümü
  • p=none: Politika. none sadece izle, quarantine spam’e gönder, reject tamamen reddet
  • pct=100: Politikanın uygulanacağı e-posta yüzdesi. Test aşamasında pct=10 ile başlayabilirsiniz
  • rua: Aggregate (özet) raporların gönderileceği adres
  • ruf: Forensic (detaylı hata) raporlarının gönderileceği adres
  • sp: Alt domain’ler için politika
  • adkim=s: DKIM alignment strict modu. r ise relaxed
  • aspf=s: SPF alignment strict modu

Cloudflare API ile eklemek için:

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "type": "TXT",
    "name": "_dmarc",
    "content": "v=DMARC1; p=none; rua=mailto:[email protected]; ruf=mailto:[email protected]; pct=100",
    "ttl": 300
  }'

DMARC’ı Kademeli Olarak Sıkılaştırma

Birçok sysadmin DMARC politikasını çok hızlı reject‘e alır ve meşru e-postaların reddedilmesiyle karşılaşır. Önerdiğim yaklaşım:

1. Hafta – İzleme fazı: p=none ile başlayın. Raporları toplayın, hangi kaynaklardan e-posta gönderildiğini analiz edin. Beklenmedik kaynaklar varsa SPF veya DKIM’e ekleyin.

2-4. Hafta – Karantina fazı: p=quarantine; pct=10 ile başlayın, yüzdeyi kademeli artırın.

1. Ay sonrası – Reddetme fazı: p=reject; pct=100 ile tam koruma sağlayın.

Gerçek Dünya Senaryosu: E-Ticaret Firması

Diyelim ki hem Google Workspace hem de Mailchimp ve özel bir sipariş bildirim sistemi kullanan bir e-ticaret firmasının DNS’ini yönetiyorsunuz.

Gereksinimler:

  • Google Workspace kurumsal e-postalar için
  • Mailchimp pazarlama kampanyaları için
  • Şirket içi PHP uygulaması sipariş bildirimleri için (IP: 198.51.100.25)

SPF kaydı:

v=spf1 include:_spf.google.com include:servers.mcsv.net ip4:198.51.100.25 ~all

DKIM için üç ayrı selector ekleyin:

# Google Workspace DKIM
# google._domainkey.example.com

# Mailchimp DKIM (Mailchimp size kendi selector'unu verir)
# k1._domainkey.example.com

# Kendi sunucunuz icin
# mail._domainkey.example.com

DMARC:

v=DMARC1; p=quarantine; pct=100; rua=mailto:[email protected]; sp=none; adkim=r; aspf=r

Alt domain’ler için sp=none kullandık çünkü bazı transactional e-postalar alt domain’lerden gönderiliyor olabilir ve henüz bunları yapılandırmadık.

Yapılandırma Doğrulama ve Test

Tüm kayıtları ekledikten sonra kapsamlı test yapın:

# SPF kaydini dogrula
dig TXT example.com | grep spf

# DKIM kaydini dogrula
dig TXT google._domainkey.example.com
dig TXT mail._domainkey.example.com

# DMARC kaydini dogrula
dig TXT _dmarc.example.com

# Hepsini tek scriptle kontrol edin
for record in "example.com" "google._domainkey.example.com" "_dmarc.example.com"; do
  echo "=== $record ==="
  dig TXT $record +short
  echo ""
done

Test e-postası göndermek için Gmail veya herhangi bir e-posta istemcisinden bir test mesajı gönderin, alıcı tarafta “Show original” seçeneğiyle başlıkları inceleyin. Şunları görmelisiniz:

# Gmail orijinal mesaj basliklarinda
Authentication-Results: mx.google.com;
   dkim=pass [email protected] header.s=mail;
   spf=pass smtp.mailfrom=example.com;
   dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=example.com

Her üçü de pass görünüyorsa yapılandırmanız başarılıdır.

Cloudflare Özel Ayarları ve Dikkat Edilecekler

Cloudflare kullanırken bazı özgün durumlarla karşılaşabilirsiniz.

Proxy durumu: DNS kayıtları (TXT, MX) proxy’lenemez, Cloudflare bunları otomatik olarak DNS-only olarak işaretler. A ve AAAA kayıtlarınız proxy’liyse gerçek IP’niz gizlenir, bu SPF’i etkilemez çünkü SPF MX kayıtlarına değil, gönderen IP’ye bakar.

TTL ayarı: Test aşamasında 300 saniye (5 dakika) kullanın, üretimde 3600 saniyeye çıkarabilirsiniz. Cloudflare proxy’li kayıtlarda TTL otomatik yönetilir.

Büyük DKIM anahtarları: 2048-bit DKIM anahtarları bazen tek TXT kaydına sığmaz. DNS’de 255 karakter sınırı vardır ama birden fazla string birleştirilebilir. Cloudflare bunu otomatik handle eder ama manuel API kullanıyorsanız dikkatli olun:

# Uzun DKIM degeri icin API cagrisi
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" 
  -H "Authorization: Bearer API_TOKEN" 
  -H "Content-Type: application/json" 
  --data '{
    "type": "TXT",
    "name": "mail._domainkey",
    "content": "v=DKIM1; k=rsa; p=BIRINCI_BOLUM IKINCI_BOLUM",
    "ttl": 300
  }'

Email Routing: Cloudflare’in kendi Email Routing özelliğini kullanıyorsanız, Cloudflare otomatik olarak gerekli MX ve TXT kayıtlarını ekler. Bu kayıtlarla çakışmamaya dikkat edin.

DMARC Raporlarını Analiz Etme

DMARC raporları XML formatında gelir ve doğrudan okumak oldukça zahmetlidir. Birkaç ücretsiz araç bu işi kolaylaştırır:

  • dmarcian.com: DMARC raporlarını otomatik parse eder, kaynak IP’leri ve geçiş/başarısızlık oranlarını gösterir
  • postmaster.google.com: Google’a gönderdiğiniz e-postaların itibarını takip edin
  • mail-tester.com: Hızlı test için

Bash ile basit bir DMARC raporu parser’ı da yazabilirsiniz:

#!/bin/bash
# DMARC raporunu parse eden basit script
# Gelen XML dosyasini gzip'ten ac ve onemli alanlari goster

REPORT_FILE=$1

if [ -z "$REPORT_FILE" ]; then
  echo "Kullanim: $0 dmarc_report.xml.gz"
  exit 1
fi

# Gzip ise ac
if [[ "$REPORT_FILE" == *.gz ]]; then
  gunzip -c "$REPORT_FILE" | xmllint --xpath "//record" - 2>/dev/null || 
  gunzip -c "$REPORT_FILE" | grep -E "(source_ip|count|disposition|dkim|spf)"
else
  xmllint --xpath "//record" "$REPORT_FILE" 2>/dev/null || 
  grep -E "(source_ip|count|disposition|dkim|spf)" "$REPORT_FILE"
fi

Troubleshooting: Sık Karşılaşılan Sorunlar

Sorun: SPF permerror döndürüyor. Neden: Birden fazla SPF TXT kaydı var veya 10 lookup sınırı aşılmış. Çözüm: dig TXT example.com ile tüm TXT kayıtlarını listeleyin, SPF içerenleri tek kayıtta birleştirin.

Sorun: DKIM fail döndürüyor ama kayıt doğru görünüyor. Neden: DNS propagasyonu henüz tamamlanmamış, anahtar yanlış kopyalanmış veya selector adı uyuşmuyor. Çözüm: dig TXT selector._domainkey.example.com ile canlı DNS’i kontrol edin, Cloudflare’deki kayıt adını doğrulayın.

Sorun: DMARC fail döndürüyor ama SPF ve DKIM geçiyor. Neden: Alignment problemi. “From” header’ındaki domain ile SPF/DKIM domain’leri uyuşmuyor. Çözüm: adkim=r ve aspf=r (relaxed) kullanın veya alt domain’ler için SPF/DKIM kayıtlarını ayrıca yapılandırın.

Sorun: Cloudflare’de kayıt ekliyorum ama değişiklikler yansımıyor. Neden: DNS cache. Çözüm: dig @1.1.1.1 TXT example.com ile Cloudflare’in kendi DNS’ini sorgulayın. Kendi recursive resolver’ınız cache’lemiş olabilir.

Sonuç

SPF, DKIM ve DMARC üçlüsü e-posta güvenliğinin temel taşlarıdır. Cloudflare DNS’i kullanarak bu yapılandırmayı yapmak oldukça erişilebilir, ancak detaylara dikkat etmek gerekiyor. Tek SPF kaydı kuralına uymak, DKIM selector’larını doğru adlandırmak ve DMARC politikasını kademeli sıkılaştırmak, başarılı bir yapılandırmanın anahtarlarıdır.

Özellikle p=none ile başlayıp raporları analiz etmeden direkt p=reject‘e geçmek en sık yapılan operasyonel hatadır. Meşru e-posta trafiğinizi engellemeden önce en az iki hafta izleme fazında kalın. DMARC raporları size beklenmedik gönderici kaynakları konusunda çok değerli bilgiler verecektir.

Bu yapılandırmayı tamamladıktan sonra düzenli olarak MXToolbox, Google Postmaster Tools ve DMARC rapor araçlarıyla takip etmeyi alışkanlık haline getirin. E-posta itibarı uzun vadede korunan, kısa vadede ise kolayca zarar gören bir değerdir. Bu üç protokolü doğru yapılandırmak, domain’inizi hem teknik hem de itibar açısından koruma altına alır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir