Dovecot ile Sieve Mail Filtreleme: Kapsamlı Kurulum ve Yapılandırma Rehberi

Mail sunucunuza gelen yüzlerce e-postayı manuel olarak klasörlere taşımaktan, spam’leri silmekten ya da belirli göndericilerden gelen mailleri otomatik yönlendirmekten yoruldunuz mu? İşte tam bu noktada Sieve devreye giriyor. Dovecot’un Sieve entegrasyonu, sunucu taraflı mail filtreleme için son derece güçlü ve esnek bir çözüm sunuyor. Bu yazıda Dovecot üzerinde Sieve kurulumunu, yapılandırmasını ve gerçek dünya senaryolarında nasıl kullanacağınızı adım adım ele alacağız.

Sieve Nedir ve Neden Kullanmalısınız?

Sieve, RFC 5228 ile tanımlanmış bir mail filtreleme dilidir. İstemci taraflı filtreleme (Outlook kuralları gibi) yerine sunucu tarafında çalışır, yani kullanıcının mail istemcisi açık olmasa bile kurallar işlenir. Bu fark kritiktir; çünkü sunucu taraflı filtreleme şu avantajları sağlar:

  • Platformdan bağımsızlık: Telefon, tablet veya bilgisayar fark etmez, kurallar her zaman çalışır.
  • Bant genişliği tasarrufu: İstenmeyen mailler istemciye hiç indirilmez.
  • Merkezi yönetim: Sistem yöneticisi tüm kullanıcılar için genel kurallar tanımlayabilir.
  • ManageSieve protokolü: Kullanıcılar web arayüzü veya istemci üzerinden kendi kurallarını yönetebilir.

Dovecot, Sieve’i dovecot-pigeonhole paketi aracılığıyla destekler. Pigeonhole projesi, Dovecot için Sieve implementasyonunu sağlayan resmi eklentidir.

Kurulum

Debian/Ubuntu Sistemlerde Kurulum

apt update
apt install dovecot-sieve dovecot-managesieved

Kurulum sonrası servis durumunu kontrol edin:

systemctl status dovecot
dovecot --version
# Sieve desteğini doğrulamak için
dovecot --build-options | grep sieve

RHEL/CentOS/AlmaLinux Sistemlerde Kurulum

dnf install dovecot-pigeonhole
systemctl restart dovecot

Paket kurulduktan sonra /usr/lib/dovecot/modules/ dizininde lib10_sieve_plugin.so dosyasının mevcut olduğunu doğrulayın:

ls /usr/lib/dovecot/modules/ | grep sieve

Dovecot Yapılandırması

Temel Sieve Eklenti Yapılandırması

Sieve’i etkinleştirmek için önce dovecot.conf veya ilgili konfigürasyon dosyasına eklenti eklemeliyiz. Genellikle /etc/dovecot/conf.d/90-sieve.conf dosyası bu amaçla kullanılır.

LDA (Local Delivery Agent) veya LMTP üzerinde Sieve’i etkinleştirmek için:

# /etc/dovecot/conf.d/15-lda.conf
protocol lda {
  mail_plugins = $mail_plugins sieve
  postmaster_address = [email protected]
  hostname = mail.yourdomain.com
}

Eğer LMTP kullanıyorsanız (ki Postfix entegrasyonlarında yaygındır):

# /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = [email protected]
}

Sieve Eklenti Parametreleri

/etc/dovecot/conf.d/90-sieve.conf dosyasını düzenleyin:

plugin {
  # Kullanıcının aktif Sieve scripti
  sieve = file:~/sieve;active=~/.dovecot.sieve

  # Sieve scriptlerinin saklanacağı dizin
  sieve_dir = ~/sieve

  # Global Sieve scriptleri (admin tarafından yönetilir)
  sieve_global = /etc/dovecot/sieve/global/

  # Script öncesi çalışacak admin kuralları
  sieve_before = /etc/dovecot/sieve/before.d/

  # Script sonrası çalışacak admin kuralları
  sieve_after = /etc/dovecot/sieve/after.d/

  # Maksimum script boyutu (64KB)
  sieve_max_script_size = 64k

  # Bir scriptte maksimum aksiyon sayısı
  sieve_max_actions = 32

  # Maksimum yönlendirme sayısı (spam önlemi)
  sieve_max_redirects = 4

  # Quota plugin ile entegrasyon
  sieve_quota_max_scripts = 20
  sieve_quota_max_storage = 5M
}

