CrowdSec Kurulumu: Saldiri Tespit ve Otomatik Banlama
En sık yapılan hata kurulumun ilk gününde yaşanıyor: apt ile crowdsec paketini kuruyorsunuz, servis çalışıyor, cscli metrics logları gösteriyor, her şey yolunda görünüyor. Saldırgan gelmeye devam ediyor. Sebebi basit, CrowdSec motoru sadece tespit yapar. Engelleme işi bouncer denilen ayrı bileşene düşer ve bouncer kurulmadıysa panelde saldırganları izlersiniz, kapı da açık kalır. Resmi dokümantasyon bunu açıkça söylüyor: Security Engine tek başına bir detection motorudur, hiçbir şey bloke etmez.
Fail2ban ile arasındaki fark
Fail2ban 2004 yılından beri aynı mantıkla çalışıyor: logu izle, kural dışı davranış gör, IP adresini firewall kara listesine at. Tek makine için bu hâlâ işe yarar. Sorun şu; her makine sadece kendi logunu görüyor ve saldırgan size ulaşmadan önce kimseyi rahatsız etmemiş olabiliyor. CrowdSec aynı logu okuyor ama tespit ettiği saldırganı anonimleştirip merkezi APIye gönderiyor. Karşılığında dünyanın dört bir yanındaki düğümlerin bildirdiği saldırgan IPlerini içeren topluluk kara listesini çekiyor. Bir botnet Avrupa tarafında SSH taraması başlattığında, sizin sunucunuz o adrese daha ilk paketinden önce kara listede hazır bekliyor.
Kara listeye girmek de kolay değil. Aynı IP, farklı otonom sistemlerden bağımsız bildirilmeli. Bu mekanizma hem yanlış pozitifleri hem de listeyi bilerek kirletme girişimlerini engelliyor.
Performans tarafında fark teknik: Fail2ban banladığı her IP için iptables kuralı ekliyor, binlerce kural birikince paket işleme yavaşlıyor. CrowdSec tarafında nftables set yapısı devrede, hash tablosuna on binlerce IP girmesi paket hızını etkilemiyor.
Üç parçalı mimari
İşin içinde üç isim var. Log Processor logları okuyup scenario denilen davranış kurallarıyla eşleştiriyor; aynı IP kısa pencere içinde 5 başarısız SSH denemesi yaparsa kova taşıyor ve alert üretiliyor. Local API yani LAPI bu alertleri alıp kararı üretiyor, varsayılan hareket 4 saatlik ban. Bouncer da LAPIye belirli aralıklarla bağlanıp aktif kararları çekiyor ve nftables, ipset ya da pf tarafında uyguluyor.
Tek sunucuda Log Processor ile LAPI aynı süreçte çalışıyor, kurulum hissi Fail2ban kadar kolay. Ayrışmanın anlamı ölçeklenince ortaya çıkıyor: on makinenin motoru tek LAPIye rapor verebilir, ban kararları hepsine aynı anda dağıtılır. Ya da tespit log toplayıcı makinede çalışır, engelleme edge firewall üstündeki bouncerda yapılır.
Debian ve Ubuntu kurulumu
Dağıtım depolarındaki sürüme güvenmeyin. Debian depoları CrowdSeci 1.4.6 sürümünde dondurmuş durumda, bu sürüm yıllarca geride kalmış tespit içerikleriyle geliyor. Resmi depo eklemek için:
curl -s https://install.crowdsec.net | sudo sh
sudo apt update
sudo apt install -y crowdsec
sudo systemctl status crowdsec
sudo cscli version Kurulum sırasında motor yaygın log kaynaklarını kendisi algılıyor; /var/log/auth.log ve journald dahil. Yani SSH tespiti ekstra ayar istemeden çalışır durumda.
Sıra bouncerda. Ubuntu 24.04 tarafında firewall altyapısı nftables olduğu için nftables paketi kurulmalı:
sudo apt install -y crowdsec-firewall-bouncer-nftables
sudo cscli bouncers list Eski kurulumlarda ya da hâlâ legacy iptables kullanan yapılarda iptables paketi tercih edilir: crowdsec-firewall-bouncer-iptables. Bouncer kurulumda kendini LAPIye otomatik kaydediyor, listede FirewallBouncer önekiyle valid durumda görünmeli. Bouncer kendi nftables tablosunu oluşturuyor, UFW kurallarınıza dokunmuyor; UFW kapatmanız gerekmiyor.
Collection kavramı
CrowdSec tespit içeriğini collection adı verilen paketlerle dağıtıyor; her collection parser ve scenario kombinasyonu. SSH için temel paket çoğu kurulumda hazır geliyor. Nginx çalıştırıyorsanız:
sudo cscli collections install crowdsecurity/nginx
sudo systemctl reload crowdsec Web sunucu collectionı kurduktan sonra CrowdSece log yerini söylemek gerekiyor. /etc/crowdsec/acquis.yaml dosyasına eklenecek blok:
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx Sadece journald loglayan minimal imajlarda dosya yolu yerine journalctl kaynağı kullanılıyor; acquis.d altındaki YAMLda source: journalctl ve _SYSTEMD_UNIT filtresiyle ssh servisi bağlanabiliyor. Hub içeriği de güncel kalmalı, yoksa yeni scenario zinciri kaçıyor:
sudo cscli hub update
sudo cscli hub upgrade
sudo systemctl reload crowdsec Test etmeden önce kendi IPnizi koruyun
Bu adımı atlamayın. Firewall bouncer network seviyesinde düşürdüğü için ban yediğinizde SSH hiç çalışmıyor, düzeltmek için bağlanıp karar silmek de mümkün olmuyor. Test sırasında ikinci bir SSH oturumu açık tutun; tamamen dışarda kalırsanız kurtarma sağlayıcının web konsolundan gelir.
Whitelist pipelineın erken aşamasında uygulanıyor, listeye giren IP hiç decision üretilmemiş sayılıyor. /etc/crowdsec/parsers/s02-enrich/mywhitelists.yaml dosyası:
name: crowdsecurity/whitelists
description: "Whitelist trusted source IPs"
whitelist:
reason: "trusted admin IPs"
ip:
- "203.0.113.10"
cidr:
- "198.51.100.0/24" Ev IPniz dinamikse VPN aralığınızı ekleyin ya da konsol güven ağına yaslanın. Dahili ağlar için 192.168.0.0/16 ve 10.0.0.0/8 bloklarını da eklemek standart pratik.
Zinciri baştan sona denemek
Gerçek saldırgan beklemeye gerek yok, manuel karar ile tüm zincir test edilir:
sudo cscli decisions add --ip 192.0.2.123 --duration 4m --reason "manual test"
sudo cscli decisions list
sudo nft list table ip crowdsec | grep 192.0.2.123
sudo cscli decisions delete --ip 192.0.2.123 nft çıktısında test IPsinin görünmesi motor, LAPI ve bouncer arasındaki konuşmanın tamam olduğunu kanıtlıyor. Bir de gerçek tetiklenme görmek isterseniz başka bir makineden SSH şifresini birkaç kez yanlış girin; alerts list ve decisions list çıktılarında o adresi görürsünüz.
Sık karşılaşılan iki arıza: alert listesinde saldırgan var ama engellenmiyor, bouncer ya hiç kurulu değil ya da çalışmıyor. Diğeri, metrics çıktısında SSH için parsed satırı sıfır; log yolu ya da kaynak tipi yanlış, acquis.yaml kontrol edilmeli. nft tablosu boşsa bouncer paketi firewall altyapınızla uyuşmuyordur, nftables ve iptables paketleri yer değiştirmeli.
Topluluk kara listesi aktif mi
Motor kurulduğunda anonim bir makine kaydıyla merkezi APIye bağlanıyor ve otomatik olarak topluluk kara listesini çekiyor. Kontrol tek komut:
sudo cscli capi status Kayıt görünüyorsa ekstra yapılandırma yok. Ücretsiz web konsolu isterseniz app.crowdsec.net üzerinden hesap açıp cscli console enroll komutuyla sunucuyu kaydediyorsunuz; dashboard, alert zaman çizelgesi ve çoklu sunucu yönetimi geliyor. Gönderilen veri saldırı sinyaliyle sınırlı, trafik logunuz gitmiyor.
Docker tarafında dikkat edilecek iki nokta
Konteyner kurulumunda /var/lib/crowdsec/data dizini volume olarak bağlanmalı, 1.7.0 sürümünden beri bu zorunlu ve bağlanmazsa konteyner başlamayı reddediyor. LAPI 8080 portunda dinliyor, yalnız 127.0.0.1 arayüzüne publish etmek yeterli; bouncer localhost üstünden bağlanır. Bouncer ise host tarafında kalmalı, konteyner içinde çalıştırmak NET_ADMIN yetkisi ve host network gerektiriyor, uğraşmaya değmiyor.
Web uygulamanız varsa bouncer seçimi değişir
Firewall bouncer SSH, veritabanı ve SMTP gibi altyapı servisleri için doğru seçim. Web uygulaması koruyorsanız nginx, Traefik, OpenResty ya da HAProxy için yazılmış uygulama katmanı bouncerları daha uygun; HTTP seviyesinde inceleme yapıp sert engel yerine CAPTCHA döndürebiliyorlar. İkisi birlikte de çalışıyor, network seviyesinde firewall bouncer, HTTP seviyesinde uygulama bouncerı.
Günlük izlenecek komutlar
sudo cscli metrics # kaç satır log okundu, hangi scenario tetiklendi
sudo cscli alerts list # son alertler
sudo cscli decisions list # şu an banlı adresler
sudo cscli machines list # motor durumu, kalp atışı Bir IPyi kalıcı olarak temizlemek istediğinizde decisions delete, manuel müdahalede decisions add kullanılır. Hub güncellemesini haftalık cronla bağlamak yeterli; motorun kendisi normal apt upgrade akışıyla güncelleniyor.
CrowdSec kurmak 20 dakika sürüyor, RAM maliyeti 100 MB altında. Anahtar noktalar üç: resmi depodan kurulum, bouncerı atlama, testten önce whitelist. Gerisini topluluk kara listesi ve scenario güncellemeleri hallediyor.