SpamAssassin, yirmi yılı aşkın süredir posta sunucularının spam savunmasında duran, kural tabanlı ve istatistiksel filtreleri birleştiren bir puanlama motorudur. SpamAssassin kurulumu tek başına bir spam çözümü değildir; asıl iş, sunucuna gelen gerçek trafiğe göre skorları ayarlamak, kendi kurallarını yazmak ve Bayes sınıflandırıcısını düzenli eğitmektir. Varsayılan ayarlarla bıraktığında hem çok spam kaçırır hem de zaman zaman meşru mailleri işaretler.
Bu rehberde SpamAssassin'i kuracak, Postfix'e bağlayacak, local.cf dosyasındaki kritik parametreleri tek tek açıklayacak, kendi kural setini yazacak ve Bayes filtresini eğiteceğiz. Ayrıca hangi kural setinin ne kadar yük getirdiğini, hangi skorun neye karşılık geldiğini ve yanlış pozitif geldiğinde nereden başlanacağını konuşacağız. Eğer sıfırdan yeni bir sunucu kuruyorsan sonda Rspamd ile karşılaştırmaya da yer verdim.
Kurulum ve Servis Yapısı#
SpamAssassin iki parça hâlinde çalışır: spamd arka plan servisi kuralları bellekte tutar, spamc ise maili bu servise gönderen hafif istemcidir. Her mail için Perl yorumlayıcısını yeniden başlatmamanın tek yolu budur.
# Kurulum (Debian/Ubuntu)
apt update
apt install -y spamassassin spamc
# Servisi etkinleştir
systemctl enable --now spamassassin
# Kural setlerini indir ve derle
sa-update --no-gpg
systemctl reload spamassassin
# Sürüm ve kural durumu
spamassassin --version
sa-update --check-only ; echo "çıkış kodu: $?"
sa-update komutunun çıkış kodu önemlidir: 0 yeni kural indirildiğini, 1 zaten güncel olduğunu, diğer değerler hata anlamına gelir. Bunu günlük bir cron işine bağla; kural setleri güncellenmezse filtre zamanla körelir.
# /etc/cron.daily/sa-update-custom
#!/bin/sh
sa-update --no-gpg && systemctl reload spamassassin
exit 0
Yapılandırma dosyaları /etc/spamassassin/ altında durur. Sistem genelindeki ayarlar için local.cf, kendi kuralların için ayrı bir dosya (örneğin 99-firmaniz.cf) kullan. Dosyalar alfabetik sırayla okunur ve aynı ayar iki kez tanımlıysa sonuncusu kazanır.
local.cf: Skorlar, Eşikler ve Başlıklar#
local.cf dosyası SpamAssassin'in davranışını belirleyen merkezdir. Aşağıdaki blok, çoğu kurulum için makul bir başlangıç noktasıdır.
# /etc/spamassassin/local.cf
# Bu skorun üstündeki mailler spam sayılır
required_score 5.0
# Spam maili yeniden paketleme, sadece başlık ekle
report_safe 0
# Konu satırını değiştirme; Sieve/filtre başlığa baksın
rewrite_header Subject ***SPAM***
# Bayes sınıflandırıcısı
use_bayes 1
bayes_auto_learn 1
bayes_auto_learn_threshold_nonspam 0.1
bayes_auto_learn_threshold_spam 12.0
# Ağ testleri (RBL, DNS sorguları) — kapatırsan doğruluk ciddi düşer
skip_rbl_checks 0
dns_available yes
# Kendi alan adlarını "güvenilir" olarak tanıt
trusted_networks 127.0.0.1 185.12.34.56
internal_networks 127.0.0.1
report_safe değeri çoğu kişinin gözden kaçırdığı bir ayardır. Varsayılan 1, spam olarak işaretlenen maili yeni bir mailin eki hâline getirir; kullanıcı orijinali görmek için eki açmak zorunda kalır ve bu berbat bir deneyimdir. 0 yaparsan mail olduğu gibi kalır, sadece başlıklara puan bilgisi eklenir.
required_score değerini düşürme konusunda dikkatli ol. Aşağıdaki tablo, skor eşiğinin pratikte ne anlama geldiğini özetliyor:
| Eşik | Yakalama oranı | Yanlış pozitif riski | Uygun senaryo |
|---|---|---|---|
| 3.0 | Çok yüksek | Yüksek | Yalnızca karantina, silme yok |
| 5.0 | Yüksek | Düşük | Varsayılan, çoğu kurulum |
| 6.5 | Orta | Çok düşük | Kritik iş yazışması yoğun kutular |
| 8.0+ | Düşük | İhmal edilebilir | Yalnızca en kaba spam yakalanır |
Eşiği tek bir sayı olarak düşünme; kullanıcı bazında da ayarlanabilir. Bir yöneticinin kutusu için 6.5, genel bilgi adresi için 4.0 kullanmak tamamen makul bir yaklaşımdır.
Postfix ile Entegrasyon#
SpamAssassin'i Postfix'e bağlamanın en yaygın yolu, mailleri bir içerik filtresi (content filter) üzerinden geçirmektir. Bunun için master.cf içinde bir servis tanımlanır.
# /etc/postfix/master.cf
smtp inet n - y - - smtpd
-o content_filter=spamassassin
spamassassin unix - n n - - pipe
user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Bu yöntemin bir dezavantajı var ve bilmen gerekir: mail önce kabul edilir, sonra taranır. Yani spam çıkarsa reddedemezsin, ya sessizce silersin ya da kullanıcıya işaretli teslim edersin. Reddetme isteyen kurulumlar spamass-milter paketini tercih eder:
# Milter yaklaşımı — maili kabul etmeden reddedebilir
# /etc/postfix/main.cf
smtpd_milters = unix:/spamass/spamass.sock
milter_default_action = accept
milter_default_action = accept satırını mutlaka koy. SpamAssassin servisi durursa Postfix mail almaya devam etsin; filtre arızası yüzünden tüm mail trafiğini durdurmak, tarama yapmamaktan çok daha pahalıdır. Postfix tarafındaki diğer parametreleri ve kısıtlama zincirini Postfix main.cf yapılandırması yazısında bulabilirsin.
Entegrasyonun çalıştığını doğrulamak için standart GTUBE test dizesini kullan:
# Bu dizeyi içeren mail her zaman yüksek skor almalı
echo "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X" \
| spamc -R | head -n 5
Kendi Kurallarını Yazmak#
SpamAssassin'in gerçek gücü, kendi trafiğine özgü kurallar yazabilmendir. Bir kural üç satırdan oluşur: eşleşme (header, body, full ya da uri), skor ve açıklama.
# /etc/spamassassin/99-firmaniz.cf
# Konu satırında Türkçe kredi spam'i kalıbı
header LOCAL_KREDI_SPAM Subject =~ /kredi\s*(basvuru|onay|firsat)/i
score LOCAL_KREDI_SPAM 3.5
describe LOCAL_KREDI_SPAM Konu satırında tipik kredi spam kalıbı
# Gövdede kısaltılmış bağlantı + aciliyet kalıbı birlikte
body LOCAL_ACIL_LINK /son\s*24\s*saat/i
score LOCAL_ACIL_LINK 1.5
describe LOCAL_ACIL_LINK Aciliyet baskısı içeren gövde ifadesi
# Kendi alan adımızdan geldiğini iddia eden ama dışarıdan gelen mail
header LOCAL_SAHTE_ICERIDEN From =~ /\@firmaniz\.com/i
meta LOCAL_SPOOF (LOCAL_SAHTE_ICERIDEN && !ALL_TRUSTED)
score LOCAL_SPOOF 4.0
describe LOCAL_SPOOF Dışarıdan gelen ama iç alan adı iddia eden mail
meta kuralları, birden fazla sinyalin birlikte görüldüğü durumu puanlamanı sağlar ve yanlış pozitifi ciddi biçimde azaltır. Tek başına "kendi alan adımdan geliyor" bir sinyal değildir; "kendi alan adımdan geliyor ama güvenilir ağdan gelmiyor" ise güçlü bir sahtecilik göstergesidir. Aynı sorunu DNS katmanında çözmek istersen e-posta spoofing önleme yazısındaki SPF ve DMARC yaklaşımı daha kalıcı bir savunma sunar.
Kural yazdıktan sonra mutlaka söz dizimini denetle ve tek bir mail üzerinde dene:
# Söz dizimi kontrolü (hata varsa satır numarasıyla bildirir)
spamassassin --lint
# Bir maili tara ve hangi kuralların tetiklendiğini gör
spamassassin -t < /tmp/ornek-mail.eml | grep -A 20 "Content analysis details"
--lint çıktısı boşsa kuralların temizdir. Bir satırda hata varsa SpamAssassin o dosyadaki tüm kuralları yok sayabilir, bu yüzden bu adımı asla atlama.
Bayes Eğitimi ve Beyaz Liste Yönetimi#
Bayes sınıflandırıcısı, senin gerçek trafiğinden öğrenir ve zamanla en değerli tekil sinyal hâline gelir. Otomatik öğrenme (bayes_auto_learn) açık olsa bile elle eğitim yapmak sonucu belirgin biçimde iyileştirir.
# Junk klasöründeki mailleri spam olarak öğret
sa-learn --spam --progress /var/mail/vhosts/firmaniz.com/ali/Maildir/.Junk/cur/
# Gelen Kutusu'ndaki temiz mailleri ham olarak öğret
sa-learn --ham --progress /var/mail/vhosts/firmaniz.com/ali/Maildir/cur/
# Öğrenilen örnek sayısını gör
sa-learn --dump magic | grep -E "nspam|nham"
# 0.000 0 1240 0 non-token data: nspam
# 0.000 0 1876 0 non-token data: nham
# Yanlış öğretilen bir maili geri al
sa-learn --forget < /tmp/yanlis-ogretilen.eml
İki sınıfın örnek sayısını dengede tutmaya çalış; 10:1 gibi bir orana çıkarsan sınıflandırıcı baskın sınıfa doğru kayar. Bayes veritabanının sağlığını periyodik olarak kontrol etmek de faydalıdır: sa-learn --force-expire eski jetonları temizler ve veritabanının şişmesini engeller.
Beyaz ve kara liste yönetimi ise local.cf içinden yapılır:
# Her zaman güven (dikkatli kullan — spoofing'e açıktır)
whitelist_from_rcvd *@musteri.com mail.musteri.com
# Basit beyaz liste (yalnızca From başlığına bakar, kolay taklit edilir)
whitelist_from [email protected]
# Her zaman spam say
blacklist_from *@bilinen-spam-alani.example
whitelist_from yerine mümkün olduğunca whitelist_from_rcvd kullan; ikincisi hem gönderen adresini hem de mailin gerçekten hangi sunucudan geldiğini kontrol eder. Sadece From başlığına bakan bir beyaz liste, saldırganın taklit etmesi için birebir davetiye niteliğindedir.
Sık Yapılan Hatalar ve Performans Tuzakları#
sa-updateçalıştırmamak. Kural setleri güncellenmezse SpamAssassin bir yıl sonra bugünün spam kalıplarını tanımaz. Günlük cron kur.spamdyerine doğrudanspamassassinçağırmak. Her mail için Perl yorumlayıcısı ve tüm kural seti yeniden yüklenir; yoğun bir sunucuda CPU tavan yapar. Her zamanspamcüzerinden konuş.--lintatlamak. Tek bir hatalı kural satırı, o dosyadaki tüm kuralları devre dışı bırakabilir ve hiçbir hata mesajı görmezsin.report_safe 1bırakmak. Kullanıcılar spam maili ek olarak alır, orijinali okumak için eki açmak zorunda kalır.trusted_networkstanımlamamak. SpamAssassin, kendi sunucunun ilettiği maili dışarıdan gelmiş gibi değerlendirir veReceivedbaşlığı zincirini yanlış yorumlar.- Ağ testlerini kapatmak.
skip_rbl_checks 1yazmak CPU tasarrufu sağlar ama doğruluk oranını ciddi biçimde düşürür; RBL kontrolleri en ucuz ve en etkili sinyallerdendir.
Performans tarafında bilmen gereken tek şey şu: SpamAssassin, Rspamd'a kıyasla belirgin biçimde daha fazla CPU ve RAM tüketir çünkü kuralları sırayla ve Perl içinde çalıştırır. Günde birkaç bin mailin üzerine çıkan bir sunucuda bu fark hissedilir hâle gelir; o noktada Rspamd kurulumu yazısındaki alternatifi değerlendirmek mantıklıdır. Paylaşımlı hosting kullanıyor ve sunucu düzeyinde ayara erişemiyorsan, cPanel e-posta filtreleri ile kullanıcı bazında benzer kurallar tanımlayabilirsin.
Sıkça Sorulan Sorular#
SpamAssassin ücretsiz mi#
Evet, SpamAssassin Apache Software Foundation çatısı altında geliştirilen açık kaynaklı bir projedir ve Apache Lisansı ile ücretsiz dağıtılır. Kurulum, kullanım ve kural setlerinin güncellenmesi için herhangi bir ücret ödemezsin. Bazı üçüncü parti kural setleri ya da ticari kara liste servisleri ayrı abonelik isteyebilir, ancak temel çekirdek ve resmi kural kanalları tamamen ücretsizdir.
required_score değerini kaça ayarlamalıyım#
Varsayılan 5.0 değeri çoğu kurulum için dengeli bir noktadır ve iyi bir başlangıçtır. Kritik iş yazışması alan kutularda yanlış pozitif riskini azaltmak için 6.0-6.5 aralığına çıkabilirsin. Eşiği 4.0'ın altına indirmeyi ancak spam'i silmek yerine karantinaya alıyorsan düşün; aksi hâlde meşru bültenlerin ve otomatik bildirimlerin kaybolma ihtimali ciddi biçimde artar. Değiştirmeden önce en az iki hafta skor dağılımını izle.
Meşru mailler spam'e düşüyor, nereden başlamalıyım#
Sorunlu mailin ham hâlini alıp spamassassin -t < mail.eml komutundan geçir; çıktının "Content analysis details" bölümü hangi kuralın kaç puan verdiğini satır satır gösterir. Sebep genellikle gönderenin SPF veya DKIM kaydının eksik olması, IP'sinin bir kara listede bulunması ya da Bayes filtresinin yeterince ham örnek görmemesidir. Tek bir kural sürekli sorun çıkarıyorsa o kuralın skorunu local.cf içinde düşürebilirsin.
Bayes veritabanını sıfırlayabilir miyim#
Evet, sa-learn --clear komutu tüm öğrenilmiş verileri siler ve sınıflandırıcıyı sıfırdan başlatır. Bunu yalnızca veritabanı ciddi biçimde bozulduğunda ya da yanlış eğitim yüzünden filtre tutarsız davrandığında yap; sonrasında yeniden eğitim için birkaç yüz örnek gerekir. Tek bir maili yanlış öğrettiysen tüm veritabanını silmene gerek yok, sa-learn --forget ile sadece o maili geri alabilirsin.
SpamAssassin yerine ne kullanmalıyım#
Yeni bir kurulum yapıyor ve yüksek hacim bekliyorsan Rspamd güçlü bir alternatiftir; kuralları paralel çalıştırdığı için aynı donanımda çok daha fazla mail işler ve maili kabul etmeden reddedebilir. Bulut tabanlı bir çözüm istiyorsan gelen mailleri filtreleyen harici geçit servisleri de vardır. Ancak var olan SpamAssassin kurulumun sorunsuz çalışıyor ve hacmin donanımını zorlamıyorsa taşınmak için teknik bir zorunluluk yoktur.
Kural yazdım ama çalışmıyor, nasıl kontrol ederim#
İlk adım her zaman spamassassin --lint çalıştırmaktır; söz dizimi hatası varsa satır numarasıyla bildirir ve o dosyadaki diğer kurallar da devre dışı kalmış olabilir. Lint temizse kuralı test maili üzerinde spamassassin -t ile dene ve tetiklenen semboller arasında adını ara. Servisi yeniden yüklemeyi unutma; spamd kuralları bellekte tuttuğu için systemctl reload spamassassin çalıştırmadan yeni kuralın etkili olmaz.
Kapanış#
SpamAssassin'i işe yarar hâle getiren şey kurulum değil bakımdır. Aklında tutman gereken dört alışkanlık şunlar: sa-update için günlük bir cron kurmak, her kural değişikliğinden sonra spamassassin --lint çalıştırmak, Bayes filtresini iki sınıftan dengeli örneklerle beslemek ve trusted_networks değerini kendi sunucularınla doğru tanımlamak. Yanlış pozitif geldiğinde tahmin yürütmek yerine maili spamassassin -t ile taramayı refleks hâline getirirsen, çoğu şikâyeti birkaç dakikada kapatırsın.
Bu yığını kendin kurup yönetmek istiyorsan VDS ve sanal sunucu paketlerimizde tam root erişimiyle çalışabilirsin. Filtre ve MTA kurulumuyla uğraşmadan gönderim yapmak istersen SMTP sunucu paketlerimiz spam filtresi kurulu teslim edilir; sunucu bakımını devretmek istersen sunucu yönetimi hizmetimiz kural güncellemelerini de üstlenir. Yalnızca posta kutusu ihtiyacın varsa kurumsal e-posta çözümümüzde filtreleme zaten hazır gelir.