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.