Postfix ile Virüs Tarama: ClamAV Entegrasyonu

Mail sunucunuza gelen her e-postanın güvenli olduğunu varsaymak, günümüz tehdit ortamında ciddi bir risk. Özellikle kurumsal ortamlarda kullanıcılar her gün onlarca, belki yüzlerce e-posta alıyor ve bunların içinde zararlı eklentiler barındıranlar her zaman mevcut. Postfix ile ClamAV entegrasyonu, bu tehditleri mail sunucusu seviyesinde durdurmanın en yaygın ve güvenilir yollarından biri. Bu yazıda sıfırdan kurulumdan production ortamında ince ayara kadar her şeyi ele alacağız.

ClamAV ve Amavisd-new Nedir?

ClamAV, açık kaynaklı bir antivirüs motorudur. Mail tarama senaryolarında genellikle tek başına kullanılmaz, bir “ara katman” yazılıma ihtiyaç duyar. İşte bu noktada Amavisd-new devreye giriyor. Amavisd-new, Postfix ile ClamAV (ve isteğe bağlı olarak SpamAssassin) arasında köprü görevi görür. Mail akışı şu şekilde işler:

  • Postfix gelen maili alır
  • Amavisd-new’e SMTP üzerinden iletir (port 10024)
  • Amavisd-new maili ClamAV’a taratır
  • Temiz maillar Postfix’e geri döner (port 10025)
  • Zararlı maillar karantinaya alınır veya reddedilir

Bu mimariyi anlamak, sorun giderme sürecinde hayat kurtarır.

Sistem Gereksinimleri

Kuruluma geçmeden önce ortamımızı netleştirelim. Bu yazıdaki örnekler Ubuntu 22.04 LTS üzerinde test edildi, ancak RHEL/CentOS için gereken farkları da belirteceğim.

Minimum donanım gereksinimleri:

  • RAM: 2 GB (ClamAV imza veritabanı belleğe yüklendiğinden 4 GB önerilir)
  • Disk: İmza veritabanı için minimum 1 GB boş alan
  • CPU: Yoğun mail trafiği için çok çekirdekli işlemci avantaj sağlar

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

Kurulum

ClamAV ve Amavisd-new Kurulumu

sudo apt update
sudo apt install -y clamav clamav-daemon amavisd-new
sudo apt install -y libnet-dns-perl libmail-spf-perl
sudo apt install -y pyzor razor arj cabextract lhasa nomarch p7zip-full tnef unrar-free zoo

Arşiv araçları (arj, cabextract vb.) önemli, çünkü ClamAV sıkıştırılmış dosyaların içini tarayabilmek için bunlara ihtiyaç duyuyor. Paket listesini atlamayın.

RHEL/CentOS için:

sudo dnf install -y epel-release
sudo dnf install -y clamav clamav-update clamd amavisd-new
sudo dnf install -y perl-Net-DNS perl-Mail-SPF

İmza Veritabanını Güncelleme

ClamAV’ın çalışabilmesi için önce imza veritabanını indirmesi gerekiyor. Servis ilk kurulumda otomatik başlamayabilir.

# freshclam servisini durdur
sudo systemctl stop clamav-freshclam

# Manuel güncelleme yap
sudo freshclam

# Servisi tekrar başlat
sudo systemctl start clamav-freshclam
sudo systemctl enable clamav-freshclam

Bu işlem internet bağlantı hızına göre birkaç dakika sürebilir. İmzalar /var/lib/clamav/ dizinine indirilir.

ClamAV Daemon Yapılandırması

ClamAV’ın arka planda çalışan daemon’u (clamd) Amavisd-new tarafından kullanılacak. Yapılandırma dosyasını açalım:

sudo nano /etc/clamav/clamd.conf

Kontrol etmeniz ve gerekirse değiştirmeniz gereken parametreler:

  • LocalSocket: /var/run/clamav/clamd.ctl (socket dosya yolu, Amavisd ile uyumlu olmalı)
  • User: clamav (çalışacak kullanıcı)
  • MaxFileSize: 25M (taranacak maksimum dosya boyutu, mail boyut limitinizle uyumlu tutun)
  • MaxScanSize: 100M (toplam tarama boyutu)
  • MaxRecursion: 10 (arşiv içi arşiv derinliği)
  • LogFile: /var/log/clamav/clamav.log
  • LogTime: yes
