CSF Loglama ve Saldırı Raporlama: Kapsamlı Rehber

Sunucunuzda neler olduğunu bilmiyorsanız, güvenlik duvarınız sizi korusa bile körü körüne çalışıyorsunuz demektir. CSF (ConfigServer Security & Firewall), sadece paket filtreleyen bir araç değil; aynı zamanda oldukça güçlü bir loglama ve raporlama altyapısına sahip bir sistem. Bu yazıda CSF’in loglama mekanizmalarını, saldırı raporlama özelliklerini ve bunları gerçek hayatta nasıl kullanacağınızı ele alacağız.

CSF Loglama Temelleri

CSF, temel olarak iptables üzerine kurulu olduğu için loglarının bir kısmı doğrudan kernel mesajları olarak gelir. Ancak CSF’in kendi log yönetimi de oldukça kapsamlı.

CSF logları varsayılan olarak birkaç farklı yerde tutulur:

  • /var/log/lfd.log: LFD (Login Failure Daemon) logları, engelleme ve açma işlemleri
  • /var/log/messages veya /var/log/syslog: Kernel/iptables logları
  • /etc/csf/csf.deny: Kalıcı olarak engellenen IP’ler
  • /var/lib/csf/tmp/: Geçici engelleme dosyaları

LFD daemon’ı, CSF’in gözü kulağı olarak düşünebilirsiniz. SSH brute force denemeleri, port taramaları, bağlantı limiti aşımları gibi olayları izler ve gerektiğinde otomatik engelleme yapar.

Temel Log Konfigürasyonu

/etc/csf/csf.conf dosyasında loglama ile ilgili birkaç kritik parametre var:

LOGDROP: Engellenen paketlerin loglanıp loglanmayacağını belirler. 1 olarak ayarlandığında DROP edilen her paket loglanır. Yoğun saldırı altındaysanız bu disk I/O’nuzu ciddi şekilde etkileyebilir.

LOGDROPRATE: Saniye başına maksimum kaç DROP logu yazılacağını belirler. Varsayılan genellikle 30’dur.

LOGFLOOD: Flood saldırılarının loglanması için kullanılır.

LF_LOG_LEVEL: LFD’nin log seviyesini belirler. 4 farklı seviye mevcuttur; yüksek seviye daha fazla detay demektir.

# csf.conf içindeki temel log parametrelerini görüntüle
grep -E "^LOGDROP|^LF_LOG|^LOGFLOOD" /etc/csf/csf.conf

Bu komutu çalıştırdığınızda mevcut ayarlarınızı görebilirsiniz. Prodüksiyon ortamında genellikle LOGDROP=1, LOGDROPRATE=30 dengeli bir başlangıç noktasıdır.

LFD Log Analizi

LFD loglarını anlık izlemek için en basit yöntem tail komutunu kullanmaktır:

# LFD loglarını canlı izle
tail -f /var/log/lfd.log

# Son 100 satırı görüntüle
tail -n 100 /var/log/lfd.log

# Sadece engelleme olaylarını filtrele
grep "Blocked" /var/log/lfd.log | tail -n 50

Tipik bir LFD log satırı şu şekilde görünür:

Dec 15 14:23:45 sunucu lfd[12345]: (sshd) Failed SSH login from 192.168.1.100 (TR/Turkey/tr-istanbul.example.com): 5 in the last 300 secs - *Blocked in csf* [LF_SSHD]

Bu satırda şunları okuyabilirsiniz: hangi servis saldırıya uğradı (sshd), hangi IP’den geldi, kaç başarısız deneme oldu, hangi süre içinde gerçekleşti ve hangi CSF kuralı devreye girdi.

Sık Saldırı Yapan IP’leri Tespit Etme

Logları elle okumak yerine biraz awk ve sort büyüsü ile saldırı haritanızı çıkarabilirsiniz:

# En çok engellenen IP'leri listele
grep "Blocked" /var/log/lfd.log | 
  grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | 
  sort | uniq -c | sort -rn | head -20

