Suricata IDS/IPS — wykrywanie i blokowanie ataków na VPS
Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo
Firewall (UFW, iptables) blokuje porty, ale nie rozumie zawartości pakietów. Suricata to wielowątkowy silnik IDS/IPS, który analizuje ruch sieciowy na poziomie warstwy aplikacji — wykrywa ataki SQLi, XSS, skanowanie portów, exploity, malware C2 i tysiące innych zagrożeń na podstawie sygnatury. W trybie IDS generuje alerty; w trybie IPS inline (NFQUEUE) blokuje złośliwe pakiety zanim dotrą do aplikacji. Ten artykuł przeprowadza przez instalację na Ubuntu, konfigurację reguł Emerging Threats, integrację z Filebeat i tuning false-positive.
Instalacja Suricata na Ubuntu
# Oficjalne PPA Suricaty (zawsze aktualne) sudo add-apt-repository ppa:oisf/suricata-stable -y sudo apt update && sudo apt install suricata suricata-update -y # Sprawdz wersje suricata --version # Domyslny interfejs sieciowy ip link show # Najczesciej: eth0, ens3, ens18 — sprawdz na swoim VPS # Ustaw interfejs w konfiguracji sudo nano /etc/suricata/suricata.yaml # Znajdz sekcje: # af-packet: # - interface: eth0 # <-- zmien na swoj interfejs # Test konfiguracji sudo suricata -T -c /etc/suricata/suricata.yaml
Reguły Emerging Threats — instalacja i aktualizacja
Emerging Threats (ET Open) to najpopularniejszy bezpłatny zestaw reguł IDS. Suricata-update automatyzuje pobieranie i zarządzanie zestawami reguł. Poniżej kompletna konfiguracja z harmonogramem aktualizacji:
# Pobierz liste dostepnych zestawow regul sudo suricata-update list-sources # Wlacz ET Open (bezplatny) sudo suricata-update enable-source et/open # Opcjonalnie: OISF Traffic ID sudo suricata-update enable-source oisf/trafficid # Zaktualizuj reguly sudo suricata-update # Sprawdz ile regul zostalo zaladowanych sudo suricata-update --no-merge 2>&1 | grep "Total" # Przykladowy output: # Total: 45000 rules, 41200 enabled, 3800 disabled # Automatyczna aktualizacja (cron - codziennie o 02:00) echo "0 2 * * * root /usr/bin/suricata-update && /usr/bin/systemctl reload suricata" \ | sudo tee /etc/cron.d/suricata-update # Uruchom Suricata sudo systemctl enable --now suricata sudo systemctl status suricata
Tryb IPS inline — NFQUEUE dla blokowania ataków
W trybie IDS Suricata jest pasywna — tylko obserwuje i loguje. Tryb IPS (inline) przez NFQUEUE umożliwia aktywne blokowanie. Każdy pakiet przechodzi przez kolejkę netfilter, gdzie Suricata decyduje czy go przepuścić czy odrzucić. Konfiguracja wymaga zmian w iptables i pliku konfiguracyjnym:
# Krok 1: Skonfiguruj iptables NFQUEUE sudo iptables -I FORWARD -j NFQUEUE --queue-num 0 sudo iptables -I INPUT -j NFQUEUE --queue-num 0 sudo iptables -I OUTPUT -j NFQUEUE --queue-num 0 # Zachowaj reguly iptables po restarcie sudo apt install iptables-persistent -y sudo netfilter-persistent save # Krok 2: Wlacz tryb NFQUEUE w suricata.yaml # Edytuj /etc/suricata/suricata.yaml: # # nfq: # mode: accept # domyslna akcja = accept # failed-open: yes # jesli Suricata jest przeciazona - przepusc # # Uruchom Suricata w trybie NFQUEUE sudo suricata -c /etc/suricata/suricata.yaml -q 0 # Lub jako systemd service z NFQUEUE # Edytuj /etc/default/suricata: # LISTENMODE=nfqueue # NFQUEUE=0 sudo systemctl restart suricata # Zweryfikuj ze Suricata blokuje (test): # Wyslij request z curl - powinna byc odpowiedz 200 # Sprawdz logi: sudo tail -f /var/log/suricata/fast.log
Analiza logów — EVE JSON i fast.log
Suricata generuje dwa główne pliki logów: fast.log (czytelny dla człowieka, jeden
alert per linia) i eve.json (pełny JSON z metadanymi — preferowany do integracji
z SIEM). Poniżej komendy do analizy alertów:
# Biezace alerty (czytelny format)
sudo tail -f /var/log/suricata/fast.log
# Przykladowy alert:
# 04/10/2026-14:23:01 [**] [1:2027865:4] ET SCAN Potential SSH Scan [**]
# [Classification: Attempted Information Leak] [Priority: 2]
# {TCP} 192.0.2.100:54321 -> 10.0.0.1:22
# Analiza eve.json (wymagany jq)
sudo apt install jq -y
# Ostatnie 10 alertow z IP i signatura
sudo tail -n 100 /var/log/suricata/eve.json | \
jq -r 'select(.event_type == "alert") |
"\(.timestamp) \(.src_ip) -> \(.dest_ip) [\(.alert.signature)]"'
# Top 10 atakujacych IP
sudo cat /var/log/suricata/eve.json | \
jq -r 'select(.event_type == "alert") | .src_ip' | \
sort | uniq -c | sort -rn | head -10
# Alerty konkretnej kategorii (np. skanowanie)
sudo cat /var/log/suricata/eve.json | \
jq 'select(.event_type == "alert" and
(.alert.category | test("Scan"; "i")))' | \
jq -r '"\(.timestamp) \(.src_ip) \(.alert.signature)"' Integracja z Filebeat i ELK Stack
EVE JSON jest formatem natywnie obsługiwanym przez Filebeat. Moduł suricata automatycznie parsuje logi i wysyła je do Elasticsearch lub Logstash. Poniżej minimalna konfiguracja:
# Zainstaluj Filebeat (jezeli masz ELK Stack) curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.12.0-amd64.deb sudo dpkg -i filebeat-8.12.0-amd64.deb # Wlacz modul Suricata sudo filebeat modules enable suricata # Sprawdz domyslna konfiguracje modulu cat /etc/filebeat/modules.d/suricata.yml # Skonfiguruj output do Elasticsearch # /etc/filebeat/filebeat.yml: # output.elasticsearch: # hosts: ["https://your-elk:9200"] # username: "elastic" # password: "HASLO" # Zainstaluj dashboardy (Kibana musi byc dostepna) sudo filebeat setup --dashboards \ -E setup.kibana.host=your-kibana:5601 # Uruchom Filebeat sudo systemctl enable --now filebeat # Sprawdz czy logi plyna sudo filebeat test output
Tuning reguł — eliminacja false-positive
Domyślnie ET Open zawiera dziesiątki tysięcy reguł — część wygeneruje false-positive dla typowego serwera webowego. Poniżej techniki dostosowania reguł przez suricata-update:
# Plik modyfikacji regul: /etc/suricata/disable.conf # Wylaczy regule po SID (ID reguły) # Znajdz SID z fast.log: [1:2027865:4] -> SID = 2027865 # Przykladowy /etc/suricata/disable.conf: # 2027865 # False positive: legitymny SSH admin # 2210051 # False positive: scanner naszego Uptime Robot # Plik /etc/suricata/threshold.conf - ograniczenie alertow: # suppress gen_id 1, sig_id 2027865, track by_src, ip 203.0.113.10 # Powyzsze: ignoruj alerty SSH z konkretnego IP admina # Wylaczy cale kategorie regul: sudo nano /etc/suricata/enable.conf # Dodaj: group:emerging-policy # itp. # Lub przez suricata-update CLI: sudo suricata-update add-conf /etc/suricata/disable.conf sudo suricata-update add-conf /etc/suricata/threshold.conf sudo suricata-update sudo systemctl reload suricata # Przetestuj konfiguracje sudo suricata -T -c /etc/suricata/suricata.yaml -v
Suricata vs Snort — porównanie
| Cecha | Suricata 7.x | Snort 3.x |
|---|---|---|
| Wielowątkowość | Natywna (od v1) | Tak (od Snort 3) |
| Inspekcja protokołów | HTTP/TLS/DNS/SSH/SMB i inne | HTTP/TLS i inne (mniej) |
| Format logów | EVE JSON (gotowy do SIEM) | Unified2 (wymaga konwersji) |
| Tryb IPS | NFQUEUE, AF_PACKET inline | NFQUEUE, IPFW |
| Reguły ET Open | Natywnie kompatybilne | Natywnie kompatybilne |
| Lua skrypty | Tak | Tak (Lua w regułach) |
| Społeczność | Rosnąca, aktywna | Większa, dłuższa historia |
| Rekomendacja | Nowe wdrożenia, multi-thread | Środowiska z istniejącą inf. |