Önemli parametreleri açıklayalım:

  • sieve: Aktif scriptin yolu ve formatı. file: prefix’i dosya tabanlı depolamayı belirtir.
  • sieve_before: Kullanıcı kurallarından önce işlenen admin kuralları. Spam filtreleme için idealdir.
  • sieve_after: Kullanıcı kurallarından sonra işlenen admin kuralları.
  • sieve_max_redirects: Bir mail döngü oluşturmasını engellemek için yönlendirme limitini kısıtlar.

ManageSieve Yapılandırması

ManageSieve, kullanıcıların kendi Sieve scriptlerini yönetmesine olanak tanıyan bir protokoldür. Port 4190 üzerinde çalışır:

# /etc/dovecot/conf.d/20-managesieve.conf
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
  service_count = 1
  process_min_avail = 0
}

service managesieve {
  process_limit = 1024
}

protocol sieve {
  managesieve_max_line_length = 65536
  managesieve_logout_format = bytes=%i/%o
  # Giriş için izin verilen mekanizmalar
  auth_mechanisms = plain login
}

Güvenlik duvarı ayarlarını yapmayı unutmayın:

# UFW kullanıyorsanız
ufw allow 4190/tcp

# firewalld kullanıyorsanız
firewall-cmd --permanent --add-port=4190/tcp
firewall-cmd --reload

Sieve Script Yazımı

Sieve’in sözdizimi oldukça okunabilir ve mantığı nettir. Her script require bildirimleriyle başlar, ardından kurallar sırayla işlenir.

Temel Script Yapısı

require ["fileinto", "reject", "vacation", "imap4flags"];

# Spam klasörüne taşı
if header :contains "X-Spam-Flag" "YES" {
    fileinto "Junk";
    stop;
}

# Belirli göndericiden gelen mailleri klasöre taşı
if address :is "from" "[email protected]" {
    fileinto "INBOX.Newsletters";
    stop;
}

# Varsayılan: INBOX'a teslim et
keep;

Gerçek Dünya Senaryosu 1: Kurumsal Spam Filtreleme

SpamAssassin veya Rspamd ile entegre çalışan bir spam filtreleme scripti:

require ["fileinto", "imap4flags", "mailbox"];

# Yüksek spam skoru - direkt sil
if header :contains "X-Spam-Level" "**********" {
    discard;
    stop;
}

# Orta spam skoru - Junk klasörüne taşı
if anyof (
    header :contains "X-Spam-Flag" "YES",
    header :contains "X-Rspamd-Action" "add header",
    header :contains "X-Rspamd-Action" "rewrite subject"
) {
    fileinto :create "INBOX.Junk";
    setflag "\Seen";
    stop;
}

# Kimlik doğrulama başarısız mailler
if header :contains "Authentication-Results" "dkim=fail" {
    fileinto :create "INBOX.Suspicious";
    stop;
}

Bu scripti /etc/dovecot/sieve/before.d/10-spam-filter.sieve olarak kaydedin. before.d dizinindeki scriptler kullanıcı scriptlerinden önce çalışacağından tüm kullanıcılara uygulanır.

Script Derleme

.sieve uzantılı scriptleri Dovecot’un çalıştırabilmesi için derlemek gerekmez, ancak derleme hataları için sievec aracını kullanabilirsiniz:

# Script sözdizimini kontrol et
sievec /etc/dovecot/sieve/before.d/10-spam-filter.sieve

# Kullanıcı scriptini kontrol et
sievec /home/user/sieve/myscript.sieve

Hata yoksa komut çıktısız tamamlanır. Hata varsa satır numarası ve açıklama ile bildirir.

Gerçek Dünya Senaryosu 2: Departman Bazlı Mail Yönlendirme

Bir şirkette farklı departmanlara gelen mailleri otomatik yönlendirme örneği. Bu scripti /etc/dovecot/sieve/global/company-rules.sieve olarak saklayabilirsiniz:

require ["fileinto", "envelope", "subaddress", "mailbox"];

# Fatura mailleri - muhasebe klasörü
if anyof (
    header :contains "subject" "invoice",
    header :contains "subject" "fatura",
    header :contains "subject" "payment"
) {
    fileinto :create "INBOX.Finance";
    stop;
}

