FailToBan: Unterschied zwischen den Versionen
Caesar (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Caesar (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
= 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ürbanip - Dienst-User mit Rechten für
fail2ban-client(häufig über sudoers oder Gruppe)