CSF Login Failure Daemon (LFD) Yapılandırması ve Yönetimi

Sunucunuzu yönetirken en çok zaman harcadığınız konulardan biri güvenlik olaylarına tepki vermektir. Birisi SSH’a brute force deniyor, biri web uygulamanızın login sayfasına hammer atıyor, bir diğeri FTP’ye düzinelerce yanlış parola gönderip duruyor. CSF’nin LFD bileşeni tam bu noktada devreye giriyor ve bu saldırıları otomatik olarak tespit edip engelliyor. Bu yazıda LFD’yi gerçek dünya senaryolarıyla nasıl yapılandıracağınızı, ince ayar yapacağınızı ve izleyeceğinizi ele alacağız.

LFD Nedir ve Nasıl Çalışır?

LFD (Login Failure Daemon), CSF’nin bir parçası olarak çalışan ve sistem log dosyalarını gerçek zamanlı olarak izleyen bir daemon’dır. Temel mantığı şudur: belirli bir zaman dilimi içinde tanımladığınız eşik değerini aşan başarısız giriş denemelerini tespit ettiğinde, ilgili IP adresini otomatik olarak engeller.

LFD şu log dosyalarını izler:

  • /var/log/secure veya /var/log/auth.log (SSH, su, sudo girişimleri)
  • /var/log/maillog (SMTP kimlik doğrulama hataları)
  • /var/log/exim_mainlog (Exim mail sunucusu)
  • /var/log/proftpd/auth.log (ProFTPD giriş hataları)
  • /var/log/vsftpd.log (vsftpd giriş hataları)
  • /var/log/httpd/error_log (Apache kimlik doğrulama hataları)
  • /var/log/messages (Genel sistem mesajları)

Daemon bu dosyaları sürekli okuyarak regex kalıplarıyla eşleşen başarısız giriş denemelerini sayar. Sayı belirlenen eşiği geçtiğinde iptables kuralı eklenir ve opsiyonel olarak e-posta bildirimi gönderilir.

Temel LFD Parametreleri

LFD yapılandırması /etc/csf/csf.conf dosyasında bulunur. En kritik parametrelerle başlayalım.

# Temel LFD parametrelerini görüntüleme
grep -E "^LF_" /etc/csf/csf.conf | head -40

Temel Eşik Değerleri:

  • LF_TRIGGER: LFD’yi aktif/pasif yapar. 1 açık, 0 kapalı
  • LF_TRIGGER_PERM: Engellemenin kalıcı mı geçici mi olacağını belirler. 1 = kalıcı engel, 0 = geçici engel
  • LF_INTERVAL: Başarısız giriş denemelerinin sayıldığı zaman penceresi (saniye cinsinden)
  • LF_BLOCK_TIME: Geçici engellemelerde süre (saniye cinsinden). LF_TRIGGER_PERM = 0 ise geçerli

Servis Bazlı Eşik Değerleri:

  • LF_SSHD: SSH için başarısız giriş sayısı eşiği
  • LF_FTPD: FTP için başarısız giriş sayısı eşiği
  • LF_SMTPAUTH: SMTP kimlik doğrulama eşiği
  • LF_POP3D: POP3 eşiği
  • LF_IMAPD: IMAP eşiği
  • LF_HTACCESS: .htaccess ile korunan dizinlere erişim eşiği
  • LF_MODSEC: ModSecurity kuralı tetikleme eşiği
  • LF_CPANEL: cPanel giriş eşiği (cPanel sunucularda)

Temel LFD Yapılandırması

Şimdi gerçek bir sunucu için uygulanabilir temel yapılandırmayı görelim:

# /etc/csf/csf.conf dosyasını düzenle
nano /etc/csf/csf.conf

Aşağıdaki değerleri ihtiyacınıza göre ayarlayın:

# LFD aktif
LF_TRIGGER = 1

# Zaman penceresi: 300 saniye (5 dakika) içinde
LF_INTERVAL = 300

# Geçici engel kullan (kalıcı engel için 1 yap)
LF_TRIGGER_PERM = 0

