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 urlstatusuaBots vs humains
Heuristique UA : dĂ©tecte bots/crawlers/clients HTTP ânon browserâ.
bot_ratiotop bot ipstop human ipsScans & anomalies
Détecte patterns : WP, .env, .git, phpMyAdmin, traversal, etc + codes 429/502/504.
- 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.
/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.gz (pratique pour archives).Utilisation
Analyse basique
logdoctor analyze /var/log/nginx/access.log --top 30Analyse sur archive .gz
logdoctor analyze /var/log/nginx/access.log.1.gz --top 50Auto-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_commonFiltrer bots/humains
# seulement bots
logdoctor analyze access.log --bots
# seulement humains
logdoctor analyze access.log --humans--top 30pour voir les IP dominantes--botspour 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;