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

Bir mail sunucusu kurup yapılandırdıktan sonra asıl sınavın başladığını çoğu sysadmin geç fark eder. Postfix’i ayağa kaldırmak görece kolay; ama gönderdiğiniz maillerin spam kutusuna düşmeden, kimlik doğrulamasız görünmeden karşı tarafa ulaşması için DKIM, SPF ve DMARC üçlüsünü doğru yapılandırmanız şart. Bu yazıda bu üç teknolojiyi sıfırdan kurarak production ortamında nasıl çalıştıracağınızı adım adım anlatacağım.

DKIM, SPF ve DMARC Nedir?

Önce neyi neden kurduğumuzu netleştirelim.

SPF (Sender Policy Framework), alan adınız adına mail göndermeye yetkili IP adreslerini DNS üzerinde tanımlayan bir mekanizma. Alıcı sunucu, gelen mailin “From” başlığındaki domain için DNS’e bakıyor ve gönderen IP’nin listede olup olmadığını kontrol ediyor.

DKIM (DomainKeys Identified Mail), gönderilen her maile kriptografik bir imza ekliyor. Özel anahtar sunucunuzda, açık anahtar DNS’de yer alıyor. Alıcı sunucu bu imzayı doğrulayarak mailin gerçekten sizden geldiğini ve içeriğin değiştirilmediğini teyit edebiliyor.

DMARC (Domain-based Message Authentication, Reporting and Conformance), SPF ve DKIM kontrollerinin sonucunda ne yapılacağını belirliyor. “SPF veya DKIM başarısız olursa bu maili reddet/karantinaya al/yoksay” gibi politikalar tanımlıyor. Üstelik size raporlama imkanı da sunuyor.

Bu üçü birlikte çalıştığında spoofing ve phishing saldırılarına karşı ciddi bir bariyer oluşturuyorsunuz.

Ortam Hakkında

Bu yazıda Ubuntu 22.04 LTS üzerinde çalışıyoruz. Postfix’in zaten kurulu ve temel yapılandırmasının tamamlandığını varsayıyorum. Örnek domain olarak ornek.com kullanacağım, siz bunu kendi domain’inizle değiştirmelisiniz.

Başlamadan önce sunucunuzun hostname’ini kontrol edin:

hostname -f

Çıktı mail.ornek.com gibi tam nitelikli bir domain adı (FQDN) olmalı. Değilse /etc/hostname ve /etc/hosts dosyalarını düzenleyin.

SPF Kaydı Oluşturmak

SPF tamamen DNS tarafında yapılandırılıyor, sunucuda yapacak fazla bir şey yok. Ama doğru kaydı oluşturmak önemli.

DNS yönetim panelinize girerek ornek.com için bir TXT kaydı ekleyin:

# Temel SPF kaydı - sadece bu sunucu mail gönderebilir
v=spf1 ip4:SUNUCU_IP_ADRESI -all

# Eğer başka mail servisleri de (örneğin Google Workspace) kullanıyorsanız
v=spf1 ip4:SUNUCU_IP_ADRESI include:_spf.google.com ~all

SPF mekanizmalarını anlamak önemli:

  • ip4:X.X.X.X: Belirtilen IPv4 adresine izin ver
  • ip6:X:X::X: Belirtilen IPv6 adresine izin ver
  • include:domain: Başka bir domain’in SPF kaydını dahil et
  • a: Domain’in A kaydındaki IP’ye izin ver
  • mx: Domain’in MX kaydındaki sunuculara izin ver
  • -all: Listede olmayan herkesi reddet (hard fail)
  • ~all: Listede olmayan herkesi şüpheli işaretle (soft fail)
  • ?all: Sonuç belirsiz

Production ortamında -all kullanmanızı öneririm. ~all daha esnek ama daha az güvenli.

DNS kaydı yayıldıktan sonra doğrulama yapın:

dig TXT ornek.com +short
# veya
nslookup -type=TXT ornek.com

OpenDKIM Kurulumu ve Yapılandırması

DKIM için OpenDKIM kullanacağız. Önce paketi kuralım:

apt update
apt install opendkim opendkim-tools -y

Anahtar Çifti Oluşturmak

DKIM için RSA anahtar çifti oluşturmamız gerekiyor. Anahtarı saklamak için bir dizin oluşturalım:

