ClamAV ile Linux Üzerinde Zararlı Yazılım Tarama

Linux sunucunuzu bir gün açtığınızda “Bu sistemde zararlı yazılım var mı?” diye kendinize sormaya başladıysanız, doğru yoldasınız demektir. Özellikle mail sunucuları, dosya paylaşım sunucuları veya web sunucuları gibi dış dünyayla sürekli temas halinde olan sistemlerde zararlı yazılım taraması artık bir lüks değil, zorunluluk haline geldi. ClamAV de bu noktada devreye giriyor: açık kaynaklı, ücretsiz ve kurumsal ortamlarda da rahatlıkla kullanılabilen bir antivirüs çözümü.

Bu yazıda ClamAV’ı sıfırdan kurup yapılandıracağız, otomatik taramalar ayarlayacağız ve gerçek dünya senaryolarında nasıl kullanacağımızı inceleyeceğiz.

ClamAV Nedir ve Ne İşe Yarar?

ClamAV, Cisco Talos ekibi tarafından geliştirilen ve aktif olarak güncellenen bir antivirüs motorudur. Asıl gücü imza tabanlı tarama yapmasında yatıyor; milyonlarca zararlı yazılım imzasını içeren veri tabanını düzenli olarak güncelleyerek dosyaları bu imzalarla karşılaştırıyor.

Linux sunucularında ClamAV’ın öne çıktığı kullanım senaryoları şunlar:

  • Mail sunucusu entegrasyonu: Postfix veya Sendmail üzerinden geçen eklentileri tarama
  • Web sunucusu koruması: Kullanıcıların yüklediği dosyaları gerçek zamanlı kontrol etme
  • Samba/NFS paylaşımları: Windows istemcilerden gelen dosyalarda zararlı yazılım arama
  • Periyodik sistem taraması: Cron job ile düzenli aralıklarda kritik dizinleri tarama
  • Olay müdahalesi: Bir saldırı şüphesi sonrası sistemin hızlıca taranması

ClamAV’ın iki temel bileşeni var: clamscan doğrudan komut satırından çalışan tarayıcı, clamd ise arka planda daemon olarak çalışan ve çok daha hızlı tarama yapan servis. Daemon versiyonu imza veri tabanını bellekte tuttuğu için her taramada yeniden yüklemek zorunda kalmıyor; büyük dosya sistemlerinde bu fark ciddi boyutlara ulaşıyor.

Kurulum

Debian/Ubuntu Tabanlı Sistemler

sudo apt update
sudo apt install clamav clamav-daemon clamav-freshclam -y

RHEL/CentOS/Rocky Linux Tabanlı Sistemler

EPEL deposunu etkinleştirmeniz gerekiyor:

sudo dnf install epel-release -y
sudo dnf install clamav clamd clamav-update -y

Arch Linux

sudo pacman -S clamav

Kurulum tamamlandıktan sonra ilk yapmanız gereken şey imza veri tabanını güncellemek. Ancak burada küçük bir tuzak var: clamav-freshclam servisi çalışıyorsa freshclam komutunu manuel olarak çalıştıramazsınız, çünkü her ikisi de aynı kilitleme dosyasını kullanır.

# Önce servisi durdurun
sudo systemctl stop clamav-freshclam

# İmza veri tabanını güncelleyin
sudo freshclam

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

İlk güncelleme birkaç dakika sürebilir çünkü birkaç yüz megabaytlık veri tabanı indirilecek. Sabırlı olun.

Temel Yapılandırma

freshclam.conf Ayarları

/etc/clamav/freshclam.conf dosyası imza güncelleme ayarlarını içeriyor:

sudo nano /etc/clamav/freshclam.conf

Dikkat etmeniz gereken bazı parametreler:

  • DatabaseMirror: Güncellemelerin indirileceği sunucu. Varsayılan database.clamav.net genellikle yeterli.
  • Checks: Günde kaç kez güncelleme kontrolü yapılacağı. Varsayılan 12, yani 2 saatte bir.
  • NotifyClamd: Veri tabanı güncellendikten sonra clamd servisine bildirim gönder.
  • UpdateLogFile: Güncelleme loglarının yazılacağı dosya.