# Destek talepleri - ticket sistemi taşıması
if anyof (
    address :is "to" "[email protected]",
    address :is "to" "[email protected]",
    header :contains "subject" "[Ticket]"
) {
    fileinto :create "INBOX.Support";
    stop;
}

# GitHub/GitLab bildirimleri
if anyof (
    address :domain "from" "github.com",
    address :domain "from" "gitlab.com",
    header :contains "X-GitHub-Reason" ""
) {
    fileinto :create "INBOX.DevOps.GitHub";
    stop;
}

Gerçek Dünya Senaryosu 3: Otomatik Tatil Yanıtı

Kullanıcıların tatil mesajı ayarlayabilmesi için Vacation eklentisi kullanılır:

require ["vacation", "envelope"];

# Sadece dışarıdan gelen maillere yanıt ver
if not address :domain "from" "company.com" {
    vacation
        :days 1
        :subject "Ofis Dışındayım / Out of Office"
        :addresses ["[email protected]", "[email protected]"]
        "Merhaba,

        15-22 Ocak tarihleri arasında ofis dışındayım.
        Acil durumlar için: [email protected]

        ---
        Hello,

        I am out of office between January 15-22.
        For urgent matters: [email protected]

        Regards,
        Ali Yilmaz";
}

Dikkat: :days 1 parametresi aynı göndericiye kaç günde bir yanıt gönderileceğini belirtir. Bunu çok düşük tutmak döngülere yol açabilir.

ManageSieve ile Kullanıcı Yönetimi

Komut Satırından Sieve Yönetimi

sieve-test aracı, scripti gerçekten uygulamadan önce test etmenizi sağlar:

# Test maili oluştur ve scripti simüle et
cat > /tmp/test-mail.eml << 'EOF'
From: [email protected]
To: [email protected]
Subject: Test fatura
X-Spam-Flag: NO

Bu bir test mailidir.
EOF

# Scripti test et
sieve-test /home/user/.dovecot.sieve /tmp/test-mail.eml

Aktif Sieve scriptlerini listelemek ve yönetmek için doveadm aracını kullanın:

# Belirli kullanıcının aktif scriptini görüntüle
doveadm sieve get -u [email protected] active

# Tüm kullanıcının sieve scriptlerini listele
doveadm sieve list -u [email protected]

# Script yükle
doveadm sieve put -u [email protected] scriptname < /tmp/my-script.sieve

# Scripti aktifleştir
doveadm sieve activate -u [email protected] scriptname

# Script sil
doveadm sieve delete -u [email protected] scriptname

Roundcube ile ManageSieve Entegrasyonu

Roundcube webmail kullanıyorsanız managesieve eklentisini etkinleştirerek kullanıcıların tarayıcı üzerinden kural yönetmesini sağlayabilirsiniz. /etc/roundcube/config.inc.php dosyasına ekleyin:

$config['plugins'] = array('managesieve', 'archive', 'zipdownload');
$config['managesieve_port'] = 4190;
$config['managesieve_host'] = 'tls://localhost';
$config['managesieve_usetls'] = true;

Gelişmiş Sieve Eklentileri

Notify Eklentisi ile Anlık Bildirimler

Kritik maillerde anlık bildirim göndermek için:

require ["enotify", "variables"];

# "URGENT" veya "ACİL" içeren konu satırlı mailler için bildirim
if header :contains "subject" ["URGENT", "ACİL", "CRITICAL"] {
    notify :importance "1"
           :message "Kritik mail alındı!"
           "mailto:[email protected]?subject=Kritik+Mail+Bildirimi";
    fileinto "INBOX.Critical";
    stop;
}

Variables Eklentisi ile Dinamik Filtreleme

require ["fileinto", "variables", "envelope", "subaddress", "mailbox"];

# Gönderen domain'ini yakala ve klasörlendir
if envelope :matches "from" "*@*" {
    set "sender_domain" "${2}";

    if string :is "${sender_domain}" ["github.com", "gitlab.com", "bitbucket.org"] {
        fileinto :create "INBOX.Code-Reviews";
        stop;
    }

    if string :is "${sender_domain}" ["jira.atlassian.net", "trello.com"] {
    fileinto :create "INBOX.Project-Management";
        stop;
    }
}

Body Eklentisi ile İçerik Filtreleme

RFC 5173 ile gelen body eklentisi mail içeriğinde arama yapmanızı sağlar:

