Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

Toolbox Dev — Ideo-Lab

LogDoctor — Analyse NGINX access logs (bots, scans, anomalies)

Analyse un access.log (ou .gz) et génÚre un rapport : top IP/URL/UA, bots vs humains, patterns de scan (/.env, /.git, WP, phpmyadmin), anomalies (429/499/502/504) et suggestions Nginx.

v0.1.0  ‱  NGINX access log

Pourquoi LogDoctor ?

Quand un serveur est “polluĂ©â€ (flood, scans, bots, scraping), on finit souvent avec : grep | awk | sort | uniq -c pendant des heures. LogDoctor automatise cette analyse et produit un rapport exploitable.

Top talkers

Top IP, Top URL, Top status, Top User-Agents (la base pour comprendre qui fait quoi).

top iptop urlstatusua

Bots vs humains

Heuristique UA : dĂ©tecte bots/crawlers/clients HTTP “non browser”.

bot_ratiotop bot ipstop human ips

Scans & anomalies

Détecte patterns : WP, .env, .git, phpMyAdmin, traversal, etc + codes 429/502/504.

patterns429502/504
Objectif : en 30 secondes tu sais :
  • quelles IP dominent
  • quelles URLs sont ciblĂ©es
  • si tu es en train de subir un scan “classique”
  • quoi bloquer (IP / endpoints / rate-limit)

Installation (.whl)

LogDoctor est livré en wheel. Une fois installé, tu as la commande logdoctor.

Télécharger le Wheel (logdoctor v0.1.0)

/static/toolbox/logdoctor-0.1.0-py3-none-any.whl

# venv activé
pip install /chemin/local/logdoctor-0.1.0-py3-none-any.whl

# aide
logdoctor --help
Tip : LogDoctor supporte aussi les logs compressés .gz (pratique pour archives).

Utilisation

Analyse basique

logdoctor analyze /var/log/nginx/access.log --top 30

Analyse sur archive .gz

logdoctor analyze /var/log/nginx/access.log.1.gz --top 50

Auto-détection / forcer le format

Par dĂ©faut --format auto tente “combined” puis “common”. Si tu as un format spĂ©cifique, force :

logdoctor analyze access.log --format nginx_combined
logdoctor analyze access.log --format nginx_common

Filtrer bots/humains

# seulement bots
logdoctor analyze access.log --bots

# seulement humains
logdoctor analyze access.log --humans
Usage typique incident :
  • --top 30 pour voir les IP dominantes
  • --bots pour isoler le bruit
  • puis blocage / rate-limit ciblĂ©

Sorties console & export JSON

Exemple de rapport (console)

======================================================================================
LogDoctor Report — /var/log/nginx/access.log
======================================================================================
Total lines  : 120000
Parsed lines : 119850
Parse errors : 150

--- Top IPs (top 10) ---
   14500  176.42.242.18
   13210  176.42.242.19
    9800  34.132.237.237
    ...

--- Suspicious patterns ---
    2500  env_leak   examples: /.env, /.env.backup
    1400  wp_scan    examples: /wp-login.php, /xmlrpc.php

--- Suggestions ---
* IP(s) potentiellement abusives (Ă  bloquer / rate-limit)
  - 34.132.237.237 hits=9800 susp=120 4xx=900 429=0 paths: /.env, /wp-login.php, /.git/
  nginx:
    deny 34.132.237.237;

* Bloquer endpoints de scans les plus courants (WP/.env/.git/phpmyadmin)
  nginx:
    location ~* ^/(wp-admin|wp-login\.php|xmlrpc\.php) { return 444; }
    location ~* ^/\.env { return 444; }
    location ~* ^/\.git/ { return 444; }
    location ~* ^/(phpmyadmin|pma)/ { return 444; }

Export JSON

Le JSON permet d’alimenter un dashboard (NetGuard / admin tool) ou une base SQL. Tu rĂ©cupĂšres : top_ips, top_urls, top_user_agents, patterns, anomalies, suggestions.

logdoctor analyze access.log --json report.json
{
  "file": "access.log",
  "total_lines": 120000,
  "parsed_lines": 119850,
  "top_ips": [{"key":"34.132.237.237","count":9800}, ...],
  "patterns": [{"pattern":"env_leak","count":2500,"examples":["/.env", ...]}],
  "suggestions": [{"type":"block_ips","nginx_snippet":"deny ..."}]
}

Hardening (actions concrĂštes)

1) Bloquer endpoints de scan

# NGINX (exemple)
location ~* ^/(wp-admin|wp-login\.php|xmlrpc\.php) { return 444; }
location ~* ^/\.env { return 444; }
location ~* ^/\.git/ { return 444; }

2) Rate-limit propre (limiter l’app, pas /static)

limit_req_zone $binary_remote_addr zone=app_zone:10m rate=5r/s;

location / {
  limit_req zone=app_zone burst=20 nodelay;
  proxy_pass http://django_upstream;
}

location /static/ {
  expires 30d;
  access_log off;
}

3) Bloquer des IP (deny)

LogDoctor te propose une liste d’IP candidates (score hits+susp+4xx).

deny 34.132.237.237;
deny 176.42.242.18;
V2 possible : clustering par ranges (x.x.x.*), GeoIP/ASN, et génération nftables/iptables. (TrÚs aligné avec ton projet NetGuard.)