FailToBan: Unterschied zwischen den Versionen

Aus Autopoll-Dokumentation
Zur Navigation springen Zur Suche springen
Caesar (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Caesar (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
[[FailToBan]]
 
[[FailToBan|zur FailToBan-Doku]]
[[Autopoll/FailToBan]]
= FailToBan – Punktesystem und Abuse-Dienst =
= FailToBan – Punktesystem und Abuse-Dienst =
'''FailToBan''' ist die Autopoll-Vorstufe zu Fail2Ban: Apache-Access-Logs werden live ausgewertet, verdächtige Requests erhalten gewichtete '''Punkte''', und bei Überschreiten eines Schwellwerts im Zeitfenster folgt ein Ban – im Testmodus nur als Log (Dry-Run), im Live-Modus über <code>fail2ban-client</code>.
'''FailToBan''' ist die Autopoll-Vorstufe zu Fail2Ban: Apache-Access-Logs werden live ausgewertet, verdächtige Requests erhalten gewichtete '''Punkte''', und bei Überschreiten eines Schwellwerts im Zeitfenster folgt ein Ban – im Testmodus nur als Log (Dry-Run), im Live-Modus über <code>fail2ban-client</code>.

Aktuelle Version vom 4. November 2026, 22:47 Uhr

FailToBan – Punktesystem und Abuse-Dienst

FailToBan ist die Autopoll-Vorstufe zu Fail2Ban: Apache-Access-Logs werden live ausgewertet, verdächtige Requests erhalten gewichtete Punkte, und bei Überschreiten eines Schwellwerts im Zeitfenster folgt ein Ban – im Testmodus nur als Log (Dry-Run), im Live-Modus über fail2ban-client. Diese Seite beschreibt Aufbau, Konfiguration und Verwendung.

Kurzinfo Wert
Projektverzeichnis ~/work/FailToBan (bzw. Deploy-Pfad)
Sprache Python 3 (Standardbibliothek, kein externes Paket nötig)
Default-Modus test (Dry-Run)
Ban-Schwellwert ≥ 40 Punkte / 15 Minuten
Get-DoS ≥ 75 Requests ohne Referer / 5 Minuten (außerhalb App)
Live-Jail autopoll-httpd-score

Idee und Abgrenzung

Warum Punkte statt nur maxretry?

Klassische Fail2Ban-Jails zählen Treffer einer Filter-Regex. FailToBan bewertet Schwere unterschiedlich:

  • Path-Traversal / LFI kostet mehr als ein einzelner 404.
  • Partner-Clients (Indy Library) und App-Pfade (/apon/, /apserver/, …) werden geschont.
  • Länderpolitik kann bei Abuse aus Nicht-EU-Ländern den Score auf Ban-Niveau anheben.

Zwei Ebenen

Komponente Rolle
Python-Dienst (scripts/daemon.py) Tailt Logs, scored, entscheidet Ban, ruft Backend
Fail2Ban (optional / Live) Führt den eigentlichen Firewall-Ban aus (banip)
Klassische Filter/Jails unter fail2ban/ Optional parallel (maxretry-Modell), nicht zwingend für den Score-Dienst

Im Live-Betrieb ist Fail2Ban die Ausführungsschicht; die Entscheidung trifft der Score-Daemon.

Verzeichnisstruktur

FailToBan/
├── config/
│   ├── service.json      # Modus, Logs, Scoring, Action, Daemon
│   ├── ips.json          # Whitelist / Partner / Test-Angreifer-Pool
│   └── countries.json    # Allow-/Denylist Länder
├── scripts/
│   ├── daemon.py         # Hauptdienst (tail + score + ban)
│   ├── score_engine.py   # Regeln, Parsing, Sliding-Window
│   ├── ban_backend.py    # dry_run | fail2ban
│   ├── config_loader.py  # Lädt service.json + ips.json
│   ├── countries.py      # Länderpolitik
│   ├── geo.py            # Geo-Cache / Lookup (Simulation)
│   ├── simulate.py       # Offline-Auswertung historischer Logs
│   ├── test_traffic.py   # Synthetischer Traffic → access.log
│   ├── testenv_generate.py / testenv_run.py
│   └── scharfschaltung.sh
├── fail2ban/
│   ├── filter.d/         # Regex-Filter (optional)
│   └── jail.d/           # Jail-Beispiele
├── systemd/
│   └── autopoll-f2b.service
├── testenv/
│   ├── scenarios.json
│   └── generated/        # erzeugte Logs / expected_bans (nicht versioniert)
├── logs/                 # Test-Access-Logs (Inhalt gitignored)
├── data/                 # Runtime: bans, state, status, geo_cache, activity
├── docs/
│   └── FailToBan.mediawiki
├── requirements.txt
├── .gitignore
└── README.md

Nicht versioniert (siehe .gitignore): .venv/, Inhalt von logs/ und Runtime-Dateien unter data/ (JSON/Logs), testenv/generated/.

Architektur (Datenfluss)

 Apache access.log (Combined / optional VHost-Prefix)
              │
              ▼
     LogTailer (Rotation/Inode)
              │
              ▼
     parse_line → score_request / get_dos
              │
              ├─ ignoreip / partner_ips / private → verwerfen
              ├─ Länderpolitik + Geo-Cache → ggf. Punkte anheben
              ▼
     Sliding Window (Punkte / 15 min)
     + DoS-Fenster (Count / 5 min)
              │
              ▼  Score ≥ Threshold
     BanBackend
       ├─ test: DryRun → data/bans.log + service_state.json
       └─ live: fail2ban-client set <jail> banip <ip>
                (+ Mirror nach bans.log)

Installation und Umgebung

Python-venv

<source lang="bash"> cd ~/work/FailToBan python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt # derzeit keine externen Pakete </source> Ohne Activate: <source lang="bash"> .venv/bin/python scripts/daemon.py --mode test </source>

Systemvoraussetzungen Live

  • Python 3.10+ (entwickelt/getestet mit 3.13)
  • Leserechte auf Apache-Access-Logs
  • Fail2Ban installiert und Jail autopoll-httpd-score (oder konfigurierter Name) aktiv bzw. erreichbar für banip
  • Dienst-User mit Rechten für fail2ban-client (häufig über sudoers oder Gruppe)

Konfiguration

Übersicht der Config-Dateien