# clamd'ı başlat ve otomatik başlatmayı etkinleştir
sudo systemctl start clamav-daemon
sudo systemctl enable clamav-daemon

# Durumu kontrol et
sudo systemctl status clamav-daemon

Socket dosyasının oluşturulduğunu doğrulayın:

ls -la /var/run/clamav/clamd.ctl

Amavisd-new Yapılandırması

Amavisd-new’in ana yapılandırma dosyası /etc/amavis/conf.d/ dizininde parçalara ayrılmış durumda. Ana ayarları 50-user dosyasında yapmanızı öneririm, böylece paket güncellemelerinde üzerine yazılmaz.

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

Temel yapılandırma:

use strict;

# Hostname ayarı
$myhostname = 'mail.siteniz.com';

# Yönetici mail adresi (bildirimler buraya gider)
$daemon_user  = 'amavis';
$daemon_group = 'amavis';

# Virüs bulunduğunda yapılacak işlem
# 2: Engelle ve bildir, 1: Engelle sessizce, -1: İzin ver ve işaretle
$final_virus_destiny      = D_DISCARD;   # Virüslü maili sil
$final_banned_destiny     = D_BOUNCE;    # Yasaklı eklentiyi geri döndür
$final_spam_destiny       = D_PASS;      # Spam'i geçir (etiketle)
$final_bad_header_destiny = D_PASS;

# Virüs bildirimi gönderilsin mi?
$virus_admin = "[email protected]";
$mailfrom_notify_admin  = "[email protected]";