require ["body", "fileinto", "mailbox"];

# Mail gövdesinde belirli anahtar kelimeler varsa
if body :contains ["şifre sıfırlama", "password reset", "hesabınız askıya"] {
    fileinto :create "INBOX.Security-Alerts";
    stop;
}

Uyarı: Body filtreleme işlemci yoğun bir işlemdir. Yüksek trafikli sunucularda dikkatli kullanın.

Log Takibi ve Sorun Giderme

Sieve aktivitelerini takip etmek için Dovecot loglarını izleyin:

# Gerçek zamanlı Sieve loglarını izle
tail -f /var/log/mail.log | grep sieve

# Son Sieve hatalarını filtrele
grep -i "sieve" /var/log/mail.log | grep -i "error|warn" | tail -50

# Belirli kullanıcının Sieve aktivitesini izle
grep "sieve.*[email protected]" /var/log/mail.log | tail -20

Daha ayrıntılı loglama için debug modunu etkinleştirin:

# /etc/dovecot/conf.d/90-sieve.conf
plugin {
  sieve_trace_dir = /tmp/sieve-trace
  sieve_trace_level = matching
  sieve_trace_debug = yes
}

Bu ayarları yalnızca sorun giderme sırasında aktif tutun, çünkü disk kullanımını ciddi ölçüde artırır.

Yaygın hataları ve çözümlerini inceleyelim:

  • “Script compile error”: sievec ile sözdizimini kontrol edin, genellikle eksik require bildirimi veya yanlış tırnak işareti sorunudur.
  • “Mailbox does not exist”: fileinto :create eklentisini require edin ya da klasörü önceden oluşturun.
  • “Sieve script not executing”: LDA/LMTP yapılandırmasında mail_plugins satırına sieve eklendiğinden emin olun.
  • “Permission denied”: Sieve dizin izinlerini kontrol edin, genellikle vmail:vmail 700 olmalıdır.

Dizin izinlerini toplu düzeltmek için:

# Tüm kullanıcıların sieve dizin izinlerini düzelt
find /home -name "sieve" -type d -exec chown -R vmail:vmail {} ;
find /home -name ".dovecot.sieve" -exec chown vmail:vmail {} ;

Güvenlik Önerileri

Sieve yapılandırmasında güvenliği ön planda tutmak gerekir:

  • Redirect sınırı: sieve_max_redirects = 4 ile mail döngülerini önleyin. Bir kullanıcı tüm maillerini başka birine yönlendirirse ve o kişi de geri yönlendirirse sonsuz döngü oluşur.
  • Script boyutu: sieve_max_script_size ile çok büyük scriptleri engelleyin. Aşırı büyük scriptler parse süresini uzatır.
  • External domain redirect: Kurumsal ortamlarda external adrese redirect’i tamamen kısıtlamak isteyebilirsiniz. Bunu sieve_before ile global bir kural olarak uygulayabilirsiniz.
  • ManageSieve TLS: ManageSieve bağlantılarında mutlaka TLS kullanın, kimlik bilgileri düz metin olarak geçebilir.

TLS zorunluluğu için:

# /etc/dovecot/conf.d/20-managesieve.conf
protocol sieve {
  # TLS olmadan bağlantıya izin verme
  ssl = required
}

Sonuç

Dovecot ile Sieve entegrasyonu, mail yönetimini hem sistem yöneticisi hem de kullanıcı perspektifinden çok daha güçlü hale getirir. Sunucu taraflı filtreleme sayesinde spam yönetimi, departman bazlı yönlendirme ve tatil mesajları gibi onlarca senaryo artık istemciden bağımsız çalışır. sieve_before ve sieve_after mekanizmaları yöneticilere global kural tanımlama esnekliği sunarken, ManageSieve protokolü kullanıcılara kendi kurallarını yönetme özgürlüğü verir.

Kurulumu tamamladıktan sonra yapmanız gereken ilk adımlar şunlar olmalıdır: sievec ile scriptlerinizi doğrulayın, sieve-test ile gerçek mail örnekleri üzerinde test edin ve log takibini alışkanlık haline getirin. Sieve’in gücü basit sözdiziminin arkasında yatan esnekliktir; ihtiyacınız büyüdükçe eklenti ekleyerek sistemi kolayca genişletebilirsiniz.

Yorum yapın