Mail sunucusu yönetiminde en kritik konulardan biri spam ve virüs filtrelemedir. Exim’in ACL (Access Control List) mekanizması, bu konuda inanılmaz derecede esnek ve güçlü bir yapı sunar. Doğru konfigüre edilmiş bir ACL sistemi, sunucunuza gelen zararlı trafiğin büyük çoğunluğunu SMTP seviyesinde keserek hem sunucu kaynaklarınızı korur hem de kullanıcılarınızı koruma altına alır. Bu yazıda Exim ACL’yi derinlemesine inceleyeceğiz ve gerçek dünya senaryolarıyla çalışan bir filtreleme sistemi kuracağız.
ACL Nedir ve Exim’de Nasıl Çalışır?
Exim ACL sistemi, bir mail bağlantısının farklı aşamalarında devreye giren kural setleridir. Her ACL, belirli bir SMTP komutuna veya olayına karşılık gelir. Bir istemci sunucunuza bağlandığında, EHLO gönderdiğinde, MAIL FROM verdiğinde, RCPT TO verdiğinde ve mesaj gövdesini ilettiğinde farklı ACL blokları çalışır.
Exim’in temel ACL noktaları şunlardır:
- acl_smtp_connect: TCP bağlantısı kurulduğunda
- acl_smtp_helo: HELO/EHLO komutu geldiğinde
- acl_smtp_mail: MAIL FROM komutu geldiğinde
- acl_smtp_rcpt: RCPT TO komutu geldiğinde (en kritik nokta)
- acl_smtp_data: Mesaj verisi alındıktan sonra
- acl_smtp_mime: MIME parçaları işlenirken
Bu noktaların her birinde accept, deny, defer, warn, require gibi eylemler kullanılarak trafiği şekillendirebilirsiniz. En önemli kural şudur: SMTP seviyesinde reddedilen mail, kuyrukta birikmez ve kaynak sunucuya bounce geri döner, bu da backscatter sorununu önler.
Exim Konfigürasyon Yapısı
ACL’leri düzenlemeden önce Exim konfigürasyon dosyasının yapısını anlamalısınız. Çoğu dağıtımda ana konfigürasyon /etc/exim4/exim4.conf veya cPanel/Plesk gibi panellerde /etc/exim.conf yolundadır.
# Exim versiyonunu kontrol et
exim --version
# Konfigürasyon dosyasının yerini bul
exim -bP config_file
# Konfigürasyonu syntax kontrolü ile test et
exim -C /etc/exim4/exim4.conf -bV
ACL’lerinizi ayrı bir dosyada tutmak yönetimi kolaylaştırır. Ana konfigürasyona şu satırı ekleyerek ACL dosyasını dahil edebilirsiniz:
# exim4.conf içinde
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
begin acl
.include /etc/exim4/acl_custom.conf
Temel ACL Blokları Oluşturma
RCPT ACL ile Bağlantı Seviyesi Filtreleme
En fazla filtreleme yapılan nokta RCPT ACL’dir. Burada bağlantıyı kabul etmeden önce pek çok kontrol yapabilirsiniz.
acl_check_rcpt:
# Yerel teslimatlar her zaman kabul et
accept hosts = :
# RFC uyumsuz HELO adlarını reddet
deny message = HELO/EHLO adı geçersiz
condition = ${if match{$sender_helo_name}{N^d+.d+.d+.d+$N}{yes}{no}}
# Whitelist - güvenilir hostlar
accept hosts = /etc/exim4/whitelist_hosts
# Kendi IP bloğundan gelen authenticated trafiği kabul et
accept authenticated = *
# RBL (Real-time Blackhole List) kontrolleri
deny message = $sender_host_address Spamhaus ZEN listesinde bulunuyor
dnslists = zen.spamhaus.org
log_message = RBL hit: zen.spamhaus.org - $sender_host_address
deny message = $sender_host_address SORBS listesinde bulunuyor
dnslists = dnsbl.sorbs.net
# Geçersiz alıcıları reddet
deny message = Bilinmeyen kullanıcı
domains = +local_domains
!verify = recipient
accept
Bu yapıda dikkat etmeniz gereken nokta şudur: Exim ACL’leri yukarıdan aşağıya işler ve ilk eşleşen kural geçerli olur. Bu nedenle whitelist kontrollerini her zaman RBL kontrollerinden önce koymanız gerekir, aksi halde whitelist’teki bir host RBL’de de görünüyorsa reddedilir.
Greylisting Implementasyonu
Greylisting, spam’in büyük bir kısmını durduran çok etkili bir yöntemdir. Gerçek mail sunucuları geçici hataları tekrar dener, spam botların çoğu denemez.
# ACL içinde greylisting
defer message = Geçici hata, lütfen tekrar deneyin (greylisting)
!hosts = /etc/exim4/whitelist_hosts
!authenticated = *
condition = ${if exists{/var/spool/exim4/greylist/${md5:$sender_host_address$sender_address$local_part@$domain}}{no}{yes}}
acl_m_greykey = ${md5:$sender_host_address$sender_address$local_part@$domain}
warn condition = ${if exists{/var/spool/exim4/greylist/${md5:$sender_host_address$sender_address$local_part@$domain}}{yes}{no}}
log_message = Greylisting geçildi: $sender_host_address
Greylisting dizinini oluşturun ve periyodik temizlik için bir cron job ekleyin:
# Greylisting dizinini oluştur
mkdir -p /var/spool/exim4/greylist
chown Debian-exim:Debian-exim /var/spool/exim4/greylist
# 24 saatten eski greylist kayıtlarını temizle (crontab)
# crontab -e ile ekleyin:
0 */6 * * * find /var/spool/exim4/greylist -mtime +1 -delete
SpamAssassin Entegrasyonu
SpamAssassin, içerik tabanlı spam filtrelemede endüstri standardıdır. Exim ile entegrasyonu için önce SpamAssassin’in çalıştığından emin olun.
# SpamAssassin kurulumu
apt-get install spamassassin spamc
# spamd servisini etkinleştir ve başlat
systemctl enable spamassassin
systemctl start spamassassin
# spamd durumunu kontrol et
systemctl status spamassassin
ss -tlnp | grep spamd
SpamAssassin entegrasyonu için DATA ACL bloğunu oluşturun:
acl_check_data:
# Kimliği doğrulanmış kullanıcıların maillerini SpamAssassin'e gönderme
accept authenticated = *
# SpamAssassin ile spam kontrolü
warn spam = nobody:true
condition = ${if <{$message_size}{500K}{yes}{no}}
add_header = X-Spam-Score: $spam_score ($spam_bar)
add_header = X-Spam-Report: $spam_report
# Yüksek skor - direkt reddet
deny message = Bu mesaj spam olarak tespit edildi (skor: $spam_score)
spam = nobody:true
condition = ${if >{$spam_score_int}{120}{yes}{no}}
# Orta skor - spam klasörüne yönlendir (header ekle)
warn spam = nobody:true
condition = ${if >{$spam_score_int}{50}{yes}{no}}
add_header = X-Spam-Status: YES
add_header = X-Spam-Flag: YES
accept
Buradaki spam_score_int değeri 10 ile çarpılmış integer değerdir. Yani 120 değeri aslında 12.0 spam skoruna karşılık gelir. Threshold değerlerini kendi ortamınıza göre ayarlamanız gerekir. Agresif filtreleme yapmadan önce birkaç hafta log izlemesi yapmanızı kesinlikle öneririm.
ClamAV ile Virüs Tarama
ClamAV, açık kaynaklı antivirus motoru olarak Exim ile mükemmel entegre olur. Önce kurulum ve konfigürasyon:
# ClamAV kurulumu
apt-get install clamav clamav-daemon
# İmza veritabanını güncelle
freshclam
# ClamAV daemon başlat
systemctl enable clamav-daemon
systemctl start clamav-daemon
# Socket'i kontrol et
ls -la /var/run/clamav/clamd.ctl
Exim için ClamAV entegrasyonu genellikle clamav-exim paketi veya content_scanner yöntemiyle yapılır. Modern yaklaşım clamd üzerinden TCP/Unix socket kullanmaktır:
# exim4.conf içinde virus tarama konfigürasyonu
# Bu satır main section'a eklenmeli
av_scanner = clamd:/var/run/clamav/clamd.ctl
# DATA ACL içinde virüs kontrolü
acl_check_data:
# Virüs taraması - büyük dosyaları atla (performans için)
deny malware = *
condition = ${if <{$message_size}{10M}{yes}{no}}
message = Mesajınız virüs içeriyor: $malware_name
log_message = VİRÜS TESPİT EDİLDİ: $malware_name - Gönderen: $sender_address
# Taranan ama temiz olan maillere header ekle
warn condition = ${if <{$message_size}{10M}{yes}{no}}
malware = */defer_ok
add_header = X-Antivirus: ClamAV; scanned
Önemli not: ClamAV daemon çalışmıyorsa ve defer_ok kullanmıyorsanız, tüm mailleri reddedebilirsiniz. Production ortamında mutlaka monitoring ekleyin ve ClamAV’ın durumunu izleyin.
MIME ACL ile Ek Filtreleme
Tehlikeli dosya uzantılarını MIME seviyesinde filtrelemek, virüs taramasından bağımsız ek bir güvenlik katmanı sağlar.
acl_smtp_mime:
# Yürütülebilir dosya uzantılarını reddet
deny message = Bu dosya türüne izin verilmiyor: $mime_filename
condition = ${if match{${lc:$mime_filename}}{N.(exe|com|bat|cmd|scr|pif|vbs|js|jar|msi|ps1|reg)$N}{yes}{no}}
log_message = Yasaklı ek engellendi: $mime_filename - Gönderen: $sender_address
# Şifreli zip/rar dosyalarına dikkat (ClamAV tarayamaz)
warn condition = ${if match{${lc:$mime_filename}}{N.(zip|rar|7z)$N}{yes}{no}}
add_header = X-Attachment-Warning: Şifreli arşiv olabilir, dikkatli açın
# Çift uzantılı dosyaları reddet (belge.pdf.exe gibi)
deny message = Şüpheli çift uzantılı dosya tespit edildi
condition = ${if match{${lc:$mime_filename}}{N.w+.(exe|bat|scr|vbs|js)$N}{yes}{no}}
accept
SPF, DKIM ve DMARC Kontrolleri
Modern mail güvenliği bu üç protokol olmadan eksik kalır. Exim’de SPF kontrolü için spfquery veya libspf2 kullanılabilir.
# libspf2 kurulumu
apt-get install libmail-spf-perl
# RCPT ACL içinde SPF kontrolü
acl_check_rcpt:
# SPF kontrolü
warn domains = !+local_domains
spf = pass
add_header = Received-SPF: pass ($sender_host_address SPF kaydı doğrulandı)
warn spf = fail
log_message = SPF FAIL: $sender_address - $sender_host_address - $spf_smtp_comment
add_header = X-SPF-Result: fail
# Sert SPF fail reddi (dikkatli kullanın, forward senaryolarını kırar)
# deny spf = fail
# !hosts = /etc/exim4/spf_whitelist
accept
DKIM doğrulaması için dkimpy veya Exim’in built-in DKIM desteğini kullanabilirsiniz:
# exim4.conf main section
# DKIM doğrulama
DKIM_VERIFY = true
# DATA ACL içinde DKIM
acl_check_data:
warn dkim_status = pass
add_header = X-DKIM-Status: pass (imza doğrulandı)
warn dkim_status = fail
log_message = DKIM FAIL: $dkim_domain - $sender_address
add_header = X-DKIM-Status: fail
Rate Limiting ile Flood Koruması
Bir IP’den gelen bağlantı sayısını sınırlamak, hem spam hem de DoS saldırılarına karşı etkilidir.
# CONNECT ACL içinde rate limiting
acl_smtp_connect:
# Her IP için dakikada maksimum 30 bağlantı
deny ratelimit = 30 / 1m / per_conn / strict
message = Çok fazla bağlantı, lütfen bekleyin
log_message = Rate limit aşıldı: $sender_host_address ($rate bağlantı/dakika)
# Authenticated kullanıcılar için outbound rate limiting
# (MAIL ACL'de yapılır)
accept
acl_smtp_mail:
# Authenticated kullanıcı başına saatte 500 mail
deny authenticated = *
ratelimit = 500 / 1h / per_conn
message = Saatlik mail gönderme limitinize ulaştınız
log_message = Auth kullanıcı rate limit: $authenticated ($rate mail/saat)
accept
Log Analizi ve Monitoring
İyi bir filtreleme sistemi kurmak yeterli değil, ne olduğunu düzenli izlemeniz gerekir.
# Exim mail log analizi
# Son 100 reddedilen maili göster
grep "rejected" /var/log/exim4/mainlog | tail -100
# RBL hit sayılarını özetle
grep "RBL hit" /var/log/exim4/mainlog | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
# SpamAssassin yüksek skor maillerini bul
grep "spam score" /var/log/exim4/mainlog | grep -E "score [89][0-9]|score [1-9][0-9]{2}" | tail -50
# Virüs tespitlerini listele
grep "VİRÜS TESPİT" /var/log/exim4/mainlog | awk '{print $6}' | sort | uniq -c | sort -rn
# Günlük istatistik özeti için eximstats kullanımı
eximstats -h1 -s1 -ne /var/log/exim4/mainlog | head -50
Gerçek dünya senaryosunda bir e-ticaret şirketinde çalışırken şöyle bir durumla karşılaştım: Bir hosting müşterisinin hesabı ele geçirildi ve dakikada 200’den fazla spam gönderilmeye başlandı. Rate limiting ACL olmasaydı tüm sunucunun IP adresi kara listeye alınacaktı. ACL sayesinde sistem otomatik olarak devreye girdi ve hesabı kapattı.
Whitelist ve Blacklist Yönetimi
Statik listeler, ACL sisteminin vazgeçilmez tamamlayıcısıdır.
# Whitelist dosyası oluştur
cat > /etc/exim4/whitelist_hosts << 'EOF'
# Format: IP veya CIDR notation
192.168.1.0/24
10.0.0.1
203.0.113.50
EOF
# Domain whitelist
cat > /etc/exim4/whitelist_domains << 'EOF'
partnercompany.com
trustedvendor.net
EOF
# Blacklist - kalıcı reddetme
cat > /etc/exim4/blacklist_hosts << 'EOF'
198.51.100.0/24
203.0.113.100
EOF
# ACL içinde kullanımı
acl_check_rcpt:
accept hosts = /etc/exim4/whitelist_hosts
accept sender_domains = /etc/exim4/whitelist_domains
deny hosts = /etc/exim4/blacklist_hosts
message = Erişiminiz engellenmiştir
Liste dosyalarını düzenledikten sonra Exim’i yeniden başlatmanıza gerek yok, dosyalar otomatik okunur. Ancak büyük listeler için lsearch yerine dbm formatı performans açısından çok daha iyidir:
# Whitelist'i DBM formatına dönüştür
exim_dbmbuild /etc/exim4/whitelist_hosts /etc/exim4/whitelist_hosts.db
# ACL'de kullanımı
accept hosts = dbm;/etc/exim4/whitelist_hosts.db
Test ve Doğrulama
Kurduğunuz ACL sistemini test etmeden production’a almayın.
# Belirli bir gönderenin ACL'den nasıl geçeceğini test et
exim -bh 192.0.2.100
# Ardından interaktif SMTP komutları girin:
# EHLO test.example.com
# MAIL FROM: <[email protected]>
# RCPT TO: <[email protected]>
# Konfigürasyonu yeniden yükle (restart gerektirmez)
kill -HUP $(cat /var/run/exim4/exim.pid)
# Veya systemctl ile
systemctl reload exim4
# ACL log'larını canlı izle
tail -f /var/log/exim4/mainlog | grep -E "rejected|denied|spam|virus|RBL"
# SpamAssassin skorlarını test et
spamassassin -D --lint 2>&1 | head -30
echo "Test maili" | spamassassin -R
Tüm Bileşenleri Bir Araya Getirmek
Gerçek bir production ortamında ACL’lerinizin sırası kritiktir. Önerilen sıralama şöyledir:
- 1. Whitelist kontrolleri: Güvenilir kaynaklar her zaman ilk geçer
- 2. Authentication kontrolleri: Giriş yapmış kullanıcılar ikinci sırada
- 3. HELO/EHLO doğrulama: Sahte kimlikler erken reddedilir
- 4. Rate limiting: Flood saldırıları durdurulur
- 5. RBL kontrolleri: Bilinen spam kaynaklara karşı
- 6. SPF kontrolü: Gönderen doğrulama
- 7. Greylisting: Yeni bağlantılar için geçici erteleme
- 8. Alıcı doğrulama: Geçersiz adreslere gelen mailler reddedilir
- 9. DATA ACL’de SpamAssassin: İçerik analizi
- 10. DATA ACL’de ClamAV: Virüs taraması
- 11. MIME ACL’de dosya tipi kontrolü: Tehlikeli ekler
Sonuç
Exim ACL sistemi, doğru kullanıldığında mail sunucunuzu bir kale gibi koruyabilir. Burada anlattığım yöntemleri tek seferde uygulamaya çalışmayın. Önce sadece loglama yapan warn kuralları ekleyin, sisteminizi anlayın, ardından yavaş yavaş deny kurallarına geçin.
En önemli tavsiyem şudur: False positive oranınızı düzenli kontrol edin. Bir müşterinin yasal maili yanlışlıkla reddediliyorsa, ne kadar iyi bir spam filtresi kurduğunuzun önemi kalmaz. SpamAssassin threshold değerlerini kendi trafik profilinize göre ayarlayın, hazır değerlere körü körüne güvenmeyin.
RBL listelerini dikkatli seçin. Spamhaus ZEN güvenilir bir seçimdir, ancak bazı küçük RBL listeleri agresif blocking politikasıyla meşru mailleri de engelleyebilir. Her RBL eklediğinizde reject oranınızı izleyin.
Son olarak, bu sistem ne kadar iyi olursa olsun, kullanıcı eğitimi olmadan tamamlanmaz. Teknik filtrelerden geçen phishing mailleri hala tehlike oluşturur. Teknik çözümü insan faktörüyle destekleyin.