Kurumsal ortamlarda bant genişliğini korumak için bir proxy üzerinden güncelleme almak isteyebilirsiniz:

# freshclam.conf içine ekleyin
HTTPProxyServer proxy.sirketiniz.com
HTTPProxyPort 3128

clamd.conf Ayarları

/etc/clamav/clamd.conf dosyası daemon’ın davranışını belirliyor:

sudo nano /etc/clamav/clamd.conf

Önemli parametreler:

  • MaxFileSize: Taranacak maksimum dosya boyutu. Varsayılan 25MB, büyük ortamlarda artırabilirsiniz.
  • MaxScanSize: Arşiv açıldıktan sonra taranacak maksimum boyut.
  • MaxRecursion: Arşiv içindeki arşiv tarama derinliği. Zip bomb saldırılarına karşı dikkatli olun.
  • ScanArchives: Sıkıştırılmış dosyaların içini tara.
  • ScanMail: Mail formatlarını tara.
  • ScanPDF: PDF dosyalarını tara.
  • LogFile: Log dosyasının konumu.
  • LogRotate: Log rotasyonunu etkinleştir.

Daemon’ı başlatmak için:

sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
sudo systemctl status clamav-daemon

clamscan ile Manuel Tarama

clamscan komutu, daemon gerektirmeden doğrudan tarama yapmanızı sağlar. Küçük bir dosyayı veya dizini hızlıca taramak için idealdir.

Temel Kullanım

# Tek dosya tarama
clamscan /home/kullanici/indirilenler/dosya.zip

# Dizin tarama (alt dizinler dahil)
clamscan -r /home/kullanici/

# Sadece virüslü dosyaları göster
clamscan -r --bell -i /var/www/html/

# Tarama sonuçlarını dosyaya kaydet
clamscan -r /home/ --log=/var/log/clamav/tarama_$(date +%Y%m%d).log

Sık kullanılan parametreler:

  • -r: Alt dizinleri de tara (recursive)
  • -i: Sadece virüslü dosyaları göster (infected only)
  • –bell: Virüs bulunduğunda ses çıkar
  • –remove: Virüslü dosyaları otomatik sil (dikkatli kullanın!)
  • –move=/karantina: Virüslü dosyaları karantina dizinine taşı
  • –log=/dosya: Sonuçları log dosyasına yaz
  • –exclude-dir: Belirtilen dizini taramadan geç
  • –max-filesize=100M: 100MB’den büyük dosyaları atla
  • –quiet: Sessiz mod, sadece dönüş kodu kullan

Gerçek Dünya Örneği: Web Sunucusu Taraması

Bir müşteri “web sitemiz yavaşladı ve garip dosyalar var” diye aradığında ilk yaptığım şey şu komuttu:

clamscan -r --bell -i 
  --exclude-dir="^/var/www/html/cache" 
  --log=/var/log/clamav/webserver_scan.log 
  /var/www/html/ 2>&1 | tee /tmp/clamav_output.txt

# Sonuçlara hızlı bakmak için
grep "FOUND" /var/log/clamav/webserver_scan.log
grep "Infected files" /var/log/clamav/webserver_scan.log

cache dizinini taramadan çıkarıyoruz çünkü oradaki geçici dosyalar bazen yanlış pozitif sonuç verebiliyor ve taramayı gereksiz yere uzatıyor.

clamdscan ile Daemon Tabanlı Tarama

Daemon çalışırken clamdscan kullanmak çok daha hızlı. Büyük bir sunucuda clamscan saatlerce sürebilecek bir taramayı clamdscan çok daha kısa sürede tamamlıyor.

# Daemon kullanarak tarama
clamdscan -r /home/

# Çoklu thread kullanarak paralel tarama
clamdscan --multiscan -r /var/www/

# Fdpass ile socket üzerinden tarama (izin sorunlarını çözer)
clamdscan --fdpass /root/kritik_dizin/

Daemon’ın çalışıp çalışmadığını kontrol etmek için:

sudo systemctl status clamav-daemon
# veya
clamdscan --ping

Otomatik Tarama: Cron Job Kurulumu