Bu komut size hangi IP’nin kaç kez engelleme yediğini gösterir. Eğer bir IP sürekli engel yiyip açılıyorsa (geçici engelleme bittikten sonra tekrar deniyor), o IP’yi kalıcı engelleme listesine almanız gerekebilir:

# IP'yi kalıcı olarak engelle
csf -d 192.168.1.100 "Tekrarlayan SSH brute force - $(date)"

# Engelleme durumunu kontrol et
csf -g 192.168.1.100

E-posta Uyarıları ve Raporlama

CSF’in en değerli özelliklerinden biri, olaylar gerçekleştiğinde size e-posta göndermesidir. Özellikle sunucunuzu aktif olarak izleyemediğiniz saatlerde bu özellik hayat kurtarır.

E-posta Uyarı Konfigürasyonu

/etc/csf/csf.conf dosyasında e-posta ayarları:

LF_EMAIL_ALERT: 1 yapıldığında LFD engelleme işlemlerinde e-posta gönderir.

LF_ALERT_TO: Uyarıların gönderileceği e-posta adresi. Birden fazla adres için virgülle ayırın.

LF_ALERT_FROM: Gönderen e-posta adresi.

LF_EMAILALERT_CYCLES: Kaç engelleme işlemi sonrasında e-posta gönderileceği. Çok düşük ayarlarsanız inbox’ınız dolabilir.

LF_PORT_ALERT: Port tarama tespitinde uyarı gönder.

LF_DISTATTACK: Distributed brute force saldırılarında uyarı gönder.

Bir prodüksiyon sunucusunda önerilen yaklaşım, kritik uyarıları hemen, düşük öncelikli uyarıları ise özetlenmiş şekilde almaktır. Bu şekilde alert fatigue (uyarı yorgunluğu) yaşamazsınız.

Uyarı Eşiklerini Ayarlama

# csf.conf içinde e-posta uyarı parametrelerini düzenle
nano /etc/csf/csf.conf

# Değişiklikleri uygulamak için CSF'i yeniden başlat
csf -r
systemctl restart lfd

Gerçek dünya senaryosu olarak düşünün: Gece 3’te SSH’a brute force saldırısı başladı. Eğer e-posta uyarılarınız doğru ayarlanmışsa, sabah kalkıp maillerinizi açtığınızda “Dün gece 127 farklı IP, SSH portuna bağlantı denemesi yaptı, hepsi engellendi” şeklinde özet bir bilgi görürsünüz. Bu bilgiye bakarak ek önlemler alabilirsiniz; belki SSH portunu değiştirme zamanı gelmiştir.

Gerçek Zamanlı İzleme Araçları

CSF ile birlikte gelen watch komutu kombinasyonu, anlık durumu görmenizi sağlar:

# CSF istatistiklerini 2 saniyede bir güncelle
watch -n 2 'csf -l | head -50'

# Aktif engelleme listesini izle
watch -n 5 'csf -t'

# LFD geçici engellemelerini göster
csf -t

csf -t komutu geçici olarak engellenen IP’leri ve bu engellemenin ne zaman kalkacağını gösterir. Bu özellikle “Neden sitemize erişemiyorum?” şikayetleriyle geldiğinizde ilk bakacağınız yerlerden biridir.

Logwatch ile Günlük Özetler

Logwatch kurulu bir sistemde CSF entegrasyonu oldukça kullanışlıdır:

# Logwatch kurulumu (CentOS/RHEL)
yum install logwatch -y

# Logwatch kurulumu (Debian/Ubuntu)
apt-get install logwatch -y

# Manuel olarak günlük rapor oluştur
logwatch --detail High --mailto [email protected] --range today

Ancak CSF’e özel daha odaklı bir rapor için kendi script’lerinizi yazmanız çok daha efektif olur.

Özel Log Analiz Script’leri

Yıllarca sunucu yönetimi yapınca anlıyorsunuz ki hazır araçlar her zaman tam istediğinizi vermiyor. İşte bu yüzden küçük script’ler yazıp cron’a bağlamak en pratik çözüm:

#!/bin/bash
# /usr/local/bin/csf-gunluk-rapor.sh
# Her gün sabah 8'de çalışacak şekilde cron'a eklenecek

