Günümüzde bir mail sunucusu kuruyorsanız, DKIM olmadan yola çıkmak neredeyse imkansız. Gmail, Outlook, Yahoo gibi büyük servis sağlayıcıları DKIM imzası olmayan mailleri ya spam kutusuna atıyor ya da direkt reddediyor. Exim kullanıyorsanız bu işlemi oldukça temiz bir şekilde yapılandırabilirsiniz. Bu yazıda sıfırdan başlayarak production ortamında çalışan bir DKIM imzalama altyapısı kuracağız.
DKIM Nedir ve Neden Önemlidir
DKIM (DomainKeys Identified Mail), gönderilen e-postanın gerçekten belirtilen domain tarafından gönderildiğini doğrulayan bir kimlik doğrulama mekanizmasıdır. Temel çalışma prensibi şöyledir: mail sunucunuz gönderilen her mesaja özel bir kriptografik imza ekler, alıcı sunucu da DNS üzerinden yayınladığınız public key ile bu imzayı doğrular.
Pratik açıdan bakacak olursak, DKIM olmayan bir mail sunucusuyla yaşadığım en can sıkıcı senaryo şuydu: Müşteri için kurduğum yeni bir mail sunucusundan gönderilen faturalar sürekli spam kutusuna düşüyordu. SPF kaydı vardı, rDNS ayarlıydı ama DKIM yoktu. DKIM eklendiği anda deliverability sorunu çözüldü.
DKIM’in sağladığı başlıca faydalar:
- Mail bütünlüğü: Transit sırasında mailin değiştirilmediğini kanıtlar
- Domain itibarı: Büyük mail sağlayıcılarında daha iyi spam skoru
- DMARC için gereklilik: DMARC politikası uygulamak istiyorsanız DKIM veya SPF’den en az biri zorunlu
- Phishing koruması: Domain adınızın kötüye kullanımını zorlaştırır
Gereksinimler ve Hazırlık
Başlamadan önce sisteminizde şunların hazır olması gerekiyor:
- Çalışan bir Exim 4.x kurulumu (4.70+ önerilir, DKIM desteği bu sürümden itibaren yerleşik gelir)
- Root veya sudo erişimi
- DNS yönetim paneline erişim
- OpenSSL kurulu olması
Exim sürümünüzü ve DKIM desteğini kontrol etmek için:
exim --version
# veya daha detaylı:
exim -bV | grep -i dkim
Eğer çıktıda Support for: DKIM görüyorsanız hazırsınız demektir. Göremiyorsanız Exim’in DKIM desteğiyle derlenmesi gerekiyor, ama modern dağıtımlarda bu genellikle varsayılan olarak gelir.
DKIM Anahtar Çifti Oluşturma
İlk adım RSA anahtar çifti oluşturmak. DKIM için 2048-bit anahtar kullanmanızı öneririm, 1024-bit artık zayıf kabul ediliyor.
# DKIM anahtarları için dizin oluşturun
mkdir -p /etc/exim4/dkim
cd /etc/exim4/dkim
# Private key oluşturun
openssl genrsa -out example.com.private 2048
# Public key türetin
openssl rsa -in example.com.private -out example.com.public -pubout
# Dosya izinlerini ayarlayın
chmod 640 example.com.private
chown root:Debian-exim example.com.private
Debian/Ubuntu dışı sistemlerde Exim kullanıcı adı farklı olabilir. Kontrol etmek için:
ps aux | grep exim | head -5
# veya
grep -i exim /etc/passwd
CentOS/RHEL sistemlerde genellikle exim kullanıcısı olur:
chown root:exim example.com.private
DNS TXT Kaydı Hazırlama
Public key’i DNS’e eklemek için önce doğru formata getirmeniz gerekiyor. Ham public key çıktısını DNS kaydına koyamazsınız, biraz işlemeniz lazım:
# Public key içeriğini DNS formatına dönüştürün
grep -v "^-" /etc/exim4/dkim/example.com.public | tr -d 'n'
Bu komutun çıktısını alın. DNS’e şu formatda TXT kaydı eklemeniz gerekecek:
Selector adı olarak genellikle mail veya default kullanılır, ama tarih bazlı bir isim (mail2024 gibi) key rotation için daha pratiktir.
DNS TXT kaydınız şu şekilde görünmeli:
_domainkey.example.com TXT "t=y; o=~;"
mail._domainkey.example.com TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
TXT kaydındaki parametreler:
- v=DKIM1: DKIM sürüm 1 kullandığınızı belirtir
- k=rsa: Anahtar tipi RSA
- p=: Public key değeri (başlık ve son satır olmadan, boşluksuz)
- t=s: Strict mode, subdomain’lerin bu key’i kullanmasını engeller
- t=y: Test modunda olduğunuzu belirtir, üretimde kaldırın
Exim Yapılandırması
Şimdi asıl kısma geldik. Exim’in DKIM imzalama yapılandırması exim4.conf veya Debian sistemlerde /etc/exim4/conf.d/ altındaki dosyalar üzerinden yapılır.
Temel DKIM Yapılandırması
Exim’de DKIM imzalama, remote_smtp transport’u üzerinde yapılır. Debian tabanlı sistemlerde bu genellikle /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp dosyasındadır:
# Önce mevcut konfigürasyonu yedekleyin
cp /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp
/etc/exim4/conf.d/transport/30_exim4-config_remote_smtp.bak
Transport bölümüne DKIM direktiflerini ekleyin:
remote_smtp:
driver = smtp
dkim_domain = ${sender_address_domain}
dkim_selector = mail
dkim_private_key = /etc/exim4/dkim/${dkim_domain}.private
dkim_canon = relaxed
dkim_strict = false
dkim_sign_headers = Date:From:To:Subject:Message-ID:Content-Type:MIME-Version
Tek büyük config dosyası kullanan sistemlerde (cPanel, Plesk, vb.) begin transports bölümünü bulup oraya ekleyeceksiniz.
Çoklu Domain Desteği
Gerçek dünyada genellikle birden fazla domain için mail gönderirsiniz. Her domain için ayrı DKIM anahtarı yönetmek için şu yapıyı kullanabilirsiniz:
# Her domain için ayrı anahtar oluşturun
for domain in example.com example.net testsite.org; do
openssl genrsa -out /etc/exim4/dkim/${domain}.private 2048
openssl rsa -in /etc/exim4/dkim/${domain}.private
-out /etc/exim4/dkim/${domain}.public -pubout
chmod 640 /etc/exim4/dkim/${domain}.private
chown root:Debian-exim /etc/exim4/dkim/${domain}.private
echo "Anahtar oluşturuldu: ${domain}"
done
Exim transport yapılandırmasında dkim_private_key direktifi zaten ${dkim_domain} değişkenini kullandığı için her domain otomatik olarak kendi anahtarıyla imzalanacaktır. Tabii ki her domain için DNS kaydı eklemeyi unutmayın.
Private Key Dosyası Yoksa Ne Olacak
dkim_strict = false ayarı, private key dosyası bulunamadığında Exim’in maili imzasız göndermesine izin verir. Üretim ortamında bazen bu istenen davranış olabilir (yeni domain eklendi ama henüz key oluşturulmadı gibi). Ama tüm maillerin imzalanmasını zorunlu kılmak istiyorsanız true yapın, bu durumda key bulunamazsa mail gönderimi başarısız olur.
Test ve Doğrulama
Yapılandırmayı uygulamadan önce syntax kontrolü yapın:
# Debian/Ubuntu
exim4 -bV
update-exim4.conf
exim4 -C /etc/exim4/exim4.conf.template -bV
# Ya da direkt test
exim -C /etc/exim4/exim4.conf -bV
Servisi yeniden başlatın:
# Systemd sistemler
systemctl restart exim4
# Ya da
service exim4 restart
Test Maili Gönderme ve Log İnceleme
# Test maili gönderin
echo "DKIM test mesaji" | mail -s "DKIM Test" [email protected]
# Log çıktısını takip edin
tail -f /var/log/exim4/mainlog | grep -i dkim
Başarılı bir DKIM imzalama log çıktısı şöyle görünmeli:
2024-01-15 10:23:45 1rJkLm-0001Ab-Cd => [email protected] R=dnslookup T=remote_smtp
DKIM: signing domain example.com selector mail
Online Doğrulama Araçları
Mail gönderildikten sonra header’ları inceleyerek DKIM imzasını görebilirsiniz. Gmail’de “Orijinali göster” seçeneğiyle raw header’a bakın. Şunu görmelisiniz:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com;
s=mail; t=1705312225; bh=...; h=Date:From:To:Subject:...;
b=...imza...
DNS kaydınızın yayıldığını kontrol etmek için:
# DNS TXT kaydını sorgulayın
dig +short TXT mail._domainkey.example.com
# Alternatif
nslookup -type=TXT mail._domainkey.example.com
DKIM ile Birlikte DMARC Yapılandırması
DKIM tek başına yeterli değil, DMARC ile tamamlanması gerekiyor. DNS’e şu kaydı ekleyin:
_dmarc.example.com TXT "v=DMARC1; p=none; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1"
DMARC politika seviyeleri:
- p=none: Sadece raporla, aksiyon alma (başlangıç için ideal)
- p=quarantine: İmza uyuşmazlığında spam olarak işaretle
- p=reject: İmza uyuşmazlığında maili reddet (güvenli olduktan sonra geçin)
Yeni kurulumda p=none ile başlayın, birkaç hafta raporları izleyin, sorun yoksa quarantine ve sonra reject politikasına geçin.
Sorun Giderme
DKIM İmzası Eklenmiyorsa
İlk kontrol noktanız Exim logları olmalı:
# Detaylı debug loglamasını aktif edin
exim -d+all -bd 2>&1 | head -100
# Ya da test maili debug modunda gönderin
exim -d+all -v [email protected] <<< "test"
Yaygın hatalar ve çözümleri:
“DKIM: private key file not readable” hatası izin sorunudur:
ls -la /etc/exim4/dkim/
# Exim kullanıcısının okuma izni olduğunu kontrol edin
chmod 640 /etc/exim4/dkim/example.com.private
chown root:Debian-exim /etc/exim4/dkim/example.com.private
“DKIM: no private key file found” hatası dosya adı uyuşmazlığına işaret eder. Exim ${sender_address_domain} değişkenini kullanıyorsa, dosyanın gerçekten o isimde olduğunu doğrulayın:
ls /etc/exim4/dkim/
# example.com.private dosyasının var olduğunu görmelisiniz
DNS Kaydı Doğrulanamıyorsa
DNS yayılımı zaman alabilir. Ama bazen sorun format hatasından kaynaklanır. Public key’i doğru şekilde kopyaladığınızdan emin olun:
# Public key'i DNS formatında hazırlayın
echo "v=DKIM1; k=rsa; p=$(grep -v '^-' /etc/exim4/dkim/example.com.public | tr -d 'n')"
Bu komutun çıktısını kopyalayıp DNS paneline yapıştırın. Bazı DNS panelleri çok uzun TXT kayıtlarını parçalara böler, bu normaldir.
Signature Verification Failed
Alıcı sunucunun imzayı doğrulayamamasının en yaygın sebebi canonicalization ayarıdır. relaxed/relaxed en uyumlu seçenektir:
# Exim config'de kontrol edin
grep dkim_canon /etc/exim4/exim4.conf
# Şunu görmelisiniz: dkim_canon = relaxed
Key Rotation: DKIM Anahtarlarını Periyodik Değiştirme
Güvenlik açısından DKIM anahtarlarınızı düzenli olarak (6-12 ayda bir) değiştirmeniz önerilir. Bunu kesintisiz yapmak için selector mekanizmasını kullanırsınız:
#!/bin/bash
# /usr/local/bin/dkim-rotate.sh
DOMAIN=$1
NEW_SELECTOR=$(date +%Y%m)
DKIM_DIR="/etc/exim4/dkim"
if [ -z "$DOMAIN" ]; then
echo "Kullanim: $0 example.com"
exit 1
fi
# Yeni anahtar oluştur
openssl genrsa -out ${DKIM_DIR}/${DOMAIN}.${NEW_SELECTOR}.private 2048
openssl rsa -in ${DKIM_DIR}/${DOMAIN}.${NEW_SELECTOR}.private
-out ${DKIM_DIR}/${DOMAIN}.${NEW_SELECTOR}.public -pubout
chmod 640 ${DKIM_DIR}/${DOMAIN}.${NEW_SELECTOR}.private
chown root:Debian-exim ${DKIM_DIR}/${DOMAIN}.${NEW_SELECTOR}.private
# DNS kaydı için public key'i çıkart
PUBKEY=$(grep -v '^-' ${DKIM_DIR}/${DOMAIN}.${NEW_SELECTOR}.public | tr -d 'n')
echo "==================================="
echo "Yeni selector: ${NEW_SELECTOR}"
echo "DNS TXT kaydi:"
echo "${NEW_SELECTOR}._domainkey.${DOMAIN} TXT "v=DKIM1; k=rsa; p=${PUBKEY}""
echo "==================================="
echo "DNS kaydi yayildiktan SONRA Exim config'i guncelleyin:"
echo "dkim_selector = ${NEW_SELECTOR}"
Key rotation sürecini şöyle yapmalısınız:
- Yeni anahtarı oluşturun ve DNS’e ekleyin
- 24-48 saat bekleyin (DNS yayılımı için)
- Exim yapılandırmasında selector’ı yeni değere güncelleyin
- Servisi yeniden başlatın
- Eski DNS kaydını birkaç gün sonra kaldırın
cPanel/WHM Ortamında Exim DKIM
cPanel kullanan sunucularda DKIM yönetimi biraz farklı çalışır. WHM üzerinden “Email Authentication” bölümünden DKIM’i etkinleştirebilirsiniz, ama bazen manuel müdahale gerekir:
# cPanel DKIM private key konumu
ls /etc/domainkeys/
# Manuel key oluşturma (cPanel formatı)
openssl genrsa -out /etc/domainkeys/example.com 2048
chown mailnull:mail /etc/domainkeys/example.com
chmod 640 /etc/domainkeys/example.com
cPanel’in Exim yapılandırmasında DKIM bölümü genellikle /etc/exim.conf.local dosyasına eklenir. WHM’den değiştirilen ayarlar /etc/exim.conf üzerine yazılır, bu yüzden exim.conf.local kullanmak güvenlidir.
Performans Optimizasyonu
DKIM imzalama CPU açısından hafif bir yük getirir. Çok yoğun mail sunucularında bunu optimize etmek gerekebilir.
Büyük RSA işlemleri için OpenSSL engine’ini aktif edin ve Exim’in birden fazla delivery process kullanmasını sağlayın. Bunun yanı sıra dkim_sign_headers direktifinde sadece kritik header’ları listeleyin, gereksiz header’ları eklemeyin.
# Exim'in kaç delivery prosesi çalıştırdığını görün
exiwhat | grep -c "delivering"
# Kuyruk durumunu kontrol edin
exim -bpc
Ana config’e şu ayarı ekleyerek paralel delivery sayısını artırabilirsiniz:
remote_max_parallel = 20
Monitoring: DKIM İmzalarını İzleme
Production ortamında DKIM başarı oranını izlemek için basit bir log analiz scripti:
#!/bin/bash
# /usr/local/bin/dkim-stats.sh
# Günlük DKIM istatistikleri
LOG="/var/log/exim4/mainlog"
DATE=$(date +"%Y-%m-%d")
echo "=== DKIM Istatistikleri: $DATE ==="
TOTAL=$(grep "$DATE" $LOG | grep "=>" | wc -l)
DKIM_OK=$(grep "$DATE" $LOG | grep -i "dkim.*signing" | wc -l)
DKIM_FAIL=$(grep "$DATE" $LOG | grep -i "dkim.*fail|dkim.*error" | wc -l)
echo "Toplam giden mail: $TOTAL"
echo "DKIM imzali: $DKIM_OK"
echo "DKIM hata: $DKIM_FAIL"
if [ $TOTAL -gt 0 ]; then
PERCENT=$(echo "scale=2; $DKIM_OK * 100 / $TOTAL" | bc)
echo "DKIM basari orani: %$PERCENT"
fi
# Son hatalari listele
if [ $DKIM_FAIL -gt 0 ]; then
echo ""
echo "Son DKIM hatalari:"
grep "$DATE" $LOG | grep -i "dkim.*fail|dkim.*error" | tail -10
fi
Bu scripti cron’a ekleyin:
chmod +x /usr/local/bin/dkim-stats.sh
echo "0 8 * * * root /usr/local/bin/dkim-stats.sh | mail -s 'DKIM Raporu' [email protected]" >> /etc/crontab
Sonuç
Exim ile DKIM imzalama yapılandırması, doğru adımlar izlendiğinde oldukça straightforward bir süreç. Özetlemek gerekirse: RSA anahtar çifti oluşturun, public key’i DNS’e TXT kaydı olarak ekleyin, Exim transport’unda DKIM direktiflerini yapılandırın ve test edin.
Dikkat etmeniz gereken kritik noktalar şunlar: dosya izinleri (Exim kullanıcısının private key’i okuyabilmesi lazım), DNS kaydının doğru formatda olması ve relaxed canonicalization kullanımı. Bunları doğru yaparsanız büyük mail sağlayıcılarıyla deliverability sorununuz kalmaz.
DKIM’i kurduktan sonra sıradaki adım DMARC raporlarını izlemek ve zamanla p=reject politikasına geçmek. SPF, DKIM ve DMARC’ın üçü birlikte olduğunda mail domain’iniz için sağlam bir kimlik doğrulama altyapısı kurmuş olursunuz. Key rotation’ı da ihmal etmeyin, 6-12 ayda bir anahtarları yenilemek güvenlik hijyeninin önemli bir parçası.