Postfix ile Spam Filtreleme: SpamAssassin ve Amavis Kurulumu

Mail sunucusu kurduğunuzda karşılaştığınız en büyük sorunlardan biri spam yönetimidir. İyi yapılandırılmamış bir mail sunucusu, kullanıcıların gelen kutusunu çöp postayla doldurur ve zamanla güvenilirliğini kaybeder. Postfix tek başına güçlü bir MTA olsa da spam filtreleme için SpamAssassin ve Amavis gibi ek araçlara ihtiyaç duyar. Bu yazıda bu üç bileşeni birlikte nasıl çalıştıracağınızı, gerçek dünya senaryolarıyla birlikte ele alacağız.

Mimari Nedir, Nasıl Çalışır?

Önce büyük resmi anlamak gerekiyor. Postfix bir e-posta alır, bunu Amavis’e iletir. Amavis bir içerik tarama orkestratörü olarak çalışır; SpamAssassin’i çağırır, isteğe bağlı olarak ClamAV gibi antivirüs araçlarını da devreye sokar. SpamAssassin mesajı analiz eder ve bir puan döndürür. Amavis bu puana göre mesajı kabul eder, reddeder veya karantinaya alır. Son olarak temiz mesaj tekrar Postfix üzerinden kullanıcıya teslim edilir.

Bu akış şöyle görselleştirilebilir:

İnternet --> Postfix (port 25) --> Amavis (port 10024) --> SpamAssassin
                                          |
                                   Temiz Mesaj
                                          |
                              Postfix (port 10025) --> Kullanıcı

Bu mimarinin avantajı modülerliğidir. SpamAssassin’i tek başına güncelleyebilir, Amavis ayarlarını değiştirip SpamAssassin’e dokunmayabilirsiniz. Her bileşen kendi işini yapar.

Gereksinimler ve Kurulum

Bu yazıdaki örnekler Ubuntu 22.04 / Debian 11 tabanlıdır. CentOS/RHEL kullananlar için paket isimleri farklı olabilir ama mantık aynıdır.

Postfix’in zaten kurulu ve çalışır durumda olduğunu varsayıyorum. Değilse önce temel Postfix kurulumunu tamamlayın.

apt update
apt install -y amavisd-new spamassassin spamassassin-rules 
    libmail-dkim-perl libnet-dns-perl libmail-spf-perl 
    pyzor razor arj bzip2 cabextract cpio file gzip 
    lhasa nomarch p7zip pax unzip zip zoo

Burada yüklenen ek paketler Amavis’in çeşitli arşiv formatlarını açabilmesi için gereklidir. Eksik arşiv desteği, zararlı içeriklerin gözden kaçmasına yol açabilir.

Servislerin durumunu kontrol edelim:

systemctl status amavis
systemctl status spamassassin

İkisi de inactive görünüyorsa sorun değil, yapılandırmayı tamamladıktan sonra başlatacağız.

SpamAssassin Yapılandırması

SpamAssassin’in ana yapılandırma dosyası /etc/spamassassin/local.cf dosyasıdır. Bu dosyayı sıfırdan düzenleyelim:

nano /etc/spamassassin/local.cf

Temel ve güvenli bir başlangıç yapılandırması şöyle olabilir:

# Spam eşik puanı - bu değerin üzerindeki mailler spam sayılır
required_score 5.0

# Başlıklara X-Spam bilgisi ekle
rewrite_header Subject [SPAM]

# Spam raporunu mesaja ekle
report_safe 0

# DNS tabanlı kontrolleri etkinleştir
use_bayes 1
bayes_auto_learn 1
bayes_auto_learn_threshold_nonspam 0.1
bayes_auto_learn_threshold_spam 12.0

# Pyzor ve Razor entegrasyonu
use_pyzor 1
use_razor2 1

# SPF kontrolü
use_auto_whitelist 0

# Karakter seti sorunlarını önle
normalize_charset 1

# Türkçe içerik için ek ayar
ok_locales tr en

# Whitelist - güvendiğin domainler
whitelist_from *@guvendigim-domain.com

# Blacklist - her zaman spam olarak işaretle
blacklist_from *@bilinen-spam-domain.com

required_score değeri kritiktir. 5.0 varsayılan değerdir ve genellikle iyi çalışır. Çok fazla yanlış pozitif alıyorsanız bu değeri 6.0 veya 7.0’a çıkarabilirsiniz. Çok fazla spam geçiyorsa 4.0’a düşürebilirsiniz.

report_safe 0 ayarı spam mesajı orijinal haliyle saklar ve sadece başlıklara spam bilgisi ekler. 1 yaparsanız mesaj bir attachment haline gelir, bu da bazı mail istemcilerinde sorun yaratabilir.