# ClamAV entegrasyonunu aktifleştir
@av_scanners = (
  ['ClamAV-clamd',
    &ask_daemon, ["CONTSCAN {}n", "/var/run/clamav/clamd.ctl"],
    qr/bOK$/, qr/bFOUND$/,
    qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);

@av_scanners_backup = ();

1;

Karantina Ayarları

Virüslü mailleri silmek yerine karantinaya almak isteyebilirsiniz, özellikle adli analiz gerektirebilecek ortamlarda:

sudo mkdir -p /var/lib/amavis/virusmails
sudo chown amavis:amavis /var/lib/amavis/virusmails
sudo chmod 750 /var/lib/amavis/virusmails

50-user dosyasına ekleyin:

# Karantina dizini
$QUARANTINEDIR = '/var/lib/amavis/virusmails';
$virus_quarantine_method = 'local:virus-%i-%n';
$final_virus_destiny = D_DISCARD;

Postfix ve Amavisd-new Entegrasyonu

Bu adım en kritik kısım. Postfix’i, gelen mailleri Amavisd-new üzerinden geçirecek şekilde yapılandırmalıyız.

master.cf Yapılandırması

sudo nano /etc/postfix/master.cf

Dosyanın sonuna şunları ekleyin:

# Amavisd-new content filter
amavis unix    -       -       -       -       2     smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

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

main.cf Yapılandırması

sudo nano /etc/postfix/main.cf

Content filter satırını ekleyin:

# Amavisd-new content filter
content_filter = amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

Amavis Kullanıcısına Postfix Grubu Erişimi

sudo adduser clamav amavis
sudo adduser amavis clamav

Bu adım socket dosyasına erişim için kritik. Atlanırsa ClamAV taraması sessizce başarısız olur.

Servisleri Yeniden Başlatma ve Test

sudo systemctl restart amavisd
sudo systemctl restart postfix
sudo systemctl restart clamav-daemon

# Tüm servislerin durumunu kontrol et
sudo systemctl status amavisd clamav-daemon postfix

EICAR Test Virüsü ile Doğrulama

EICAR, gerçek zararlı kod içermeyen, antivirüs sistemlerini test etmek için standart olarak kullanılan bir test dosyası. Mail sisteminizin virüslü eklentiyi doğru şekilde engelleyip engellemediğini test edelim:

# Test maili oluştur ve gönder
cat << 'EOF' > /tmp/eicar_test.txt
X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
EOF

# Bu test dosyasını mail olarak gönder (kendi adresinize)
echo "Test virüs tarama" | mail -s "EICAR Test" -A /tmp/eicar_test.txt [email protected]

Log dosyalarını izleyin:

sudo tail -f /var/log/mail.log

Başarılı bir engelleme şöyle görünür:

amavis[12345]: (12345-01) Blocked INFECTED (Eicar-Test-Signature)

Gerçek Dünya Senaryoları ve İnce Ayar

Senaryo 1: Belirli Dosya Uzantılarını Engelleme

Sadece virüs taraması yetmez, bazı dosya türleri doğrudan tehlikelidir. .exe, .js, .vbs gibi uzantıları tamamen engellemek için 50-user dosyasına ekleyin:

# Yasaklı dosya uzantıları
@banned_filename_re = new_RE(
  qr'^.(exe|vbs|pif|scr|bat|cmd|com|cpl)$'i,
  qr'.(exe|vbs|pif|scr|bat|cmd|com|cpl).'i,
  qr'^.(js|jse|wsh|wsc|hta)$'i,
  qr'^application/x-msdownload$'i,
);

Senaryo 2: Beyaz Liste Oluşturma

Belirli gönderici domainlerini veya adresleri taramadan muaf tutmak bazen gerekli olabiliyor, özellikle internal mail sunucularından gelen trafikte:

# Güvenilir göndericiler (taramadan muaf)
%whitelist_sender = map { ($_ => 1) } qw(
  [email protected]
  [email protected]
);

# Tüm domain'i muaf tut
$whitelist_sender{'.trustedcorp.com'} = 1;

Senaryo 3: Yoğun Trafik Ortamında Performans Ayarı

Günde binlerce mail işleyen bir sunucuda Amavisd-new’in kaç paralel process çalıştıracağını ayarlamanız gerekebilir. /etc/default/amavisd veya /etc/amavis/conf.d/50-user içinde:

# Paralel işlem sayısı (her biri ~50MB RAM kullanır)
$max_servers = 4;  # 4GB RAM'li sunucu için
$max_requests = 10;

Master.cf’deki amavis satırındaki 2 rakamını da aynı değerle eşleştirin.

Freshclam Otomatik Güncelleme

İmza veritabanının güncel tutulması, antivirüs sisteminin etkinliği için hayati. Freshclam varsayılan olarak saatte bir güncelleme kontrol eder, ancak bunu özelleştirebilirsiniz:

sudo nano /etc/clamav/freshclam.conf

Kritik parametreler:

  • Checks: 24 (günde 24 kez kontrol, yani saatlik)
  • DatabaseMirror: database.clamav.net
  • UpdateLogFile: /var/log/clamav/freshclam.log
  • NotifyClamd: /etc/clamav/clamd.conf (güncelleme sonrası clamd’ı bilgilendir)

Güncelleme durumunu izlemek için:

sudo tail -f /var/log/clamav/freshclam.log

Log İzleme ve Sorun Giderme

Yaygın Sorunlar ve Çözümleri

Sorun 1: Amavisd socket’e bağlanamıyor

# Socket izinlerini kontrol et
ls -la /var/run/clamav/
# clamd.ctl dosyası amavis kullanıcısı tarafından okunabilir olmalı

# Grup üyeliklerini doğrula
id amavis
id clamav

Sorun 2: Mail kuyruğu birikimi

ClamAV daemon çöktüğünde Amavisd timeout’a düşer ve maillar kuyrukta bekler. Monitoring kurmanız şart:

# Postfix kuyruğunu kontrol et
mailq | head -30
postqueue -p | wc -l

Sorun 3: Bellek yetersizliği

ClamAV veritabanı büyüdükçe bellek kullanımı artar. Mevcut kullanımı görün:

ps aux | grep clamd
# RSS değeri MB cinsinden bellek kullanımını gösterir

Log Analizi için Pratik Komutlar

# Son 100 virüs tespitini listele
grep "INFECTED" /var/log/mail.log | tail -100

# Bugün engellenen maillerin sayısı
grep "Blocked" /var/log/mail.log | grep "$(date '+%b %e')" | wc -l

# Hangi virüsler tespit edildi?
grep "FOUND" /var/log/clamav/clamav.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

# Amavisd performans istatistikleri
grep "TIMING" /var/log/mail.log | tail -20

Güvenlik Sertleştirme

Amavisd Güvenlik Ayarları

Üretim ortamında dikkat etmeniz gereken ek güvenlik parametreleri 50-user dosyasına:

# Büyük mailleri taramayı atla (DoS koruması)
$mailsize_limit = 10*1024*1024;  # 10MB üzeri mailleri tara ama eklentiyi sınırla

# Şifreli arşivleri engelle (içerik taranamaz)
$banned_filename_re = new_RE(
  [qr'..(exe|scr|pif)$'i => 0],  # İstisnalar
  qr'^application/x-zip'i,         # Genel zip engeli değil, sadece örnek
);

# X-Spam ve X-Virus header ekle
$X_HEADER_TAG = 'X-Virus-Scanned';
$X_HEADER_LINE = "by amavisd-new at $myhostname";
$warnvirusrecip = 0;  # Alıcıya virüs bildirimi gönderme (spam/phishing riski)

Firewall Kuralları

Amavisd portlarının dışarıya açık olmadığından emin olun:

# UFW ile port 10024 ve 10025'i sadece localhost'a kısıtla
sudo ufw deny 10024
sudo ufw deny 10025

# Mevcut kuralları doğrula
sudo ufw status verbose | grep 1002

Monitoring ve Alerting

Production ortamında sadece log okumak yetmez, proaktif izleme şart. Basit bir kontrol scripti:

#!/bin/bash
# /usr/local/bin/check_mailsecurity.sh

ALERT_EMAIL="[email protected]"
ERRORS=0

# ClamAV daemon kontrolü
if ! systemctl is-active --quiet clamav-daemon; then
    echo "KRITIK: ClamAV daemon calısmiyor!" | mail -s "Mail Security Alert" $ALERT_EMAIL
    systemctl start clamav-daemon
    ERRORS=$((ERRORS + 1))
fi

# Amavisd kontrolü
if ! systemctl is-active --quiet amavisd; then
    echo "KRITIK: Amavisd calısmiyor!" | mail -s "Mail Security Alert" $ALERT_EMAIL
    systemctl start amavisd
    ERRORS=$((ERRORS + 1))
fi

# Veritabanı yaşını kontrol et (48 saatten eski ise uyar)
DB_AGE=$(find /var/lib/clamav -name "*.cvd" -o -name "*.cld" | xargs ls -t | head -1 | xargs stat -c %Y)
NOW=$(date +%s)
AGE_HOURS=$(( (NOW - DB_AGE) / 3600 ))

if [ $AGE_HOURS -gt 48 ]; then
    echo "UYARI: ClamAV imza veritabani $AGE_HOURS saat guncellenmemis!" | mail -s "ClamAV DB Alert" $ALERT_EMAIL
fi

exit $ERRORS

Cron’a ekleyin:

sudo chmod +x /usr/local/bin/check_mailsecurity.sh
echo "*/15 * * * * root /usr/local/bin/check_mailsecurity.sh" | sudo tee /etc/cron.d/mailsecurity

Sonuç

Postfix ile ClamAV entegrasyonu, mail güvenliği için temel bir katman sağlar. Ancak tek başına yeterli olmadığını vurgulamak istiyorum; SPF, DKIM, DMARC gibi kimlik doğrulama mekanizmaları ve SpamAssassin ile birlikte çalıştırıldığında gerçek anlamda kapsamlı bir koruma elde edersiniz.

Kurulumu tamamladıktan sonra yapmanız gereken birkaç kritik şey daha var: EICAR testi ile sistemin çalıştığını doğrulayın, log rotasyonunu ayarlayın, ve en önemlisi freshclam güncellemelerinin düzenli çalıştığını izleyin. Eski imza veritabanı ile çalışan bir ClamAV, sizi yeni tehditlere karşı savunmasız bırakır.

Production’a almadan önce test ortamında en az bir hafta izlemenizi ve false positive oranını değerlendirmenizi öneririm. Özellikle $final_banned_destiny = D_BOUNCE ayarı meşru maillerin geri tepmesine neden olabilir; başlangıçta D_PASS ile etiketleme modunda çalışıp kademeli olarak sıkılaştırın. Sistem stabilize olduktan sonra yaptığınız tüm değişiklikleri belgelemeyi unutmayın, birkaç ay sonra neden o ayarı yaptığınızı hatırlamak hayat kurtarır.

Yorum yapın