Günlük veya haftalık otomatik taramalar kurmak, manuel kontrole bağımlılığı ortadan kaldırıyor. İşte benim üretim ortamlarında kullandığım yaklaşım:

Önce bir tarama scripti oluşturalım:

sudo nano /usr/local/bin/clamav-tarama.sh
#!/bin/bash
# ClamAV Otomatik Tarama Scripti
# Yazar: Sysadmin Blog

TARIH=$(date +%Y%m%d_%H%M%S)
LOG_DIZIN="/var/log/clamav"
LOG_DOSYA="${LOG_DIZIN}/tarama_${TARIH}.log"
KARANTINA_DIZIN="/var/quarantine"
BILDIRIM_MAIL="[email protected]"
TARANACAK_DIZINLER="/home /var/www /tmp /var/tmp"

# Dizinleri oluştur
mkdir -p "${LOG_DIZIN}"
mkdir -p "${KARANTINA_DIZIN}"

# Tarama başlangıç zamanı
echo "Tarama başladı: $(date)" >> "${LOG_DOSYA}"

# Taramayı çalıştır
clamscan -r 
  --infected 
  --move="${KARANTINA_DIZIN}" 
  --log="${LOG_DOSYA}" 
  --exclude-dir="^/proc" 
  --exclude-dir="^/sys" 
  --exclude-dir="^/dev" 
  ${TARANACAK_DIZINLER}

CIKIS_KODU=$?

echo "Tarama bitti: $(date)" >> "${LOG_DOSYA}"

# Virüs bulunduysa mail gönder (exit code 1 = virüs bulundu)
if [ ${CIKIS_KODU} -eq 1 ]; then
  VIRÜSLÜ_SAYISI=$(grep "FOUND" "${LOG_DOSYA}" | wc -l)
  echo "DİKKAT: $(hostname) sunucusunda ${VIRÜSLÜ_SAYISI} adet zararlı dosya bulundu!
  
Log dosyası: ${LOG_DOSYA}
Karantina dizini: ${KARANTINA_DIZIN}

Detaylar:
$(grep 'FOUND' ${LOG_DOSYA})" | mail -s "[ALARM] ClamAV Virüs Tespit Etti - $(hostname)" "${BILDIRIM_MAIL}"
fi

# Eski logları temizle (30 günden eski)
find "${LOG_DIZIN}" -name "tarama_*.log" -mtime +30 -delete

exit ${CIKIS_KODU}
# Script'i çalıştırılabilir yap
sudo chmod +x /usr/local/bin/clamav-tarama.sh

# Cron job ekle (her gece 02:00'de çalışsın)
sudo crontab -e

Cron job içeriği:

# ClamAV günlük tarama - Her gece 02:00
0 2 * * * /usr/local/bin/clamav-tarama.sh >> /var/log/clamav/cron.log 2>&1

ClamAV çıkış kodları hakkında bilmeniz gereken şunlar:

  • 0: Temiz, virüs bulunamadı
  • 1: Virüs bulundu
  • 2: Bir hata oluştu

Bu kodları scriptte kullanmak, otomasyonunuzu çok daha güvenilir hale getiriyor.

OnAccess Tarama: Gerçek Zamanlı Koruma

ClamAV, Linux’un fanotify mekanizmasını kullanarak dosyalara erişim anında tarama yapabiliyor. Bu özellik özellikle yükleme dizinleri için çok değerli.

clamd.conf dosyasına şunları ekleyin:

# OnAccess tarama ayarları
OnAccessMountPath /var/www/html/uploads
OnAccessIncludePath /home
OnAccessExtraScanning yes
OnAccessDisableDDD yes
OnAccessMaxFileSize 10M

Ardından daemon’ı yeniden başlatın:

sudo systemctl restart clamav-daemon

Önemli not: OnAccess tarama performans üzerinde belirgin bir etki yaratıyor. Yoğun I/O olan sunucularda dikkatli kullanın, önce test ortamında deneyin.

Mail Sunucusu Entegrasyonu: clamav-milter

Postfix ile ClamAV’ı entegre etmek, gelen ve giden mailleri otomatik olarak taramanızı sağlıyor.