RAPOR_TARIHI=$(date '+%d/%m/%Y')
LOG_DOSYASI="/var/log/lfd.log"
EMAIL="[email protected]"
SUNUCU_ADI=$(hostname)

echo "=== CSF Gunluk Guvenlik Raporu - $RAPOR_TARIHI ===" > /tmp/csf_rapor.txt
echo "Sunucu: $SUNUCU_ADI" >> /tmp/csf_rapor.txt
echo "" >> /tmp/csf_rapor.txt

# Bugunku engelleme sayisi
BUGUN=$(date '+%b %e')
ENGELLEME_SAYISI=$(grep "$BUGUN" $LOG_DOSYASI | grep -c "Blocked")
echo "Toplam Engelleme: $ENGELLEME_SAYISI" >> /tmp/csf_rapor.txt
echo "" >> /tmp/csf_rapor.txt

# En cok saldiran top 10 IP
echo "--- En Cok Saldiran IP'ler (Top 10) ---" >> /tmp/csf_rapor.txt
grep "$BUGUN" $LOG_DOSYASI | grep "Blocked" | 
  grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | 
  sort | uniq -c | sort -rn | head -10 >> /tmp/csf_rapor.txt
echo "" >> /tmp/csf_rapor.txt

# Servis bazli saldiri dagilimi
echo "--- Servis Bazli Saldirilar ---" >> /tmp/csf_rapor.txt
grep "$BUGUN" $LOG_DOSYASI | grep "Blocked" | 
  grep -oP '(K[^)]+' | 
  sort | uniq -c | sort -rn >> /tmp/csf_rapor.txt

# E-posta gonder
mail -s "CSF Guvenlik Raporu - $SUNUCU_ADI - $RAPOR_TARIHI" 
  $EMAIL < /tmp/csf_rapor.txt

# Gecici dosyayi temizle
rm -f /tmp/csf_rapor.txt

Bu script’i cron’a eklemek için:

chmod +x /usr/local/bin/csf-gunluk-rapor.sh

# Cron'a ekle - her gün sabah 8'de çalışsın
echo "0 8 * * * root /usr/local/bin/csf-gunluk-rapor.sh" >> /etc/cron.d/csf-rapor

Port Tarama Tespiti ve Loglanması

CSF’in PORTFLOOD ve PORTKNOCKING özellikleri de önemli log kaynakları. Port tarama girişimleri genellikle daha büyük bir saldırının hazırlık aşamasıdır.

Port tarama loglarını görmek için:

# Birden fazla port denemesi yapan IP'leri tespit et
grep "Port Scan" /var/log/lfd.log | tail -n 20

# iptables üzerinden port tarama loglarını göster
dmesg | grep -i "port scan" | tail -n 20

# Belirli bir IP'nin tüm aktivitesini görüntüle
grep "203.0.113.50" /var/log/lfd.log

Gerçek dünya senaryosu: Bir sabah LFD loglarına baktınız, tek bir IP adresi 25, 80, 443, 22, 3306, 5432 portlarına sırayla bağlantı denemesi yapmış. Bu klasik bir nmap taraması izini bırakır. CSF bunu otomatik olarak tespit edip engelliyor olmalı, ama siz de bu IP’yi kalıcı listeye ekleyip not düşün:

# Şüpheli IP'yi kalıcı engelle ve not ekle
csf -d 203.0.113.50 "Port tarama girişimi - $(date '+%d/%m/%Y %H:%M') - Portlar: 22,25,80,443,3306"

# Engelleme listesini görüntüle
cat /etc/csf/csf.deny | grep "203.0.113.50"

CT (Connection Tracking) Logları

CSF’in CT özelliği, aynı IP’den gelen aşırı bağlantıları takip eder. Bu özellikle web sunucularında DDoS benzeri durumların tespitinde kritik:

CT_LIMIT: Bir IP’nin maksimum eş zamanlı bağlantı sayısı.

CT_INTERVAL: Kontrol aralığı (saniye).

CT_EMAIL_ALERT: Bağlantı limiti aşımında e-posta gönder.

