Files
schiwagoaandClaude Opus 5.5 d7dcd9d6b1 Initial version: npm-scanner image, filters, entrypoint, watcher, testbed
- Image based on crazymax/fail2ban:1.1.1 with inotify-tools
- Filters npm-scanner and npm-wplogin, tested with fail2ban-regex in the build
- jail.local generated from .env, optional npm-wplogin and recidive
- Watcher reloads the jails when NPM creates a new proxy host log
- check command, docs, testbed for LXC

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 20:41:08 +01:00

97 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Konfiguration
Alle Einstellungen stehen in der `.env` neben der `docker-compose.yaml`. Nach einer Änderung:
```bash
docker compose run --rm npm-scanner check
docker compose up -d
```
Die `jail.local` wird bei **jedem Start** neu aus der `.env` erzeugt.
## Variablen
### Allgemein
| Variable | Standard | Bedeutung |
|---|---|---|
| `NPM_SCANNER_VERSION` | `latest` | Image-Tag |
| `TZ` | `Europe/Vienna` | Zeitzone für Log-Zeitstempel |
| `F2B_LOG_LEVEL` | `INFO` | `CRITICAL`, `ERROR`, `WARNING`, `NOTICE`, `INFO`, `DEBUG` |
| `F2B_DB_PURGE_AGE` | `30d` | So lange bleiben alte Sperren in der DB – Grundlage für die steigende Sperrdauer und `recidive` |
| `NPM_LOG_DIR` | – (Pflicht) | Log-Ordner des NPM auf dem Host |
| `NPM_LOG_DIR2` | = `NPM_LOG_DIR` | Zweiter Log-Ordner (jlesage: `logs/`). Ist es derselbe Ordner wie `NPM_LOG_DIR`, wird er nur einmal gelesen. |
| `WHITELIST` | leer | IPs/Netze, die nie gesperrt werden, mit Leerzeichen getrennt. `127.0.0.1/8` und `::1` sind immer dabei. |
| `F2B_CHAIN` | `DOCKER-USER` | iptables-Kette für die Sperren |
| `ENABLE_NEWLOG_WATCH` | `true` | Neue Proxy-Hosts automatisch überwachen |
| `NEWLOG_SETTLE_SECONDS` | `5` | Wartezeit nach dem Erscheinen einer neuen Logdatei |
| `IPTABLES_MODE` | `auto` | Vom Basis-Image: `auto`, `legacy` (erzwingt iptables-legacy) |
Zeitangaben: Zahl mit Einheit `s`, `m`, `h`, `d`, `w` – zum Beispiel `10m`, `24h`, `4w`.
### npm-scanner (immer aktiv)
| Variable | Standard | Bedeutung |
|---|---|---|
| `SCANNER_MAXRETRY` | `3` | Treffer bis zur Sperre |
| `SCANNER_FINDTIME` | `1h` | Zeitfenster für die Treffer |
| `SCANNER_BANTIME` | `24h` | Erste Sperrdauer |
| `SCANNER_MAXTIME` | `4w` | Höchste Sperrdauer bei Wiederholung |
Gelesen werden `proxy-host-*_access.log`, `default-host_access.log`, `fallback_access.log` und
`fallback_http_access.log` in beiden Log-Ordnern.
### npm-wplogin (optional)
Zählt `POST` auf `wp-login.php` und `xmlrpc.php` auf allen Hosts hinter dem NPM.
| Variable | Standard |
|---|---|
| `ENABLE_WPLOGIN` | `false` |
| `WPLOGIN_MAXRETRY` | `5` |
| `WPLOGIN_FINDTIME` | `10m` |
| `WPLOGIN_BANTIME` | `24h` |
| `WPLOGIN_MAXTIME` | `4w` |
### recidive (optional)
Sperrt Wiederholungstäter über alle Jails in `INPUT` **und** `F2B_CHAIN`.
| Variable | Standard |
|---|---|
| `ENABLE_RECIDIVE` | `false` |
| `RECIDIVE_MAXRETRY` | `3` |
| `RECIDIVE_FINDTIME` | `1w` |
| `RECIDIVE_BANTIME` | `4w` |
Mit `recidive` schreibt fail2ban sein Log nach `./data/log/fail2ban.log` (recidive liest es).
`docker logs` zeigt es trotzdem weiter an.
## Eigene Jails, Filter und Actions
Der Ordner `./data` wird beim Start eingebunden:
| Ordner | Wirkung |
|---|---|
| `./data/jail.d/*.local` | Wird **nach** der erzeugten `jail.local` gelesen – eigene Jails oder Überschreibungen |
| `./data/filter.d/*.conf` | Eigene Filter. Gleichnamige Filter des Images werden ersetzt. |
| `./data/action.d/*.conf` | Eigene Actions, zum Beispiel für ntfy |
| `./data/db/` | fail2ban-Datenbank – nicht von Hand ändern |
Beispiel: Sperrdauer für npm-scanner auf 48 h, ohne die `.env` zu ändern:
```bash
nano ./data/jail.d/50-eigene.local
```
```ini
[npm-scanner]
bantime = 48h
```
```bash
docker compose restart npm-scanner
```
Die NPM-Logs liegen im Container unter `/logs/npm1` und `/logs/npm2`.