Exim ACL ile Spam ve Virüs Filtreleme

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.

Yorum yapın