mkdir -p /etc/opendkim/keys/ornek.com
cd /etc/opendkim/keys/ornek.com

# 2048 bit RSA anahtar çifti oluştur
opendkim-genkey -b 2048 -d ornek.com -s mail

# Dosya izinlerini ayarla
chown -R opendkim:opendkim /etc/opendkim/keys/
chmod 640 /etc/opendkim/keys/ornek.com/mail.private

Bu komut iki dosya oluşturuyor:

  • mail.private: Özel anahtar (sunucuda kalacak)
  • mail.txt: DNS’e ekleyeceğiniz TXT kaydı

DNS kaydını görüntüleyin:

cat /etc/opendkim/keys/ornek.com/mail.txt

Çıktı şuna benzer bir şey olacak:

mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
    "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." )

Bu değeri DNS’e mail._domainkey.ornek.com adıyla TXT kaydı olarak ekleyin. Tırnak işaretleri ve parantezler olmadan, tüm p=... değerini tek satır halinde girin.

OpenDKIM Konfigürasyonu

Ana konfigürasyon dosyasını düzenleyin:

nano /etc/opendkim.conf

Dosyanın içeriği şöyle olmalı:

# /etc/opendkim.conf temel yapılandırma

Syslog                  yes
SyslogSuccess           yes
LogWhy                  yes

Canonicalization        relaxed/simple
Mode                    sv
SubDomains              no

AutoRestart             yes
AutoRestartRate         10/1M
Background              yes
DNSTimeout              5
SignatureAlgorithm      rsa-sha256

# Anahtar tablosu
KeyTable                /etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
ExternalIgnoreList      /etc/opendkim/TrustedHosts
InternalHosts           /etc/opendkim/TrustedHosts

PidFile                 /var/run/opendkim/opendkim.pid
UMask                   002
UserID                  opendkim:opendkim
Socket                  local:/var/spool/postfix/opendkim/opendkim.sock

Şimdi tabloları oluşturalım:

# KeyTable - hangi domain için hangi anahtar kullanılacak
echo "mail._domainkey.ornek.com ornek.com:mail:/etc/opendkim/keys/ornek.com/mail.private" > /etc/opendkim/KeyTable

# SigningTable - hangi gönderici için hangi key kullanılacak
echo "*@ornek.com mail._domainkey.ornek.com" > /etc/opendkim/SigningTable

# TrustedHosts - güvenilir host'lar
cat > /etc/opendkim/TrustedHosts << EOF
127.0.0.1
localhost
ornek.com
mail.ornek.com
EOF

Socket Dizinini Hazırlamak

OpenDKIM’i Postfix ile Unix socket üzerinden iletişim kuracak şekilde yapılandırdık. Socket’in Postfix’in chroot ortamında erişilebilir olması gerekiyor:

mkdir -p /var/spool/postfix/opendkim
chown opendkim:postfix /var/spool/postfix/opendkim
chmod 750 /var/spool/postfix/opendkim

# opendkim kullanıcısını postfix grubuna ekle
usermod -a -G postfix opendkim

Servisi başlatın:

systemctl enable opendkim
systemctl start opendkim
systemctl status opendkim

Socket’in oluştuğunu kontrol edin:

ls -la /var/spool/postfix/opendkim/

Postfix’i OpenDKIM ile Entegre Etmek

Postfix’in giden mailleri imzalaması için main.cf dosyasına eklemeler yapmamız gerekiyor:

nano /etc/postfix/main.cf

Dosyanın sonuna şunları ekleyin:

# DKIM imzalama
milter_protocol = 6
milter_default_action = accept
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = local:opendkim/opendkim.sock

Postfix’i yeniden başlatın:

systemctl restart postfix

DKIM’i Test Etmek

Test maili göndererek DKIM imzasını kontrol edin:

# Mail gönder
echo "Bu bir DKIM test mailidir" | mail -s "DKIM Test" [email protected]

# Mail loglarını izle
tail -f /var/log/mail.log | grep -i dkim

Daha güvenilir bir test için mail-tester.com veya dmarcanalyzer.com gibi servisleri kullanabilirsiniz. Kendinize bir test maili gönderip başlıkları inceleyin. Gmail’de “Orijinali göster” dediğinizde şöyle bir satır görmelisiniz:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ornek.com; s=mail;

