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:
@ -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.
|
||||
|
||||
Reference in New Issue
Block a user