feat(bot-detector): add dynamic browser profiling engine with HDBSCAN clustering

Implement offline profile building (profile_builder.py) and real-time
dynamic scoring (browser_matcher_dynamic.py) using HDBSCAN-based browser
fingerprint clustering. Add ClickHouse materialized view (13_h2_profiling.sql)
for h2_profile_stats aggregation. Update thesis and project documentation
to cover the new dynamic profiling architecture.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jacquin Antoine
2026-04-13 02:06:00 +02:00
parent 64dada980f
commit c60ce97f23
9 changed files with 1325 additions and 23 deletions

View File

@ -1,6 +1,6 @@
# Bot Detector IA — Documentation Technique
> Architecture modulaire (11 modules) | Dernière mise à jour : 2025-07-15
> Architecture modulaire (16 modules) | Dernière mise à jour : 2026-04-13
---
@ -33,7 +33,12 @@ services/bot-detector/bot_detector/
├── log.py (65) # Journalisation structurée (structlog JSON)
├── infra.py (89) # Client ClickHouse, health check HTTP, arrêt propre
├── browser.py (170) # Détection multifactorielle 5 axes des navigateurs
├── scoring.py (279) # Validation, seuil adaptatif, SHAP, HDBSCAN, dérive
├── browser_matcher.py (498) # Scoring H2 statique à 7 dimensions pondérées
├── browser_signatures.py (166) # Signatures statiques Chrome/Firefox/Safari
├── browser_matcher_dynamic.py (387) # Scoring H2 dynamique temps réel (profils auto-appris)
├── profile_builder.py (614) # Profiling HDBSCAN hors-ligne, centroïdes, lifecycle
├── fleet.py (XXX) # Détection de flottes par graphes bipartis NetworkX
├── scoring.py (588) # Validation, seuil adaptatif, SHAP, HDBSCAN, dérive
├── models.py (478) # EIF (isotree), AutoEncoder (PyTorch), XGBoost, persistance
├── preprocessing.py (117) # Nettoyage, imputation, listes de features
├── pipeline.py (378) # run_semi_supervised_logic() — orchestrateur ML
@ -390,6 +395,83 @@ LEGITIMATE_BROWSER.
---
### 3.4b `browser_matcher.py` — Scoring H2 statique
**Rôle** : Scoring à 7 dimensions pondérées des sessions HTTP/2 contre des
signatures de navigateurs connues (Chrome, Firefox, Safari).
**Fonctions exportées** :
| Fonction | Description |
|----------|-------------|
| `run_browser_matcher(df)` | Score un batch de sessions, retourne `browser_match_chrome/firefox/safari/max` |
| `log_dual_mode_comparison(df)` | Compare les scores statique vs confiance browser |
**Dimensions de scoring** :
| Dimension | Poids | Signal |
|-----------|-------|--------|
| D1 SETTINGS H2 | 0.30 | Correspondance exacte des paramètres SETTINGS |
| D2 WINDOW_UPDATE | 0.15 | Valeur de WINDOW_UPDATE ± tolérance |
| D3 Pseudo-order | 0.15 | Ordre des pseudo-headers H2 |
| D4 PRIORITY frames | 0.10 | Présence de frames PRIORITY |
| D5 HTTP headers | 0.15 | Cohérence des headers HTTP |
| D6 TLS structure | 0.10 | Famille TLS (JA4) |
| D7 JA4 dict | 0.05 | Lookup dans le dictionnaire JA4 navigateurs |
**Dépendance** : `browser_signatures.py` (signatures statiques), `config.py` (`BROWSER_CONFIDENCE_THRESHOLD`).
---
### 3.4c `browser_matcher_dynamic.py` — Scoring H2 dynamique temps réel
**Rôle** : Scoring des sessions HTTP/2 contre les profils auto-appris (centroïdes HDBSCAN).
Remplace le dictionnaire statique pour l'adaptation automatique aux nouvelles versions de navigateurs.
**Fonctions exportées** :
| Fonction | Description |
|----------|-------------|
| `get_dynamic_matcher()` | Singleton du chargeur/scorer |
| `load_dynamic_profiles(client, force)` | Charge les profils depuis `auto_browser_profiles` (refresh 24h) |
| `score_session_dynamic(session)` | Score une session `(famille, score)` |
| `score_sessions_batch_dynamic(df)` | Score un batch (ajoute `dynamic_family`, `dynamic_score`) |
**Pipeline de scoring** :
1. Chargement des profils en mémoire depuis `ja4_processing.auto_browser_profiles`
2. Pour chaque session : rejet rapide (pseudo_order incompatible ou tolérance dépassée)
3. Similarité pondérée : `h2_window_update` (0.40), `pseudo_order` (0.40), `h2_initial_window_size` (0.10), `h2_has_priority` (0.10)
4. Confiance volumétrique : `min(1.0, log10(count_ips + 1) / 4)`
---
### 3.4d `profile_builder.py` — Profiling HDBSCAN hors-ligne
**Rôle** : Pipeline quotidien (cron) qui clusterise les sessions H2 similaires,
calcule les centroïdes, et gère le cycle de vie des profils dynamiques.
**Fonction exportée** :
| Fonction | Description |
|----------|-------------|
| `run_profile_builder(client)` | Pipeline complet : extraction HDBSCAN centroïdes fusion persistance lifecycle |
**Pipeline interne** :
1. `_fetch_profiling_data()` Lit `view_h2_profiling_raw`, déduplique par IP, limite 2M lignes
2. `_cluster_sessions()` HDBSCAN (`min_cluster_size=1000`) sur variables mixtes (StandardScaler + brut)
3. `_compute_centroids()` Moyenne + 3σ (tolérance) pour continues, mode pour catégorielles
4. `_label_family()` Analyse des UAs `Auto_Chrome`, `Auto_Firefox`, `Auto_Safari`, `Auto_Unknown`
5. `_merge_profiles()` Fusion des clusters redondants (même famille + pseudo_order + WU < 5%)
6. `_persist_profiles()` INSERT INTO `auto_browser_profiles` (ReplacingMergeTree)
7. `_update_last_seen()` Rafraîchit les profils actifs (IPs vues dans les dernières 24h)
8. `_purge_stale_profiles()` Supprime les profils > 14 jours
**CLI** : `python -m bot_detector.profile_builder`
---
### 3.5 `preprocessing.py` — Prétraitement des données
**Rôle** : Nettoyage des DataFrames et définition des listes de features.