CT_PORTS: Hangi portlarda bağlantı takibi yapılacağı.

# Anlık bağlantı durumunu görüntüle
ss -tn | awk 'NR>1 {print $5}' | 
  cut -d: -f1 | sort | uniq -c | sort -rn | head -20

# CSF CT loglarını kontrol et
grep "CT_LIMIT" /var/log/lfd.log | tail -n 20

# Şu an en çok bağlantısı olan IP'leri göster
netstat -tn 2>/dev/null | awk 'NR>2 && /ESTABLISHED/ {print $5}' | 
  cut -d: -f1 | sort | uniq -c | sort -rn | head -15

Bir web hosting ortamında çalışıyorsanız ve aniden bir müşteri sitesi yavaşlamaya başladıysa, ilk çalıştıracağınız komutlar bunlar olmalı. Belki o siteye bot trafiği giriyordur ve CT limiti devreye giriyordur.

Cluster Mod ve Merkezi Loglama

Birden fazla sunucu yönetiyorsanız CSF’in cluster özelliği size merkezi bir görünüm sunar. Bir sunucudan engellenen IP otomatik olarak diğer sunuculara da iletilebilir.

Cluster konfigürasyonu için /etc/csf/csf.conf dosyasında:

CLUSTER_MASTER: Master sunucunun IP adresi.

CLUSTER_SENDTO: Engelleme bilgisinin gönderileceği sunucular.

CLUSTER_RECVFROM: Engelleme bilgisi alınacak sunucular.

CLUSTER_CONFIG: Cluster konfigürasyon senkronizasyonu.

Cluster ortamında merkezi log analizi için tüm sunucuların LFD loglarını bir log aggregation sistemine (örneğin ELK Stack veya Graylog) göndermek en sağlıklı yaklaşımdır. Ama küçük ortamlar için basit bir rsyslog konfigürasyonu yeterli olur:

# /etc/rsyslog.d/csf-remote.conf
# LFD loglarını merkezi log sunucusuna ilet
if $programname == 'lfd' then @@log-sunucu.sirket.com:514
& stop

Log Rotasyonu ve Arşivleme

Aktif bir sunucuda LFD logları hızla büyüyebilir. Logrotate ile bu durumu kontrol altına alın:

# /etc/logrotate.d/lfd dosyasını oluştur veya düzenle
cat > /etc/logrotate.d/lfd << 'EOF'
/var/log/lfd.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    postrotate
        /bin/kill -HUP $(cat /var/run/lfd.pid 2>/dev/null) 2>/dev/null || true
    endscript
}
EOF

Bu konfigürasyon logları günlük rotate eder, 30 gün saklar ve sıkıştırır. 30 günlük CSF logu tutmak, özellikle adli inceleme (forensic analysis) gerektiren durumlarda çok işinize yarar. “Geçen ay bu IP bize ne zaman ilk saldırdı?” sorusunun cevabını vermenizi sağlar.

Güvenlik Olayı Sonrası Log Analizi

Bir güvenlik ihlali şüphesi durumunda CSF loglarını sistematik olarak incelemek için:

#!/bin/bash
# Belirli bir IP için kapsamli analiz
HEDEF_IP="$1"

if [ -z "$HEDEF_IP" ]; then
    echo "Kullanim: $0 <IP_ADRESI>"
    exit 1
fi

echo "=== $HEDEF_IP icin CSF Log Analizi ==="
echo ""

echo "--- LFD Log Kayitlari ---"
grep "$HEDEF_IP" /var/log/lfd.log | tail -n 30

echo ""
echo "--- Engelleme Listesi Durumu ---"
csf -g "$HEDEF_IP"

echo ""
echo "--- csf.deny Kaydi ---"
grep "$HEDEF_IP" /etc/csf/csf.deny

echo ""
echo "--- Auth Log (SSH girisimleri) ---"
grep "$HEDEF_IP" /var/log/auth.log 2>/dev/null | tail -n 20
grep "$HEDEF_IP" /var/log/secure 2>/dev/null | tail -n 20

