Automatisch IP’s blokkeren op basis van access‑logs

Een praktische workflow om logstatistieken te verzamelen en misbruik te blokkeren via UFW.

Waarom dit nodig is

In productie zien we vaak grote hoeveelheden verkeer naar /accounts/-paden zoals login, signup en social login. Dit zijn typische doelen voor bots, scraping of brute‑force activiteiten. Door verkeer te analyseren en IP’s met opvallend veel requests te blokkeren, beperk je overbelasting en beveilig je de site beter.

Stap 1 — Logstatistieken opslaan

We parsen eerst het access‑log en schrijven per datum een JSON‑database. URL’s worden genormaliseerd (alles na ? of # wordt verwijderd), zodat statistieken generiek blijven.

python3 log_stats.py parse --log /var/log/apache2/vindazo_fr_access.log --db log_stats.json

Meerdere logfiles?

python3 log_stats.py parse --log /pad/naar/log1.log --log /pad/naar/log2.log --db log_stats.json

Stap 2 — Statistieken bekijken

Bekijk per datum de meest opgevraagde URL’s en de top IP’s. Standaard worden static assets zoals .css en .js gefilterd.

python3 log_stats.py report --db log_stats.json --date 2026-02-01 --top-urls 20 --top-ips 20

Onder elke IP zie je nu ook de top‑URL’s voor die IP. Wil je meer of minder?

python3 log_stats.py report --db log_stats.json --date 2026-02-01 --top-ips 20 --per-ip-urls 5

Static assets toch meenemen?

python3 log_stats.py report --db log_stats.json --date 2026-02-01 --include-static

Stap 3 — IP’s blokkeren die /accounts/ misbruiken

Met de verzamelde statistieken blokkeren we IP’s die heel veel requests naar /accounts/ doen. Dit is meestal een sterke indicatie van geautomatiseerd verkeer.

Dry‑run (alleen tonen)

python2 block_accounts_abuse.py --db log_stats.json --date 2026-02-01 --min-requests 200 --dry-run

Direct blokkeren via UFW

python2 block_accounts_abuse.py --db log_stats.json --date 2026-02-01 --min-requests 200

De geblokkeerde IP’s worden bijgehouden in blocked_accounts_ips.txt om dubbele regels te vermijden.

Python 2 of Python 3?

Zowel Python 3 als Python 2 worden ondersteund. Voor Python 2 gebruik je log_stats_py2.py.

python2 log_stats_py2.py parse --log /var/log/apache2/vindazo_fr_access.log --db log_stats.json
python2 log_stats_py2.py report --db log_stats.json --date 2026-02-01

Samengevat

  • Parse logs en bouw per‑dag statistieken op.
  • Bekijk top‑URL’s en top‑IPs met per‑IP URL‑details.
  • Blokkeer automatisch IP’s die abnormaal veel /accounts/ requests doen.

Deze workflow werkt snel, is herhaalbaar en helpt om bot‑verkeer te beperken zonder echte gebruikers te blokkeren. https://github.com/OnlineSolutionsGroupBV/DropIPsByCountry

Comments