# Geçici engel süresi: 3600 saniye (1 saat)
LF_BLOCK_TIME = 3600

# SSH: 5 dakika içinde 5 başarısız denemede engelle
LF_SSHD = 5
LF_SSHD_PERM = 1

# FTP: 5 dakika içinde 10 başarısız denemede engelle
LF_FTPD = 10
LF_FTPD_PERM = 0

# SMTP Auth: 5 başarısız denemede engelle
LF_SMTPAUTH = 5
LF_SMTPAUTH_PERM = 1

# POP3: 10 başarısız denemede engelle
LF_POP3D = 10
LF_POP3D_PERM = 0

# IMAP: 10 başarısız denemede engelle
LF_IMAPD = 10
LF_IMAPD_PERM = 0

# cPanel girişi
LF_CPANEL = 5
LF_CPANEL_PERM = 1

Yapılandırmayı uygulamak için:

# CSF'yi yeniden başlat
csf -r

# LFD servisini yeniden başlat
service lfd restart

# Servislerin durumunu kontrol et
service lfd status
service csf status

E-posta Bildirimleri Yapılandırması

LFD’nin en değerli özelliklerinden biri, engelleme işlemlerini e-posta ile bildirmesidir. Bu sayede gece 3’te uyumaya çalışırken sunucunuza ne olduğunu sabah uyandığınızda görürsünüz.

# E-posta bildirim ayarları
LF_ALERT_TO = "[email protected]"
LF_ALERT_FROM = "csf@sunucuadınız.com"

# Her engelleme için bildirim gönder
LF_EMAIL_ALERT = 1

# Engellemeden önce e-posta gönder (ön uyarı)
LF_EMAIL_PREALERT = 0

# Engel kaldırıldığında bildirim gönder
LF_UNBLOCKALERT = 1

# Portarama tespitinde bildirim
PS_EMAIL_ALERT = 1

Yoğun saldırı dönemlerinde e-posta kutunuzun dolmaması için bildirim limitlemesi yapabilirsiniz:

# Maksimum e-posta bildirimi sayısı (saatlik)
LF_EMAIL_ALERT_MAX = 100

# Aynı IP için tekrar bildirim gecikme süresi (saniye)
LF_EMAIL_ALERT_DELAY = 300

Whitelist ve Ignore Listeleri

LFD yapılandırmasının en kritik parçalarından biri, kendi IP adreslerinizin veya güvendiğiniz sistemlerin yanlışlıkla engellenmemesini sağlamaktır. Bu konuda bir kez acı çektikten sonra bu adımı asla atlamıyorsunuz.

# Whitelist dosyasını düzenle - bu IP'ler asla engellenmez
nano /etc/csf/csf.allow

# Örnek içerik:
# Ofis IP adresi
203.0.113.10 # Ofis sabit IP

# VPN sunucusu
198.51.100.5 # Şirket VPN

# Monitoring sunucusu
192.0.2.20 # Zabbix/Nagios sunucusu

# CIDR notasyonuyla tüm alt ağ
10.0.0.0/8 # İç ağ

LFD’nin görmezden geleceği IP’ler için ayrı bir dosya var:

# Ignore listesini düzenle
nano /etc/csf/csf.ignore

# Bu dosyadaki IP'ler LFD tarafından analiz edilmez
# Yüksek trafikli monitoring sistemleri için ideal

Belirli kullanıcı adlarını da ignore listesine ekleyebilirsiniz:

# Kullanıcı adı ignore listesi
nano /etc/csf/csf.ignoreu

# Örnek:
# Bu kullanıcıların başarısız girişleri sayılmaz
monitoring_user
backup_user

Gelişmiş LFD Özellikleri

Port Tarama Tespiti

LFD sadece giriş denemelerini değil, port taramalarını da tespit edebilir:

# Port tarama tespiti aktif
PS = 1

# Kaç saniyede kaç porta erişim port taraması sayılır
PS_INTERVAL = 300
PS_LIMIT = 10

# Engel türü (0 = geçici, 1 = kalıcı)
PS_PERM = 1

