HoneyTEA ile Sazan Avı V2 Yayında!

Herhangi bir web sunucusunun access log’una bakın. Her dakika düzinelerce istek: /wp-config.php, /phpmyadmin/, /.env, /c99.php… Bunların büyük çoğunluğu sizin sitenizle hiç ilgisi olmayan, otonom tarama araçlarından geliyor. Nmap, sqlmap, nikto, gobuster — bunlar birer insan tarafından yönetilmiyor; botlar dünya üzerindeki tüm IP aralıklarını sistematik olarak tarıyor ve bulduğu her açığı istismar etmeye çalışıyor.

Klasik çözüm iptables veya firewalld ile IP banlamak. Ama bu yöntem, Cloudflare arkasındaki bir sunucuda işe yaramaz. Çünkü sunucunuza gelen TCP bağlantısı Cloudflare’den geliyor. Gerçek saldırganın IP’sini kernel katmanında görmeniz imkânsız — o IP’yi zaten banlamış olsanız bile Cloudflare IP’si üzerinden trafik gelmeye devam eder.

honeyTEA tam bu boşluğu kapatmak için yazıldı. Web sunucusunun access log’unu okur, kötü niyetli istekleri tespit eder ve Cloudflare API’si üzerinden o IP’yi otomatik olarak banlar. Engelleme Cloudflare edge’inde gerçekleştiği için saldırgan sunucunuza hiç ulaşamaz.

Neden Yeni Versiyon?

honeyTEA v1, 2018 yılında yazdığım basit bir bash script’ti. Cloudflare’in Global API Key’ini kullanıyordum, /user/firewall/access_rules/rules endpoint’ine istek atıyor ve sadece URI düz string eşleşmesi yapıyordu. İşini görüyordu. Ancak hem güvenlik hem de işlevsellik açısından ciddi sınırları vardı.

En büyük sorun kimlik doğrulamaydı. Global API Key tüm Cloudflare hesabınıza tam erişim verir. Script’in çalıştığı sunucu ele geçirilseydi, saldırgan domain kayıtlarınızdan DNS ayarlarınıza kadar her şeyi değiştirebilirdi. v2’de bunu tamamen kaldırdım; artık yalnızca scoped Bearer Token kullanılıyor yani sadece Firewall Services ve Zone Read izinleriyle sınırlı.

Diğer büyük değişiklikler şunlar: URI’nin yanına User-Agent ve HTTP status kodu tabanlı pattern eşleme eklendi, tüm pattern’lar artık regex destekli. IPv6 tam destek geldi. whitelist.txt ile ofis IP’leri ve monitoring servisleri ban dışı bırakılabiliyor. --dry-run moduyla Cloudflare’e gerçek istek atmadan test yapılabiliyor. --json-log moduyla SIEM uyumlu JSON çıktısı alınabiliyor. bc ve jq bağımlılıkları kaldırıldı, artık sadece curl yeterli.

Nasıl Çalışır?

Script her çalıştığında line.dat dosyasından bir önceki çalışmada kaç satır okunduğunu öğrenir. Yeni satırları tail ile okur, her satırı parse eder: IP adresi, istek URI’si, HTTP durum kodu ve User-Agent ayrı ayrı çıkarılır. Sonra bu dört alan config.txt‘teki pattern’larla karşılaştırılır.

Eşleşme bulunursa IP önce whitelist.txt‘te aranır. Ofis IP’niz, monitoring servisleriniz veya Cloudflare health check IP’leri buradaysa ban atlanır. Yoksa blacklist.dat‘a zaman damgasıyla kaydedilir ve Cloudflare API’sine POST isteği gönderilir. Belirlenen süre (varsayılan 90 dakika) sonunda ban otomatik kaldırılır.

honeyTEA bir IDS değil. Alarm üretmez, sizi uyarmaz. Tespit ettiği anda Cloudflare’e gider ve IP’yi banlar. Maksimum 5 dakika sonra (cron ayarına göre) saldırgan Cloudflare’de duvarla karşılaşır.

Üç Katmanlı Pattern Sistemi

v2’nin en önemli yeniliklerinden biri config.txt formatının genişlemesi. Artık üç farklı prefix destekleniyor ve tüm pattern’lar Extended Regular Expression (ERE) formatında yazılabiliyor.

URI pattern’ları (prefix yok veya URI:) istek yolunu kontrol eder. /wp-config\.php yazarsanız yalnızca bu tam yolu yakalar, /wp-config yazarsanız varyantları da yakalar — bu yüzden regex’i ne kadar sıkı yazacağınızı düşünmeniz gerekir.

