Mail sunucusu yönetiminde en can sıkıcı sorunlardan biri spam maillerin kullanıcı klasörlerine düşmesi ve bunu manuel olarak yönetmek zorunda kalmaktır. Dovecot’un Antispam plugin’i bu noktada işleri ciddi ölçüde kolaylaştırıyor: kullanıcılar maili Spam klasörüne taşıdığında ya da oradan çıkardığında, sistem otomatik olarak SpamAssassin veya başka bir spam filtresini yeniden eğitiyor. Bu yazıda Dovecot Antispam plugin’ini sıfırdan kurup yapılandırmayı ve gerçek dünya senaryolarında nasıl kullanılacağını anlatacağım.
Antispam Plugin Nedir ve Nasıl Çalışır?
Dovecot Antispam plugin’i, IMAP istemcilerinin spam eğitimi sürecini tamamen şeffaf hale getirir. Normalde bir kullanıcı SpamAssassin’i eğitmek istediğinde sa-learn --spam veya sa-learn --ham komutlarını çalıştırması gerekir. Bu elbette normal bir kullanıcı için mümkün değildir.
Plugin’in çalışma mantığı şu şekildedir:
- Kullanıcı bir maili Spam/Junk klasörüne taşıdığında:
sa-learn --spamtetiklenir - Kullanıcı bir maili Spam klasöründen Inbox’a geri taşıdığında:
sa-learn --hamtetiklenir - Kullanıcı Spam klasöründe bir maili sildiğinde: plugin bunu yanlış pozitif olarak işaretlemez, sadece siler
- Mail direkt Spam klasörüne geldiğinde (harici filtre tarafından): herhangi bir eğitim tetiklenmez
Bu mekanizma sayesinde kullanıcılar Thunderbird, Outlook veya Webmail üzerinden sadece sürükle-bırak yaparak spam filtresini eğitebilir hale gelir.
Gereksinimler ve Ön Hazırlık
Kuruluma geçmeden önce sistemde şunların hazır olduğundan emin olun:
- Dovecot 2.x (2.2 veya üzeri önerilir)
- SpamAssassin veya sieve tabanlı bir spam filtresi
dovecot-antispampaketi veya kaynak koddan derleme imkanı
Debian/Ubuntu sistemlerde antispam plugin genellikle ayrı bir paket olarak gelir:
apt-get update
apt-get install dovecot-antispam
# Paketin kurulup kurulmadığını ve plugin dosyasının yerini kontrol et
find /usr/lib/dovecot -name "*antispam*"
ls -la /usr/lib/dovecot/modules/lib90_antispam_plugin.so
CentOS/RHEL sistemlerde durum biraz farklıdır, genellikle kaynak koddan derlemeniz gerekebilir:
# Gerekli bağımlılıkları kur
yum install dovecot-devel gcc make
# Kaynak kodu indir
cd /usr/local/src
git clone https://github.com/a-schild/dovecot-antispam-plugin.git
cd dovecot-antispam-plugin
# Dovecot sürümünüze göre yapılandır
./configure --with-dovecot=/usr/lib/dovecot
make
make install
Kurulum sonrası plugin dosyasının doğru konumda olup olmadığını teyit edin:
# Plugin listesini kontrol et
doveadm plugin list 2>/dev/null | grep antispam
# Alternatif olarak modül dizinine bak
ls /usr/lib/dovecot/modules/ | grep antispam
Temel Yapılandırma
Dovecot’ta plugin yapılandırması /etc/dovecot/conf.d/ dizini altındaki dosyalarda yapılır. Antispam için yeni bir yapılandırma dosyası oluşturalım:
# Yapılandırma dosyasını oluştur
cat > /etc/dovecot/conf.d/90-antispam.conf << 'EOF'
plugin {
# Antispam plugin'i IMAP protokolü için aktif et
antispam_backend = pipe
# Spam klasörünün adı - kullanıcı mailbox yapınıza göre ayarlayın
antispam_spam = Junk;Spam;SPAM;Junk Mail
# Trash klasörü - buraya taşıma eğitimi tetiklemez
antispam_trash = Trash;Deleted Items;Deleted Messages
# Spam olarak eğitmek için kullanılacak script
antispam_pipe_program = /usr/local/bin/dovecot-antispam-pipe.sh
# Ham (normal mail) olarak eğitmek için argümanlar
antispam_pipe_program_args = --pipe
# Spam eğitimi için argümanlar
antispam_pipe_program_spam_arg = --spam
# Ham eğitimi için argümanlar
antispam_pipe_program_notspam_arg = --ham
}
protocol imap {
mail_plugins = $mail_plugins antispam
}
EOF
Şimdi bu yapılandırmayı ana Dovecot yapılandırmasına dahil etmemiz gerekiyor:
# dovecot.conf dosyasında include satırı var mı kontrol et
grep "conf.d" /etc/dovecot/dovecot.conf
# Yoksa ekle
echo '!include conf.d/*.conf' >> /etc/dovecot/dovecot.conf
Pipe Backend ile SpamAssassin Entegrasyonu
Pipe backend, en esnek ve yaygın kullanılan yöntemdir. Bir wrapper script aracılığıyla herhangi bir spam filtresini kullanabilirsiniz. SpamAssassin için bir wrapper yazalım:
cat > /usr/local/bin/dovecot-antispam-pipe.sh << 'SCRIPT'
#!/bin/bash
# Dovecot Antispam Pipe Wrapper
# Bu script Dovecot'tan STDIN üzerinden mail alır ve sa-learn'e iletir
SALEARN="/usr/bin/sa-learn"
LOGFILE="/var/log/dovecot-antispam.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# Kullanıcı bilgisini al (Dovecot USER environment variable'ı set eder)
USER_EMAIL="${USER:-unknown}"
# Argümanları işle
LEARN_TYPE=""
while [[ $# -gt 0 ]]; do
case $1 in
--spam)
LEARN_TYPE="spam"
shift
;;
--ham)
LEARN_TYPE="ham"
shift
;;
--pipe)
# Pipe modunu belirtir, geç
shift
;;
*)
shift
;;
esac
done
if [ -z "$LEARN_TYPE" ]; then
echo "[$TIMESTAMP] HATA: Öğrenme tipi belirtilmedi. Kullanıcı: $USER_EMAIL" >> "$LOGFILE"
exit 1
fi
# SpamAssassin ile eğitimi gerçekleştir
# --username ile kullanıcıya özel bayesian database kullan
if $SALEARN --${LEARN_TYPE} --username="$USER_EMAIL" - 2>&1; then
echo "[$TIMESTAMP] BAŞARILI: $USER_EMAIL için $LEARN_TYPE eğitimi tamamlandı" >> "$LOGFILE"
exit 0
else
echo "[$TIMESTAMP] HATA: $USER_EMAIL için $LEARN_TYPE eğitimi başarısız" >> "$LOGFILE"
exit 1
fi
SCRIPT
chmod +x /usr/local/bin/dovecot-antispam-pipe.sh
Bu script birkaç önemli şeyi yapıyor: Dovecot’un set ettiği $USER environment variable’ını kullanarak kimin hangi maili spam olarak işaretlediğini takip ediyor ve SpamAssassin’e kullanıcı bazlı eğitim yapmasını söylüyor.
SpamAssassin Kullanıcı Bazlı Bayesian Veritabanı Yapılandırması
Antispam plugin’in kullanıcı bazlı eğitimden gerçek fayda sağlaması için SpamAssassin’i doğru yapılandırmak gerekiyor:
# Kullanıcı bazlı SpamAssassin yapılandırması
cat >> /etc/spamassassin/local.cf << 'EOF'
# Bayesian veritabanını kullanıcı home dizininde sakla
bayes_path /var/vmail/%u/.spamassassin/bayes
# SQL tabanlı Bayesian tercih ederseniz
# bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
# Otomatik eğitimi aktif et
bayes_auto_learn 1
bayes_auto_learn_threshold_nonspam 0.1
bayes_auto_learn_threshold_spam 12.0
# Minimum token sayısı (çok az örnekle hatalı eğitim engellensin)
bayes_min_ham_num 200
bayes_min_spam_num 200
EOF
Virtual mailbox kullanıyorsanız (Postfix + Dovecot kombinasyonu gibi), sa-learn‘in doğru kullanıcı olarak çalışması için sudo yapılandırması gerekebilir:
# vmail kullanıcısının sa-learn'i çalıştırabilmesi için sudoers ayarı
cat >> /etc/sudoers.d/dovecot-antispam << 'EOF'
# Dovecot antispam wrapper için
Defaults:dovecot !requiretty
dovecot ALL=(vmail) NOPASSWD: /usr/bin/sa-learn
EOF
chmod 440 /etc/sudoers.d/dovecot-antispam
Sieve Backend Alternatifi
Eğer ManageSieve kullanıyorsanız, pipe yerine sieve backend’ini tercih edebilirsiniz. Bu yöntem özellikle Dovecot Pigeonhole kurulu sistemlerde daha temiz çalışır:
# Sieve backend yapılandırması
cat > /etc/dovecot/conf.d/90-antispam-sieve.conf << 'EOF'
plugin {
antispam_backend = sieve
# Spam klasörü tanımları
antispam_spam = Junk;Spam
# Sieve script dizini
antispam_sieve_spam = /var/vmail/antispam/learn-spam.sieve
antispam_sieve_notspam = /var/vmail/antispam/learn-ham.sieve
# Sieve binary için
antispam_sieve_compile_spam = /var/vmail/antispam/learn-spam.svbin
antispam_sieve_compile_notspam = /var/vmail/antispam/learn-ham.svbin
}
EOF
Sieve scriptlerini oluşturalım:
mkdir -p /var/vmail/antispam
# Spam öğrenme scripti
cat > /var/vmail/antispam/learn-spam.sieve << 'EOF'
require ["vnd.dovecot.execute", "environment", "variables"];
if environment :matches "user" "*" {
set "user" "${1}";
}
execute :input "pipe" :output "output" "sa-learn" ["--spam", "--username=${user}", "-"];
EOF
# Ham öğrenme scripti
cat > /var/vmail/antispam/learn-ham.sieve << 'EOF'
require ["vnd.dovecot.execute", "environment", "variables"];
if environment :matches "user" "*" {
set "user" "${1}";
}
execute :input "pipe" :output "output" "sa-learn" ["--ham", "--username=${user}", "-"];
EOF
# Sieve scriptlerini derle
sievec /var/vmail/antispam/learn-spam.sieve
sievec /var/vmail/antispam/learn-ham.sieve
# Sahiplik ve izinleri ayarla
chown -R vmail:vmail /var/vmail/antispam
chmod 750 /var/vmail/antispam
Debug ve Sorun Giderme
Yapılandırmayı tamamladıktan sonra her şeyin doğru çalıştığını test etmek kritik önem taşıyor. İlk olarak Dovecot yapılandırmasını doğrulayalım:
# Yapılandırma sözdizimini kontrol et
doveconf -n | grep -A 20 "plugin {"
# Dovecot'u yeniden başlat ve logları izle
systemctl restart dovecot
# Antispam ile ilgili logları filtrele
tail -f /var/log/mail.log | grep -i "antispam|sa-learn|spam"
# Daha detaylı debug için Dovecot log seviyesini artır
doveadm log find
# Test kullanıcısı için plugin'in aktif olup olmadığını kontrol et
doveadm -D imap login -u [email protected]
Gerçek bir senaryo üzerinde test yapalım. Bir test maili oluşturup Spam klasörüne taşıyalım ve eğitimin tetiklenip tetiklenmediğini izleyelim:
# Test için bir mail oluştur ve antispam script'ini manuel test et
echo "From: [email protected]
To: [email protected]
Subject: Test Spam Mail
Date: $(date -R)
Bu bir test mailidir." | /usr/local/bin/dovecot-antispam-pipe.sh --pipe --spam
# Log dosyasını kontrol et
cat /var/log/dovecot-antispam.log
# SpamAssassin Bayesian veritabanını kontrol et
su -s /bin/bash vmail -c "sa-learn --dump magic"
Plugin’in doğru çalışıp çalışmadığını anlamak için Dovecot debug loglarına bakmak gerekebilir:
# Dovecot debug modunu geçici olarak aktif et
cat >> /etc/dovecot/conf.d/10-logging.conf << 'EOF'
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log
mail_debug = yes
auth_debug = yes
EOF
systemctl reload dovecot
# Debug loglarını izle
tail -f /var/log/dovecot-debug.log | grep -i "antispam"
# Test sonrası debug'ı kapat
sed -i '/mail_debug|auth_debug/d' /etc/dovecot/conf.d/10-logging.conf
systemctl reload dovecot
Performans ve Güvenlik Optimizasyonu
Yoğun bir mail sunucusunda her spam işaretlemesinin sa-learn çalıştırması performans sorunlarına yol açabilir. Bunu çözmek için kuyruk tabanlı bir yaklaşım kullanabilirsiniz:
# Asenkron eğitim için gelişmiş wrapper script
cat > /usr/local/bin/dovecot-antispam-async.sh << 'SCRIPT'
#!/bin/bash
# Asenkron spam öğrenme - mail içeriğini geçici dosyaya yazar ve kuyruğa ekler
QUEUE_DIR="/var/spool/antispam-queue"
LOGFILE="/var/log/dovecot-antispam.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
USER_EMAIL="${USER:-unknown}"
mkdir -p "$QUEUE_DIR"
LEARN_TYPE=""
while [[ $# -gt 0 ]]; do
case $1 in
--spam) LEARN_TYPE="spam"; shift ;;
--ham) LEARN_TYPE="ham"; shift ;;
--pipe) shift ;;
*) shift ;;
esac
done
if [ -z "$LEARN_TYPE" ]; then
exit 1
fi
# Mail içeriğini unique bir dosyaya kaydet
QUEUE_FILE="$QUEUE_DIR/${LEARN_TYPE}_${USER_EMAIL}_$(date +%s%N)"
cat > "$QUEUE_FILE"
# Kuyruğu işle (arka planda, non-blocking)
echo "[$TIMESTAMP] KUYRUK: $USER_EMAIL -> $LEARN_TYPE -> $QUEUE_FILE" >> "$LOGFILE"
exit 0
SCRIPT
chmod +x /usr/local/bin/dovecot-antispam-async.sh
# Kuyruk işleyici cron job
cat > /etc/cron.d/antispam-queue << 'EOF'
*/5 * * * * root /usr/local/bin/process-antispam-queue.sh
EOF
Güvenlik tarafında, script’in sadece izin verilen kullanıcılar tarafından çalıştırılabilir olduğundan emin olun:
# Script güvenlik ayarları
chmod 750 /usr/local/bin/dovecot-antispam-pipe.sh
chown root:dovecot /usr/local/bin/dovecot-antispam-pipe.sh
# Log dosyası izinleri
touch /var/log/dovecot-antispam.log
chown dovecot:dovecot /var/log/dovecot-antispam.log
chmod 640 /var/log/dovecot-antispam.log
# AppArmor profili varsa kontrol et
aa-status | grep dovecot
Çoklu Domain Ortamında Yapılandırma
Birden fazla domain barındıran bir mail sunucusunda kullanıcı bazlı Bayesian veritabanlarını domain’e göre organize etmek mantıklıdır:
# Domain bazlı SpamAssassin wrapper
cat > /usr/local/bin/dovecot-antispam-multidomain.sh << 'SCRIPT'
#!/bin/bash
SALEARN="/usr/bin/sa-learn"
LOGFILE="/var/log/dovecot-antispam.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
FULL_USER="${USER:-unknown}"
# Domain ve kullanıcı adını ayır
if [[ "$FULL_USER" == *"@"* ]]; then
LOCAL_PART="${FULL_USER%@*}"
DOMAIN="${FULL_USER#*@}"
else
LOCAL_PART="$FULL_USER"
DOMAIN="default"
fi
# Domain bazlı Bayes veritabanı yolu
BAYES_PATH="/var/vmail/${DOMAIN}/${LOCAL_PART}/.spamassassin/bayes"
mkdir -p "$(dirname $BAYES_PATH)"
chown vmail:vmail "$(dirname $BAYES_PATH)"
LEARN_TYPE=""
while [[ $# -gt 0 ]]; do
case $1 in
--spam) LEARN_TYPE="spam"; shift ;;
--ham) LEARN_TYPE="ham"; shift ;;
--pipe) shift ;;
*) shift ;;
esac
done
if [ -z "$LEARN_TYPE" ]; then
echo "[$TIMESTAMP] HATA: Tip belirtilmedi. Kullanıcı: $FULL_USER" >> "$LOGFILE"
exit 1
fi
# Kullanıcıya özel Bayes DB ile eğit
$SALEARN --${LEARN_TYPE} --dbpath="$BAYES_PATH" - 2>> "$LOGFILE"
if [ $? -eq 0 ]; then
echo "[$TIMESTAMP] OK: ${FULL_USER} -> ${LEARN_TYPE}" >> "$LOGFILE"
exit 0
else
echo "[$TIMESTAMP] FAIL: ${FULL_USER} -> ${LEARN_TYPE}" >> "$LOGFILE"
exit 1
fi
SCRIPT
chmod +x /usr/local/bin/dovecot-antispam-multidomain.sh
Logrotate ve Monitoring
Antispam loglarının sürekli büyümemesi için logrotate yapılandırması ekleyin:
cat > /etc/logrotate.d/dovecot-antispam << 'EOF'
/var/log/dovecot-antispam.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 dovecot dovecot
sharedscripts
postrotate
systemctl reload dovecot > /dev/null 2>&1 || true
endscript
}
EOF
Eğitim istatistiklerini izlemek için basit bir monitoring scripti:
cat > /usr/local/bin/antispam-stats.sh << 'SCRIPT'
#!/bin/bash
# Antispam eğitim istatistikleri
LOGFILE="/var/log/dovecot-antispam.log"
TODAY=$(date '+%Y-%m-%d')
echo "=== Antispam Eğitim İstatistikleri ($TODAY) ==="
echo ""
echo "Spam olarak işaretlenen:"
grep "$TODAY" "$LOGFILE" | grep "spam" | grep "BAŞARILI|OK" | wc -l
echo "Ham (normal) olarak işaretlenen:"
grep "$TODAY" "$LOGFILE" | grep "ham" | grep "BAŞARILI|OK" | wc -l
echo "Hatalar:"
grep "$TODAY" "$LOGFILE" | grep "HATA|FAIL" | wc -l
echo ""
echo "En aktif kullanıcılar:"
grep "$TODAY" "$LOGFILE" | grep -oP '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}' | sort | uniq -c | sort -rn | head -10
SCRIPT
chmod +x /usr/local/bin/antispam-stats.sh
# Günlük istatistik raporu için cron
echo "0 8 * * * root /usr/local/bin/antispam-stats.sh | mail -s 'Antispam Günlük Rapor' [email protected]" > /etc/cron.d/antispam-stats
Yaygın Sorunlar ve Çözümleri
Uygulamada karşılaşılan en sık sorunlar şunlardır:
- Plugin yüklenmedi hatası:
mail_plugins = $mail_plugins antispamsatırında$mail_plugins‘in expand edildiğinden emin olun. Sadecemail_plugins = antispamyazarsanız diğer tüm plugin’leri devre dışı bırakırsınız.
- Permission denied hatası: Dovecot’un
sa-learnscript’ini çalıştırabilmesi için doğru sahiplik ve izinler kritiktir.vmailveyadovecotkullanıcısının script’i okuyup çalıştırabildiğinisudo -u dovecot /usr/local/bin/dovecot-antispam-pipe.shkomutuyla test edin.
- Spam klasörü tanınmıyor:
antispam_spamparametresinde noktalı virgülle ayırarak birden fazla isim tanımlayabilirsiniz. Kullanıcıların farklı IMAP istemcilerinde farklı klasör isimleri oluşturabileceğini unutmayın.
- sa-learn çok yavaş: Büyük Bayesian veritabanlarında
sa-learnoldukça yavaş çalışabilir. Bu durumda asenkron kuyruk yaklaşımı veya Redis tabanlı Bayesian backend’i değerlendirin.
- Eğitim hiç tetiklenmiyor: IMAP protokolü için plugin’in aktif olduğunu
doveconf -n | grep mail_pluginsile kontrol edin. Plugin sadece IMAP üzerinden çalışır, POP3 için antispam eğitimi yapılamaz.
Sonuç
Dovecot Antispam plugin’i, kullanıcı deneyimini bozmadan otomatik spam eğitimi sağlamanın en temiz yollarından biri. Kurulum ilk bakışta karmaşık görünse de temel yapılandırma birkaç saatlik bir iştir ve uzun vadede hem yönetimsel yükü azaltır hem de spam filtrenizin isabetini ciddi ölçüde artırır.
Burada anlattığım pipe backend yaklaşımı çoğu kurulum için yeterlidir. Ancak binlerce kullanıcılı büyük ölçekli sistemlerde asenkron kuyruk yapısını ve muhtemelen merkezi bir Bayesian veritabanını (MySQL veya Redis tabanlı) değerlendirmenizi öneririm. Küçük ve orta ölçekli sistemlerde ise temel yapılandırma günlerce sorunsuz çalışacaktır. Önemli olan logları düzenli kontrol etmek ve istatistikleri takip ederek filtrenin gerçekten öğrenip öğrenmediğini doğrulamaktır.