# clamav-milter kurulumu
sudo apt install clamav-milter -y  # Debian/Ubuntu
# veya
sudo dnf install clamav-milter -y  # RHEL/Rocky

/etc/clamav/clamav-milter.conf ayarları:

MilterSocket /var/spool/postfix/clamav/clamav.sock
MilterSocketMode 666
FixStaleSocket yes
User clamav
AllowSupplementaryGroups yes
ReadTimeout 120
Foreground no
PidFile /run/clamav/clamav-milter.pid
OnInfected Reject
OnError Accept
LogFile /var/log/clamav/milter.log
LogTime yes
LogInfected Basic

Postfix’te milter’ı aktifleştirmek için /etc/postfix/main.cf dosyasına ekleyin:

smtpd_milters = unix:/var/spool/postfix/clamav/clamav.sock
non_smtpd_milters = unix:/var/spool/postfix/clamav/clamav.sock
milter_default_action = accept

Yanlış Pozitifler ve Karantina Yönetimi

Yanlış pozitifler (false positive) ClamAV kullanırken karşılaşacağınız en yaygın sorunlardan biri. Özellikle bazı meşru yazılım paketleri veya şifrelenmiş dosyalar zaman zaman yanlış alarm verebiliyor.

Karantina dizinini yönetmek için:

# Karantina içeriğini listele
ls -la /var/quarantine/

# Şüpheli dosyayı incele (çalıştırmadan!)
file /var/quarantine/suphe_dosya
strings /var/quarantine/suphe_dosya | head -50

# Yanlış pozitif ise dosyayı geri taşı
sudo mv /var/quarantine/dosya.txt /home/kullanici/belgeler/

# Yanlış pozitifi ClamAV ekibine bildir
# https://www.clamav.net/reports/fp adresini kullanın

Belirli dosyaları veya dizinleri beyaz listeye almak için /etc/clamav/whitelist.ign2 dosyası oluşturabilirsiniz:

sudo nano /etc/clamav/whitelist.ign2
# Bu imzaları yoksay
Heuristics.Phishing.Email.SpoofedDomain
PUA.Win.Packer.Upx

clamd.conf dosyasına da şunu ekleyin:

ExcludePUA PUA.Win.Packer
IgnoreFile /etc/clamav/whitelist.ign2

Performans Optimizasyonu

Büyük dosya sistemlerinde ClamAV taraması ciddi kaynak tüketebiliyor. Şu önlemlerle performansı optimize edebilirsiniz:

# nice ile düşük öncelikte çalıştır
nice -n 19 clamscan -r /home/

# ionice ile I/O önceliğini düşür
ionice -c 3 clamscan -r /home/

# Her ikisini birleştir
nice -n 19 ionice -c 3 clamscan -r --infected /home/ 
  --log=/var/log/clamav/tarama.log

Cron job’ınızda da bu yaklaşımı kullanabilirsiniz:

0 2 * * * nice -n 19 ionice -c 3 /usr/local/bin/clamav-tarama.sh

Bunların yanı sıra clamd.conf içinde şu ayarları da değerlendirin:

  • MaxThreads: Paralel tarama thread sayısı. CPU çekirdeğinin yarısını kullanmak iyi bir başlangıç.
  • ReadTimeout: Büyük dosyalar için zaman aşımı süresini artırın.
  • MaxDirectoryRecursion: Çok derin dizin yapılarında sınır koyun.

Olay Müdahalesi: Sisteme Sızdıktan Sonra ClamAV Kullanımı

Bir ihlal şüphesi durumunda ClamAV’ı nasıl kullanacağınızı bilmek kritik önem taşıyor. Şu senaryoyu ele alalım: sunucunuzda şüpheli ağ trafiği fark ettiniz.

# Önce sistemi dondurma olmadan hızlı tarama
# /tmp ve /var/tmp en çok kullanılan yerleşim noktaları
clamscan -r --infected 
  /tmp /var/tmp /dev/shm 
  /var/www/html 
  /home 
  --log=/root/olaymudalahesi_$(date +%Y%m%d).log