# Kalıcı engel ise süre
PS_BLOCK_TIME = 86400

# Hangi portlar tarama sayılmasın (açık portlar)
PS_PORTS = 0:65535
PS_PERMANENT = 1

Bağlantı Limitleri (Connection Tracking)

Aynı IP’den gelen aşırı bağlantıları da sınırlandırabilirsiniz:

# Bağlantı takibi aktif
CT_LIMIT = 300

# Kaç saniyede bir kontrol
CT_INTERVAL = 30

# Belirli portları hariç tut
CT_PORTS = 80,443

# Engelleme süresi
CT_BLOCK_TIME = 1800
CT_PERM = 0

Ülke Bazlı Engelleme

Belirli ülkelerden gelen bağlantıları tamamen engelleyebilirsiniz. Bu özellik için GeoIP veritabanına ihtiyacınız var:

# Ülke engelleme için gerekli ayar
CC_DENY = "CN,RU,KP,IR"

# Sadece belirli ülkelere izin ver
CC_ALLOW = "TR,DE,US,GB"

# Belirli portlar için ülke kısıtlaması
CC_ALLOW_PORTS = "TR;22,21"
CC_DENY_PORTS = "CN;22,21,25"

Gerçek Dünya Senaryosu 1: E-Ticaret Sunucusu

Diyelim ki yoğun SSH saldırılarına maruz kalan bir e-ticaret sunucunuz var. Hem web trafiğini kesintisiz tutmak hem de saldırıları engellemek istiyorsunuz:

# E-ticaret sunucusu için optimize LFD ayarları

# SSH için çok sıkı
LF_SSHD = 3
LF_SSHD_PERM = 1

# Web brute force koruması
LF_HTACCESS = 3
LF_HTACCESS_PERM = 1

# ModSecurity entegrasyonu
LF_MODSEC = 5
LF_MODSEC_PERM = 0
LF_MODSEC_BLOCK_TIME = 86400

# XMLRPC brute force (WordPress için kritik)
LF_XMLRPC = 1

# Ödeme sistemleri için gelen IP'leri whitelist'e al
# PayTR, iyzico, vb. IP aralıkları csf.allow'a eklenmeli

Bu yapılandırmadan sonra CSF’yi yeniden yükleyin:

csf -r && service lfd restart

# Aktif engelleri kontrol et
csf -l

# Geçici engelleri kontrol et
csf -lt

Gerçek Dünya Senaryosu 2: Mail Sunucusu Koruması

Mail sunucuları SMTP auth brute force saldırılarına çok maruz kalır. Bir spam botnet’in sunucunuzu relay olarak kullanmaya çalıştığını düşünün:

# Mail sunucusu güvenlik ayarları
LF_SMTPAUTH = 3
LF_SMTPAUTH_PERM = 1

LF_POP3D = 5
LF_POP3D_PERM = 0
LF_POP3D_BLOCK_TIME = 3600

LF_IMAPD = 5
LF_IMAPD_PERM = 0
LF_IMAPD_BLOCK_TIME = 3600

# Relay denemeleri için
LF_RELAY = 5
LF_RELAY_PERM = 1

# Spam score bazlı engelleme
LF_SCRIPT_ALERT = 10

Mail sunucusu loglarını manuel kontrol etmek için:

# Son engellenen IP'leri ve nedenlerini göster
grep "lfd|csf" /var/log/messages | grep "BLOCK" | tail -50

# Belirli bir IP'nin neden engellendiğini araştır
grep "192.168.1.100" /var/log/messages | tail -20

# Anlık bağlantıları izle
watch -n 5 "netstat -an | grep :25 | wc -l"

LFD Log Analizi ve İzleme

Sistem yöneticisinin vazgeçilmez rutini olan log analizini LFD için nasıl yapacağımıza bakalım:

# LFD tarafından engellenen IP'lerin listesi
csf -l | grep "DENY"

# Geçici engellenen IP'ler
csf -lt

# Belirli bir IP'yi manuel engelle
csf -d 1.2.3.4 "Manuel engelleme - brute force"

# Engeli kaldır
csf -dr 1.2.3.4

# IP hakkında bilgi al
csf -g 1.2.3.4

# Tüm engelleri temizle (dikkatli kullanın!)
csf -tf

Otomatik log analizi için bir script hazırlayalım:

#!/bin/bash
# lfd_report.sh - Günlük LFD raporu oluşturucu

REPORT_FILE="/tmp/lfd_daily_report.txt"
DATE=$(date '+%Y-%m-%d')
MAIL_TO="[email protected]"

echo "LFD Günlük Güvenlik Raporu - $DATE" > $REPORT_FILE
echo "==========================================" >> $REPORT_FILE
echo "" >> $REPORT_FILE

# Toplam engelleme sayısı
TOTAL_BLOCKS=$(grep "$(date '+%b %e')" /var/log/messages | grep "lfd" | grep -c "BLOCK")
echo "Toplam Engelleme: $TOTAL_BLOCKS" >> $REPORT_FILE
echo "" >> $REPORT_FILE

# En çok engellenen top 10 IP
echo "En Fazla Engellenen IP'ler:" >> $REPORT_FILE
grep "$(date '+%b %e')" /var/log/messages | grep "lfd" | grep "BLOCK" | 
    awk '{print $NF}' | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE

echo "" >> $REPORT_FILE

# Engelleme nedenlerinin dağılımı
echo "Engelleme Nedenleri:" >> $REPORT_FILE
grep "$(date '+%b %e')" /var/log/messages | grep "lfd" | grep "BLOCK" | 
    grep -oP "(?<=()[^)]*" | sort | uniq -c | sort -rn >> $REPORT_FILE

# Raporu e-posta ile gönder
mail -s "LFD Günlük Rapor - $DATE" $MAIL_TO < $REPORT_FILE

echo "Rapor oluşturuldu ve gönderildi: $REPORT_FILE"

Bu scripti cron ile çalıştırın:

# Her sabah 07:00'de rapor gönder
echo "0 7 * * * root /usr/local/bin/lfd_report.sh" >> /etc/crontab
chmod +x /usr/local/bin/lfd_report.sh

Özel LFD Regex Kuralları

LFD’nin varsayılan log kalıpları çoğu durumu kapsar, ancak özel uygulamalarınız için kendi regex kurallarınızı tanımlayabilirsiniz.

# Özel regex dosyasını düzenle
nano /etc/csf/regex.custom.pm

Örnek bir WordPress login brute force için özel kural:

# WordPress XML-RPC ve wp-login.php için özel kural
# Şu satırı regex.custom.pm dosyasına ekleyin:

if (($globlogs{CUSTOM1_LOG}) and (my ($ip) = $line =~ /[client (S+):d+].*xmlrpc.php.*returned 403/)) {
    return ("xmlrpc brute force", $ip, $config{LF_CUSTOMTRIGGER}, "CUSTOM1", $config{LF_CUSTOMTRIGGER_PERM});
}

Bu özel kuralın çalışması için csf.conf’a ekleyin:

# Özel log dosyası tanımı
CUSTOM1_LOG = "/var/log/httpd/access_log"

# Özel tetikleyici eşiği
LF_CUSTOMTRIGGER = 10
LF_CUSTOMTRIGGER_PERM = 0
LF_CUSTOMTRIGGER_BLOCK_TIME = 7200

Performans İpuçları ve Sık Yapılan Hatalar

LFD’yi yapılandırırken sık karşılaşılan sorunlar ve çözümleri:

Sorun 1: LFD kendi monitoring IP’nizi engelliyor

Bu en klasik hatadır. Zabbix veya Nagios sunucunuz sürekli portları kontrol ettiğinden port tarama olarak algılanabilir. Çözüm:

# Monitoring IP'sini csf.allow'a ekle
echo "192.0.2.20 # Zabbix Monitoring" >> /etc/csf/csf.allow

# Alternatif olarak csf.ignore'a ekle
echo "192.0.2.20" >> /etc/csf/csf.ignore

