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.