UA pattern’ları (UA: prefix) User-Agent header’ını kontrol eder ve büyük/küçük harf duyarsızdır. UA:sqlmap, UA:nikto gibi bilinen tarayıcı araçlarını veya UA:(\bscanner\b|\bcrawler\b) gibi regex ile daha geniş grupları yakalayabilirsiniz.

STATUS pattern’ları (STATUS: prefix) HTTP durum kodu eşleşmesi yapar. STATUS:404 aktif edilirse çok sayıda 404 üreten IP’ler banlanır. Dikkatli kullanın — meşru kullanıcılar da 404 alabilir. Bu pattern’ı tek başına değil, diğer pattern’larla birlikte kullanmanızı öneririm.

Beş Adımda Yayında

Kurulum kasıtlı olarak basit tutuldu. Dış bağımlılık olarak yalnızca curl gerekli — jq opsiyonel, yoksa grep/sed fallback’i devreye girer. Bash 4.0+ yeterli, tüm modern Linux dağıtımlarında varsayılan olarak mevcut.

Cloudflare API Token oluştururken dikkat edilmesi gereken nokta: Dashboard → My Profile → API Tokens → Create Token → Custom Token yolunu izleyin. İzinleri sadece Zone > Firewall Services > Edit ve Zone > Zone > Read ile sınırlandırın ve token’ı ilgili domain’e kısıtlayın. Global API Key kullanmayın.

Nginx Cloudflare Real-IP modülü kurulu değilse script Cloudflare’in IP’sini görür, gerçek saldırganın IP’sini değil. README’deki cloudflare-realip.conf bloğunu Nginx konfigürasyonunuza eklemeniz kritik — aksi halde tüm banlar boşa gider. Yapılandırmayı tamamladıktan sonra --dry-run moduyla test edin, log çıktısında beklediğiniz IP’lerin yakalandığını doğrulayın, sonra production’a alın.

SIEM Entegrasyonu ve Log Çıktısı

v2’nin önemli yeniliklerinden biri --json-log flag’i. Bu mod aktif edildiğinde her log satırı yapılandırılmış JSON formatında yazılır. Splunk, Wazuh, QRadar veya Elastic Stack’e kolayca beslenebilir; timestamp, severity ve mesaj alanları otomatik olarak ayrıştırılabilir hale gelir.

Splunk kullanıyorsanız Universal Forwarder ile /var/log/honeytea.log dosyasını izleyip sourcetype=_json olarak ingest edebilirsiniz. Wazuh’ta custom decoder yazmak yerine JSON log modunu aktif etmek çok daha temiz bir entegrasyon sağlar. Her ban ve unban olayı ayrı bir log satırı üretiyor; SIEM’de kural yazmak için yeterli alan mevcut.

Sınırlar ve Değerlendirme

honeyTEA bir tepkisel sistem. Saldırgan en az bir istek göndermeden banlanamaz. Bu istek sunucunuza ulaşır ve log’a düşer — sonra script çalışır ve banlar. Cron modunda bu pencere 5 dakika olabilir, daemon modunda 300 saniye. Bu süre zarfında saldırgan başka istekler de atabilir.

Cloudflare ücretsiz planında firewall access rule sınırı (5 kural) vardır. Aktif bir honeypot sunucusunda bu sınıra hızlı ulaşılabilir. Pro plan veya üstünde bu sınır 100’e çıkıyor. Bunu göz önünde bulundurarak BANNED_TIME değerini makul tutun; çok kısa süre seçerseniz aynı IP tekrar tekrar ban/unban döngüsüne girerek kural slotlarını tüketir.

Bu araç gerçek zamanlı IDS/IPS değildir. WAF yerine geçmez. DDoS koruması sağlamaz. Cloudflare’in kendi WAF ve Rate Limiting özellikleriyle birlikte, katmanlı bir güvenlik mimarisinin parçası olarak kullanılmalıdır.

Proje: github.com/teakolik/honeyTEA-V2

Buna rağmen, özellikle WordPress, Joomla veya Drupal kullanan ve Cloudflare arkasında çalışan sistemler için çok pratik bir araç. Yapılandırma dosyası doldurulduktan sonra bakım gerektirmiyor; süresi dolan banları kendisi kaldırıyor, log rotation’ı kendisi yönetiyor. Kod MIT lisansıyla açık kaynak olarak yayınlandı — katkı, fork ve pull request bekliyorum.

Yorum yapın