csf -r

Sorun 2: Çok agresif ayarlar meşru kullanıcıları engelliyor

Özellikle şifrelerini unutup birkaç kez deneyen müşterilerinizi engellemek istemezsiniz:

# Daha toleranslı ama yine de güvenli ayarlar
LF_SSHD = 10
LF_INTERVAL = 600
LF_BLOCK_TIME = 1800
LF_TRIGGER_PERM = 0

Sorun 3: LFD çok fazla CPU kullanıyor

Yoğun trafikli sunucularda LFD log okuma nedeniyle CPU spike yapabilir:

# LFD kontrol aralığını artır
LF_DAEMON_SLEEP = 5

# Log rotasyonu yapıldığından emin ol
ls -la /var/log/secure*
logrotate -f /etc/logrotate.d/syslog

Sorun 4: Engellenen IP’yi acil kaldırma

# IP engelini hemen kaldır
csf -dr 203.0.113.50

# Tüm geçici engelleri kaldır
csf -tf

# LFD yeniden başlat
service lfd restart

LFD Test Prosedürü

Yapılandırdıktan sonra LFD’nin doğru çalıştığını test etmek önemli:

# Test modu - gerçekten engellemeden simüle et
# csf.conf'ta:
TESTING = 1

# Test bitince tekrar 0 yap:
TESTING = 0

SSH testini farklı bir IP’den yapın:

# Test için yanlış şifre denemeleri (dikkat: kendi sunucunuzda yapın)
for i in {1..6}; do
    ssh wronguser@sunucu_ip "test" 2>/dev/null
    echo "Deneme $i tamamlandı"
    sleep 2
done

# Sonra log'u kontrol et
tail -f /var/log/messages | grep lfd

LFD Durumunu İzleme Dashboard’u

Günlük olarak kontrol etmeniz gereken komutlar:

#!/bin/bash
# lfd_status.sh - Hızlı durum kontrolü

echo "=== CSF/LFD DURUM RAPORU ==="
echo "Tarih: $(date)"
echo ""

echo "--- Aktif Kalıcı Engeller ---"
csf -l | grep "DENY" | wc -l
echo " IP kalıcı olarak engelli"

echo ""
echo "--- Aktif Geçici Engeller ---"
csf -lt 2>/dev/null | wc -l
echo " IP geçici olarak engelli"

echo ""
echo "--- Son 1 Saatteki Engelleme Olayları ---"
grep "$(date '+%b %e %H')" /var/log/messages | grep lfd | grep -c BLOCK 2>/dev/null
echo " engelleme son 1 saatte"

echo ""
echo "--- LFD Servisi Durumu ---"
service lfd status | grep Active

echo ""
echo "--- Yüksek Bağlantılı IP'ler ---"
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -5

Sonuç

LFD, doğru yapılandırıldığında sunucu güvenliğinizin en güçlü katmanlarından birini oluşturur. Ancak “her şeyi engelle” zihniyetiyle yaklaşmak yerine dengeli bir yapılandırma tercih etmeniz gerekir.

Unutmayın ki çok agresif ayarlar meşru kullanıcılarınızı engellerken, çok toleranslı ayarlar gerçek saldırıları kaçırır. Bu dengeyi bulmak için sunucunuzun log geçmişini analiz edin, hangi servislerin hangi saldırılara maruz kaldığını anlayın ve eşik değerlerinizi buna göre kurgulayın.

En kritik adımlar şunlardır: kendi IP adresinizi ve güvendiğiniz sistemleri mutlaka whitelist’e ekleyin, e-posta bildirimlerini aktif edin ve düzenli log analizi yapın. LFD bir “kur ve unut” aracı değil, aktif olarak izlenmesi gereken bir güvenlik katmanıdır.

Yapılandırmanızı tamamladıktan sonra test etmeyi, logları düzenli incelemeyi ve gerektiğinde ince ayar yapmayı alışkanlık haline getirin. Güvenlik, sürekli devam eden bir süreçtir.

Yorum yapın