DNS kaydının doğruluğunu da kontrol edin:

opendkim-testkey -d ornek.com -s mail -vvv

Çıktıda key OK görmelisiniz.

DMARC Kaydı Oluşturmak

DMARC da SPF gibi DNS tarafında yapılandırılıyor. Ama dikkatli olmak gerekiyor; çok agresif bir politikayla başlarsanız meşru mailleriniz de bloke olabilir.

DNS’e _dmarc.ornek.com adıyla şu TXT kaydını ekleyin:

# Başlangıç için - sadece izle, hiçbir şeyi engelleme
v=DMARC1; p=none; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1

# Bir süre sonra - şüpheli mailleri karantinaya al
v=DMARC1; p=quarantine; pct=25; rua=mailto:[email protected]; adkim=r; aspf=r

# Production'da - tamamen reddet
v=DMARC1; p=reject; rua=mailto:[email protected]; adkim=s; aspf=s

DMARC etiketlerinin anlamları:

  • v: Versiyon, her zaman DMARC1
  • p: Politika (none, quarantine, reject)
  • pct: Politikanın uygulanacağı mail yüzdesi (0-100)
  • rua: Toplu raporların gönderileceği adres
  • ruf: Başarısızlık raporlarının gönderileceği adres
  • adkim: DKIM hizalama modu (r=relaxed, s=strict)
  • aspf: SPF hizalama modu (r=relaxed, s=strict)
  • fo: Başarısızlık raporlama seçenekleri

Tavsiyem: İlk 2-4 hafta p=none ile başlayın. Raporları inceleyin, her şey yolundaysa p=quarantine ile devam edin, sonunda p=reject yapın.

DMARC Raporlarını Almak ve Analiz Etmek

DMARC raporları XML formatında geliyor ve doğrudan okumak pek kullanışlı değil. Bunun için opendmarc veya üçüncü parti araçlar kullanabilirsiniz.

Basit bir çözüm olarak parsedmarc Python aracını kullanabilirsiniz:

pip3 install parsedmarc
mkdir -p /var/dmarc-reports

# Raporu analiz et
parsedmarc /path/to/dmarc-report.xml

# JSON çıktısı için
parsedmarc -o /var/dmarc-reports/ /path/to/dmarc-report.xml

Alternatif olarak dmarc-report-converter gibi araçlar da mevcut. Ya da işi basit tutmak istiyorsanız mail.dmarcanalyzer.com gibi ücretsiz DMARC analiz servislerini kullanabilirsiniz.

Yaygın Sorunlar ve Çözümleri

DKIM İmzası Görünmüyor

En yaygın sorun socket izinleri. Kontrol edin:

# Socket var mı?
ls -la /var/spool/postfix/opendkim/

# Postfix opendkim socket'e erişebiliyor mu?
su -s /bin/bash postfix -c "ls /var/spool/postfix/opendkim/"

# OpenDKIM log'larına bak
journalctl -u opendkim -n 50

Socket izin hatası görüyorsanız:

chown opendkim:postfix /var/spool/postfix/opendkim
chmod 750 /var/spool/postfix/opendkim
systemctl restart opendkim postfix

SPF Başarısız Oluyor

Sunucunuzun IP’si değiştiyse veya yeni bir mail relay eklendiyse SPF kaydınızı güncellemeniz gerekiyor. Ayrıca DNS TTL’i yüksekse eski kayıt cache’de kalabilir. Test için:

dig TXT ornek.com +short
# Veya harici bir araçla
curl https://dns.google/resolve?name=ornek.com&type=TXT

Mail Loglarında “Milter” Hataları

Postfix ve OpenDKIM arasındaki iletişim kopmuysa şunu kontrol edin:

grep -i "milter|opendkim" /var/log/mail.log | tail -30

milter_default_action = accept ayarı sayesinde OpenDKIM erişilemez olsa bile mail akışı durmaz, ama imzalama da çalışmaz. OpenDKIM servisinin çalıştığından emin olun:

systemctl status opendkim

Birden Fazla Domain İçin Yapılandırma

Aynı sunucuda birden fazla domain kullanıyorsanız her biri için ayrı anahtar çifti oluşturmanız gerekiyor:

# İkinci domain için anahtar oluştur
mkdir -p /etc/opendkim/keys/ikinci-domain.com
cd /etc/opendkim/keys/ikinci-domain.com
opendkim-genkey -b 2048 -d ikinci-domain.com -s mail
chown -R opendkim:opendkim /etc/opendkim/keys/

# KeyTable'a ekle
echo "mail._domainkey.ikinci-domain.com ikinci-domain.com:mail:/etc/opendkim/keys/ikinci-domain.com/mail.private" >> /etc/opendkim/KeyTable

# SigningTable'a ekle
echo "*@ikinci-domain.com mail._domainkey.ikinci-domain.com" >> /etc/opendkim/SigningTable

OpenDKIM’i yeniden başlatmayı unutmayın:

systemctl restart opendkim

Tüm Yapılandırmayı Doğrulamak

Her şeyi bir bütün olarak test etmek için [email protected] adresine mail gönderin:

echo "Test maili" | mail -s "Auth Test" [email protected]

Birkaç dakika içinde otomatik yanıt gelecek ve SPF, DKIM, DMARC sonuçlarını gösterecek. Şöyle bir çıktı görmelisiniz:

DKIM check:          pass
DomainKeys check:    neutral
SPF check:           pass
Sender-ID check:     pass
SpamAssassin check:  ham

Mail başlıklarını manuel incelemeyi de öğrenin. Gmail veya başka bir istemcide “Show original” dediğinizde Authentication-Results başlığını bulun:

Authentication-Results: mx.google.com;
   dkim=pass [email protected] header.s=mail header.b=AbCdEfGh;
   spf=pass (google.com: domain of [email protected] designates X.X.X.X as permitted sender);
   dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=ornek.com

Üç satırda da pass görüyorsanız her şey doğru çalışıyor demektir.

Reverse DNS (PTR) Kaydını Unutmayın

Bu üç mekanizmayla birlikte bir de PTR kaydı şart. Mail sunucunuzun IP’si için hosting sağlayıcınızdan veya veri merkezinden PTR kaydı tanımlatın. PTR kaydı, IP adresinden hostname’e gidilen reverse DNS sorgusu. Örneğin X.X.X.X IP’niz için PTR kaydı mail.ornek.com olmalı.

# PTR kaydını kontrol et
dig -x SUNUCU_IP_ADRESI +short
# Çıktı: mail.ornek.com. gibi görünmeli

PTR kaydı olmayan veya generic bir hostname döndüren sunuculardan gelen mailler büyük mail sağlayıcıları tarafından sıklıkla reddediliyor.

Güvenlik Notları

DKIM özel anahtarınızı güvende tutun. Yetkisiz erişimi engelleyin:

chmod 600 /etc/opendkim/keys/ornek.com/mail.private
chown opendkim:opendkim /etc/opendkim/keys/ornek.com/mail.private

Anahtarları düzenli olarak yenilemeyi alışkanlık haline getirin. Yılda bir kez yeni anahtar çifti oluşturup DNS’i güncellemek, eski anahtarın ifşası durumunda hasarı sınırlar. Yeni anahtarı ekledikten sonra en az 48 saat bekleyin, eski DNS kaydı cache’den düşsün, sonra eski anahtarı kaldırın.

Sonuç

DKIM, SPF ve DMARC üçlüsünü doğru yapılandırmak, mail sunucunuzun güvenilirliği ve teslim edilebilirliği açısından artık zorunlu bir standart haline geldi. Google ve Yahoo 2024 başından itibaren bulk sender’lar için bu üçünü zorunlu kıldı ve bu trend devam edecek.

Kurulumu özetleyecek olursak: SPF ile göndermeye yetkili IP’leri DNS’te tanımladık, OpenDKIM ile her maile kriptografik imza attık, DMARC ile de politikamızı belirleyip raporlama mekanizmasını aktif ettik. Bu üç katmanı bir arada kullandığınızda hem domain’inizi spoofing’den koruyorsunuz hem de inbox’a düşme oranınızı ciddi ölçüde artırıyorsunuz.

Sabırlı olun: DNS değişiklikleri yayılmaya zaman alır, DMARC raporları birikmesi birkaç gün sürer. p=none ile başlayıp raporları okuyarak ilerleyin. Aceleden p=reject koyarsanız meşru maillerinizin bile gitmediğini görüp paniğe kapılabilirsiniz. Adım adım, test ederek ilerlemek her zaman kazandırır.

Yorum yapın