echo ""
echo "--- Apache/Nginx Log ---"
grep "$HEDEF_IP" /var/log/apache2/access.log 2>/dev/null | tail -n 10
grep "$HEDEF_IP" /var/log/nginx/access.log 2>/dev/null | tail -n 10

Bu script’i /usr/local/bin/csf-ip-analiz.sh olarak kaydedin ve chmod +x ile çalıştırılabilir yapın. Bir IP hakkında hızlı karar vermeniz gerektiğinde çok zaman kazandırır.

SIEM Entegrasyonu İçin Log Formatı

Eğer bir SIEM (Security Information and Event Management) sistemine CSF loglarını entegre edecekseniz, log formatını standartlaştırmanız gerekir. CEF (Common Event Format) veya JSON formatına dönüştürmek için bir ara script işe yarar:

#!/bin/bash
# LFD loglarini JSON formatina donustur
# Kullanim: tail -f /var/log/lfd.log | ./lfd-to-json.sh

while IFS= read -r satir; do
    TARIH=$(echo "$satir" | awk '{print $1, $2, $3}')
    SUNUCU=$(echo "$satir" | awk '{print $4}')
    
    if echo "$satir" | grep -q "Blocked"; then
        IP=$(echo "$satir" | grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | head -1)
        KURAL=$(echo "$satir" | grep -oP '[LF_K[^]]+')
        
        printf '{"timestamp":"%s","host":"%s","event":"block","ip":"%s","rule":"LF_%s"}n' 
            "$TARIH" "$SUNUCU" "$IP" "$KURAL"
    fi
done

Bu tür bir dönüştürücü ile Elasticsearch’e veya Splunk’a veri besleyebilirsiniz.

Haftalık ve Aylık Raporlama Stratejisi

Tek seferlik loglar değil, trend analizi yapabilmek için düzenli raporlama şeması kurmanız gerekiyor:

  • Günlük: Önceki güne ait engelleme sayısı ve top 10 saldırı IP’si
  • Haftalık: Hangi servisler en çok hedef alındı, yeni kalıcı engellemeler
  • Aylık: Genel saldırı trendi, coğrafi dağılım, kural etkinliği analizi

Aylık rapor için geoip bilgisini de eklemek isterseniz:

# geoiplookup kurulu ise saldırı coğrafyasını analiz et
grep "Blocked" /var/log/lfd.log | 
  grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | 
  sort -u | 
  while read ip; do
    geoiplookup "$ip" 2>/dev/null | grep -oP 'GeoIP Country Edition: K.*'
  done | sort | uniq -c | sort -rn | head -20

Bu komut size saldırıların hangi ülkelerden geldiğini gösterir. Ülke bazlı engelleme kararları için bu veriler oldukça önemli. Eğer iş süreçlerinizde hiçbir zaman belirli bir ülkeyle ilişkiniz olmayacaksa ve o ülkeden sürekli saldırı geliyorsa, CSF’in CC_DENY özelliğiyle o ülkenin tüm IP bloklarını engelleyebilirsiniz.

Sonuç

CSF loglama ve raporlama konusu, firewall kurup “tamam korunuyorum” demekten çok daha derin bir konu. Logları düzgün yapılandırmak, düzenli analiz etmek ve anlamlı raporlar üretmek; güvenlik duruşunuzu gerçekten anlamanızı sağlar.

Özellikle şu noktalara odaklanmanızı öneririm: LFD e-posta uyarılarını mutlaka aktif tutun ama eşikleri makul ayarlayın, günlük log analiz script’lerinizi yazıp cron’a bağlayın, ve en az 30 günlük log saklama politikası uygulayın. Bir olay yaşandığında “log yoksa geçmiş yok” durumuna düşmemek için bu alışkanlığı erken edinmek çok önemli.

Log okumak başta sıkıcı gelir, ama zamanla bir sunucunun “nabzını tutmak” gibi bir his verir. Bir gün olağandışı bir örüntü fark ettiğinizde ve proaktif davranarak bir saldırıyı bertaraf ettiğinizde, bu alışkanlığın değerini çok net anlayacaksınız.

Yorum yapın