Bayesian Filtreyi Eğitmek

Bayesian filtresi zamanla öğrenen bir sistemdir. Başlangıçta fazla etkili olmayabilir ama mail akışı arttıkça iyileşir. Manuel olarak da eğitebilirsiniz:

# Spam klasöründeki mailleri spam olarak öğret
sa-learn --spam /home/kullanici/Maildir/.Spam/cur/

# Gelen kutusunu ham olarak öğret
sa-learn --ham /home/kullanici/Maildir/cur/

# Bayesian veritabanı istatistiklerini görüntüle
sa-learn --dump magic

İlk öğretmede en az 200 spam ve 200 ham mesaj kullanmanız önerilir. Az veriyle eğitilen Bayesian filtresi tutarsız sonuçlar üretir.

SpamAssassin Servisini Yapılandırma

/etc/default/spamassassin dosyasını düzenleyin (Debian tabanlı sistemlerde):

# SpamAssassin daemon'ı etkinleştir
ENABLED=1
DAEMON=yes

# Daemon seçenekleri - 4 çocuk süreç, 5 dakikada bir güncelleme
OPTIONS="--create-prefs --max-children 4 --username debian-spamd 
         --helper-home-dir /var/lib/spamassassin -s /var/log/spamd.log"

# Otomatik kural güncelleme
CRON=1

Amavis Yapılandırması

Amavis’in yapılandırma dosyaları /etc/amavis/conf.d/ dizininde bulunur. Bu dizindeki dosyalar alfabetik sırayla yüklenir. Ana yapılandırmayı 50-user dosyasına yazacağız:

nano /etc/amavis/conf.d/50-user

Aşağıdaki yapılandırma üretim ortamı için makul bir başlangıç noktasıdır:

use strict;

# Temel kimlik bilgileri
$myhostname = 'mail.sirket.com';

# Amavis'in bağlı olacağı adresi dinleme portu
$inet_socket_port = 10024;

# Postfix'e teslim için port
$forward_method = 'smtp:[127.0.0.1]:10025';

# Spam eylem eşikleri
$sa_spam_subject_tag = '[SPAM] ';
$sa_tag_level_deflt  = 2.0;   # Bu puanın üzerinde X-Spam başlığı ekle
$sa_tag2_level_deflt = 6.31;  # Bu puanın üzerinde Subject'i değiştir
$sa_kill_level_deflt = 10.0;  # Bu puanın üzerinde mesajı reddet/karantina
$sa_dsn_cutoff_level = 10;

# Spam eylemler
$final_spam_destiny   = D_DISCARD;  # Spam'i sil (D_BOUNCE, D_REJECT, D_PASS da olabilir)
$final_virus_destiny  = D_DISCARD;
$final_banned_destiny = D_BOUNCE;

# Karantina adresi - spam buraya kopyalanır
$spam_quarantine_to   = '[email protected]';

# SpamAssassin entegrasyonu
$sa_local_tests_only  = 0;  # DNS testleri de yapsın
$sa_timeout           = 30; # SpamAssassin timeout süresi

# Log düzeyi (0-5, 2 genellikle yeterli)
$log_level = 2;

# Virüs tarama motoru
@av_scanners = ();  # ClamAV varsa buraya ekleyebilirsiniz

# Güvenilir ağlar - iç ağdan gelen mailler bu adresten geçer
@mynetworks = qw( 127.0.0.0/8 192.168.1.0/24 10.0.0.0/8 );

# Bildirim e-postaları için
$notify_method  = 'smtp:[127.0.0.1]:10025';

1;  # Perl modülü olduğu için bu satır şart

$final_spam_destiny değerini dikkatli seçin. D_DISCARD spam’i sessizce siler. D_BOUNCE gönderene hata mesajı döndürür (backscatter riski!). D_REJECT bağlantı sırasında reddeder. D_PASS spam’i işaretleyip geçirir.

Üretim ortamında başlangıçta D_PASS kullanıp logları takip etmenizi öneririm. Sistemin doğru çalıştığına emin olduktan sonra D_DISCARD‘a geçebilirsiniz.

Postfix ile Entegrasyon

Postfix’i Amavis ile konuşturmak için main.cf ve master.cf dosyalarını düzenlememiz gerekiyor.

Önce main.cf‘e content filter direktifini ekleyelim:

nano /etc/postfix/main.cf

Dosyanın sonuna şunu ekleyin:

# Amavis content filter
content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

Şimdi master.cf‘e Amavis bağlantıları için gerekli servisleri ekleyelim:

nano /etc/postfix/master.cf

Dosyanın sonuna şunu ekleyin:

# Amavis'e iletim
smtp-amavis unix -    -    n    -    2  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

# Amavis'ten geri teslim
127.0.0.1:10025 inet n  -    n    -     -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters

Bu yapılandırmada 10025 portu önemli. Amavis mesajı temizledikten sonra bunu 10025 portundan Postfix’e iade eder. Bu döngüyü engellemek için 10025’te content_filter boş bırakılır.

Servisleri Başlatma ve Test

Tüm yapılandırmaları tamamladıktan sonra servisleri sırayla başlatalım:

# SpamAssassin kurallarını güncelle
sa-update

# Servisleri başlat
systemctl enable --now spamassassin
systemctl enable --now amavis
systemctl restart postfix

# Durumları kontrol et
systemctl status spamassassin amavis postfix

Portların dinlendiğini doğrulayalım:

ss -tlnp | grep -E '(10024|10025|25|587)'

Çıktıda 10024 (Amavis) ve 25 (Postfix) portlarını görmelisiniz.

GTUBE Test Maili

SpamAssassin’in çalışıp çalışmadığını test etmek için GTUBE (Generic Test for Unsolicited Bulk Email) dizesini içeren bir test maili gönderin:

echo "Subject: Test Spam Mail
From: [email protected]
To: [email protected]

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X" | 
sendmail [email protected]

Bu mesaj SpamAssassin tarafından 1000 puan olarak değerlendirilir ve sisteminiz doğru çalışıyorsa spam olarak işaretlenir veya reddedilir.

Log Analizi ve Sorun Giderme

Bir şeyler yanlış gittiğinde ilk bakacağınız yer loglar olmalıdır:

# Mail loglarını canlı takip et
tail -f /var/log/mail.log

# Sadece spam ile ilgili kayıtlar
grep -i "spam|blocked|bounce" /var/log/mail.log | tail -50

# Amavis logları
grep "amavis" /var/log/mail.log | grep -v "^#" | tail -30

Tipik bir başarılı spam filtreleme logu şöyle görünür:

amavis[1234]: (1234-01) Blocked SPAM, <[email protected]> -> <[email protected]>,
quarantine: spam-abc123.gz, Message-ID: <[email protected]>,
mail_id: abc123, Hits: 15.5, size: 2048

Hits: 15.5 değeri SpamAssassin puanıdır. $sa_kill_level_deflt değerinizin üzerindeyse mesaj engellenir.

Yaygın Sorunlar

Eğer Amavis başlamıyorsa genellikle Perl modülleri eksiktir:

# Eksik Perl modüllerini kontrol et
amavisd-new -d 3 2>&1 | grep -i "error|can't"

# Gerekli modülleri yükle
apt install -y libmime-tools-perl libarchive-zip-perl 
    libconvert-uulib-perl libcompress-raw-zlib-perl

Yanlış pozitif oranı yüksekse (meşru mailler spam diye işaretleniyorsa), önce hangi kuralların tetiklendiğini analiz edin:

# Spesifik bir mesajı test et
spamassassin -t < /tmp/test-mesaj.eml

# Hangi kurallar tetiklendi görmek için
spamassassin -t -D < /tmp/test-mesaj.eml 2>&1 | grep "pts rule"

Gerçek Dünya Senaryosu: Kurumsal Mail Ortamı

Bir müşteri projesinde 500 kullanıcılı kurumsal bir mail ortamı kuruyorduk. Başlangıçta standart yapılandırmayla gittik ama iki sorunla karşılaştık.

Birinci sorun: Muhasebe departmanının kullandığı bir finans yazılımı otomatik mail gönderiyordu. Bu mailler SpamAssassin tarafından sürekli 8-9 puan alıyor ve spam olarak işaretleniyordu. Çözüm olarak bu sunucunun IP’sini whitelist’e aldık:

nano /etc/spamassassin/local.cf
# İç uygulama sunucusunu whitelist'e al
whitelist_from_rcvd *@sirket.com 192.168.1.50
trusted_networks 192.168.1.50

İkinci sorun: Bazı Türkçe karakterli mailler yanlış encoding nedeniyle yüksek puan alıyordu. Bunu da local.cf‘de çözdük:

# Türkçe karakter sorunlarını ele al
normalize_charset 1
ok_locales tr en de fr

# HTML içerikli Türkçe mailler için puan düzeltmesi
score HTML_MESSAGE 0.1
score MIME_HTML_ONLY 0.5

Kural Özelleştirme

SpamAssassin kurallarını kendiniz de yazabilirsiniz. Belirli bir içeriği her zaman spam olarak işaretlemek istiyorsanız:

nano /etc/spamassassin/local.cf
# Özel kural - konu satırında "bedava" içeriyorsa puan ver
header LOCAL_BEDAVA_KONU Subject =~ /bedava|ücretsiz kazanç|hızlı para/i
score LOCAL_BEDAVA_KONU 4.0
describe LOCAL_BEDAVA_KONU Konu satirinda spam kelimeler var

# Body içeriği için kural
body LOCAL_SPAM_BODY /tıklayın ve kazanın|hemen üye olun/i
score LOCAL_SPAM_BODY 3.5
describe LOCAL_SPAM_BODY Govde spam kelimeleri iceriyor

# Belirli bir domain'den gelen her mesaja puan ekle
header LOCAL_BLOCKED_DOMAIN From =~ /@spamdomain.com/i
score LOCAL_BLOCKED_DOMAIN 10.0

Kuralları yazdıktan sonra söz dizimi hatası olup olmadığını kontrol edin:

spamassassin --lint

Hata yoksa SpamAssassin’i yeniden başlatın:

systemctl reload spamassassin

Otomatik Kural Güncelleme

SpamAssassin kuralları düzenli güncellenmelidir. Bunun için cron job kuruyoruz:

crontab -e
# Her gün gece 02:00'de SpamAssassin kurallarını güncelle
0 2 * * * /usr/bin/sa-update && /bin/systemctl reload spamassassin >> /var/log/sa-update.log 2>&1

# Her hafta Bayesian veritabanını optimize et
0 3 * * 0 /usr/bin/sa-learn --force-expire >> /var/log/sa-learn.log 2>&1

sa-update komutu SpamAssassin’in resmi kural kanallarından güncellemeleri çeker. Bunu düzenli çalıştırmazsanız kurallar eskir ve spam geçirgenliği artar.

Performans Optimizasyonu

Yüksek mail trafiği olan ortamlarda Amavis ve SpamAssassin performans sorunlarına yol açabilir. Birkaç optimizasyon önerisi:

/etc/amavis/conf.d/50-user dosyasında:

# Paralel çalışan Amavis çocuk süreç sayısı
# CPU çekirdek sayısına göre ayarlayın
$max_servers = 4;

# SpamAssassin cache - aynı mesajı tekrar analiz etme
$sa_cache_expiry_min = 1;

# Büyük dosyaları taramayı atla (MB cinsinden)
$sa_mail_body_size_limit = 400*1024;  # 400KB üzerini atla

/etc/default/spamassassin dosyasında:

OPTIONS="--create-prefs --max-children 4 --username debian-spamd 
         --helper-home-dir /var/lib/spamassassin 
         --nouser-config 
         -s /var/log/spamd.log"

–nouser-config parametresi kullanıcı başına konfigürasyon dosyalarını devre dışı bırakır. Çok kullanıcılı sistemlerde bu önemli bir performans kazancı sağlar.

Raporlama ve İzleme

Spam istatistiklerini düzenli takip etmek, sistemin etkinliğini değerlendirmenize yardımcı olur:

# Son 24 saatte engellenen spam sayısı
grep "Blocked SPAM" /var/log/mail.log | grep "$(date +%b %e)" | wc -l

# En çok spam gönderen domainler
grep "Blocked SPAM" /var/log/mail.log | 
    grep -oP '(?<=<)[^>]+(?=>)' | 
    cut -d@ -f2 | sort | uniq -c | sort -rn | head -10

# SpamAssassin puan dağılımı
grep "Hits:" /var/log/mail.log | 
    grep -oP 'Hits: K[0-9.]+' | 
    awk '{sum+=$1; count++} END {print "Ortalama puan:", sum/count, "nToplam:", count}'

Bu komutları bir script haline getirip her sabah kendinize mail gönderebilirsiniz. Böylece sistemde anormal bir durum oluştuğunda haber almanız kolaylaşır.

Sonuç

Postfix, Amavis ve SpamAssassin üçlüsü doğru yapılandırıldığında kurumsal ortamlarda son derece güvenilir bir spam filtreleme sistemi oluşturur. Tamamen açık kaynak olması ve her bileşenin bağımsız olarak özelleştirilebilmesi bu mimarinin en büyük avantajıdır.

Başlangıçta D_PASS modunda çalıştırıp logları dikkatle takip edin. Yanlış pozitif ve yanlış negatif oranlarını dengeledikten sonra daha agresif filtreleme politikalarına geçin. Bayesian filtresini düzenli besleyin çünkü zamanla öğrenip iyileşiyor. Kural güncellemelerini otomatik hale getirin ve SpamAssassin puanlarını periyodik olarak gözden geçirin.

En önemli nokta: Hiçbir spam filtreleme sistemi yüzde yüz başarılı değildir. Hedef sıfır spam değil, yönetilebilir düzeyde spam ve minimum yanlış pozitiftir. Bu dengeyi bulmak birkaç haftalık ince ayar gerektirebilir ama sabırlı olun, sistem zamanla olgunlaşacaktır.

Yorum yapın