# Son değiştirilmiş dosyaları bul
find /var/www /home /tmp -newer /var/log/auth.log -type f 2>/dev/null | 
  xargs clamscan --infected 2>/dev/null

# Çalışan proseslerin dosyalarını tara
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  if [ -f /proc/$pid/exe ]; then
    exe=$(readlink /proc/$pid/exe 2>/dev/null)
    if [ -n "$exe" ]; then
      clamscan "$exe" 2>/dev/null | grep -v "OK$"
    fi
  fi
done

Şüpheli crontab’ları da kontrol etmeyi unutmayın:

# Tüm kullanıcıların crontab'larını tara
for user in $(cut -d: -f1 /etc/passwd); do
  crontab -l -u $user 2>/dev/null
done

Loglama ve İzleme

ClamAV loglarını merkezi bir log yönetim sistemine göndermek, büyük ortamlarda şart. Basit bir log izleme scripti:

#!/bin/bash
# ClamAV log izleyici
LOG_DOSYA="/var/log/clamav/clamav.log"

tail -f "${LOG_DOSYA}" | while read satir; do
  if echo "${satir}" | grep -q "FOUND"; then
    echo "ALARM: Zararlı yazılım tespit edildi!"
    echo "${satir}"
    # Buraya alert mekanizmanızı ekleyin
    # Örnek: Slack webhook, PagerDuty, email
  fi
done

Logları journald üzerinden de takip edebilirsiniz:

# clamd loglarını canlı izle
sudo journalctl -u clamav-daemon -f

# Son 100 satır
sudo journalctl -u clamav-daemon -n 100 --no-pager

Veri Tabanı Güncellemelerini Doğrulama

İmza veri tabanının güncel olup olmadığını kontrol etmek için:

# Veri tabanı bilgilerini göster
sigtool --info /var/lib/clamav/main.cvd
sigtool --info /var/lib/clamav/daily.cvd

# Kaç imza var?
sigtool --info /var/lib/clamav/daily.cvd | grep "Signatures"

# freshclam durumu
sudo freshclam --verbose 2>&1 | head -20

Veri tabanı 1 günden eskiyse bir sorun var demektir. Bunu izlemek için basit bir kontrol scripti şöyle yazılabilir:

# Veri tabanı yaşını kontrol et
DB_TARIH=$(sigtool --info /var/lib/clamav/daily.cvd | grep "Build time" | cut -d: -f2-)
echo "Veri tabanı tarihi: ${DB_TARIH}"

DB_BOYUT=$(stat -c%s /var/lib/clamav/daily.cvd)
if [ ${DB_BOYUT} -lt 1000000 ]; then
  echo "UYARI: Veri tabanı boyutu şüpheli derecede küçük!"
fi

Sonuç

ClamAV, Linux ortamında zararlı yazılım koruması için güçlü ve esnek bir araç. Ücretsiz olması ve açık kaynak kodlu yapısı onu küçük ölçekli VPS’lerden büyük kurumsal ortamlara kadar her yerde kullanılabilir kılıyor.

Bu yazıda anlattıklarımızı özetleyecek olursak: temel kurulum ve yapılandırma ile başlayın, imza veri tabanı güncellemelerini otomatikleştirin, daemon üzerinden çalışarak performansı artırın ve mutlaka otomatik tarama scriptleri kurun. Mail sunucu entegrasyonu ve OnAccess tarama ise bir adım öteye geçmek isteyenler için çok değerli özellikler.

Önemli bir gerçeği de paylaşmak istiyorum: ClamAV tek başına bir güvenlik stratejisi değil, kapsamlı bir güvenlik mimarisinin parçası. Onu SELinux/AppArmor, fail2ban, düzenli güvenlik güncellemeleri ve ağ trafiği izleme ile birlikte kullanmak gerekiyor. Zararlı yazılım taraması güvenlik zincirinin önemli bir halkası, ama tek başına zincirin tamamı değil.

Üretim sunucularında ilk kez çalıştırmadan önce mutlaka test ortamında deneyin, özellikle --remove ve --move parametrelerini kullanırken dikkatli olun. Yanlış bir silme operasyonu, zararlı yazılımdan daha fazla baş ağrısı yaratabilir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir