feat: port v14 schema fixes, migration, MV verifier, thesis from ja4/

deploy_views.sql (v13 → v14):
- CRITICAL: ml_detected_anomalies ORDER BY (src_ip) → (src_ip, ja4, host, model_name)
  ReplacingMergeTree was collapsing all detections to 1 row per IP on merge
- Add PARTITION BY toDate + ttl_only_drop_parts on all 4 data tables
- ml_all_scores TTL 3d → 7d; ml_detected_anomalies TTL 30d → 7d
- agg_host_ip_ja4_1h + agg_header_fingerprint_1h: add partition + TTL 7d
- view_ip_recurrence: add WHERE detected_at >= now() - 7 DAY (was full scan)
- Remove dead views: summary/timeseries/threat_dist/variability
- Add view_dashboard_entities (fixes HTTP 500 in clustering/incidents/fingerprints)
- Add view_dashboard_user_agents (fixes HTTP 500 in fingerprints/metrics)
- Add view_ai_features_24h (enables ENABLE_MULTIWINDOW in bot_detector)
- Mark max_requests_per_sec as DEPRECATED (always 0)

New files:
- correlator/sql/migrations/01_ttl_adjustments.sql: ALTER TABLE migration
- tests/integration/verify_mvs.py: MV pipeline verification assertions
- docs/THESIS_HTTP_Traffic_Detection.md: detection techniques thesis

All DB references use ja4_processing/ja4_logs (no mabase_prod).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
toto
2026-04-07 23:51:56 +02:00
parent ecceb04174
commit 51b8eb57a8
4 changed files with 1151 additions and 67 deletions

View File

@ -0,0 +1,93 @@
-- =============================================================================
-- 01_ttl_adjustments.sql — Ajustement des TTL de rétention des logs
--
-- Objectif :
-- - http_logs : conserver 30 jours (était 7 jours)
-- - http_logs_raw : supprimer au plus vite (2 heures, était 1 jour)
--
-- Usage (déploiements existants) :
-- clickhouse-client --multiquery < sql/migrations/01_ttl_adjustments.sql
--
-- IMPORTANT — http_logs_raw (partition) :
-- La modification du TTL ci-dessous s'applique immédiatement aux nouvelles
-- insertions. Toutefois, la PARTITION BY (toDate → toStartOfHour) ne peut
-- PAS être modifiée via ALTER TABLE — elle est fixée à la création.
--
-- Pour adopter la partition horaire sur un déploiement existant, procéder
-- manuellement :
-- 1. CREATE TABLE ja4_logs.http_logs_raw_new ( ... identique à init.sql ... )
-- 2. Attendre que http_logs_raw soit vide (ou accepter la perte des raw non traités)
-- 3. DROP VIEW IF EXISTS ja4_logs.mv_http_logs
-- 4. DROP TABLE ja4_logs.http_logs_raw
-- 5. RENAME TABLE ja4_logs.http_logs_raw_new TO ja4_logs.http_logs_raw
-- 6. Recréer mv_http_logs (cf. init.sql)
--
-- Si la migration complète n'est pas possible, la modification du TTL seul
-- (ci-dessous) ramène la suppression à : fin de la partition quotidienne + 2h,
-- soit au plus 26h au lieu de 48h — amélioration immédiate sans downtime.
-- =============================================================================
-- -----------------------------------------------------------------------------
-- 1. http_logs — rétention étendue à 30 jours
-- -----------------------------------------------------------------------------
ALTER TABLE ja4_logs.http_logs
MODIFY TTL log_date + INTERVAL 30 DAY;
-- -----------------------------------------------------------------------------
-- 2. http_logs_raw — TTL réduit à 2 heures
-- (la MV traite les données de façon synchrone à l'INSERT, donc les raw
-- sont redondants dès leur insertion)
-- -----------------------------------------------------------------------------
ALTER TABLE ja4_logs.http_logs_raw
MODIFY TTL ingest_time + INTERVAL 2 HOUR;
-- -----------------------------------------------------------------------------
-- Vérifications post-migration
-- -----------------------------------------------------------------------------
-- SELECT engine_full FROM system.tables
-- WHERE database IN ('ja4_logs', 'ja4_processing') AND name IN ('http_logs', 'http_logs_raw');
-- =============================================================================
-- Ajustements TTL des tables de MVs (bot_detector) — 7 jours max
-- =============================================================================
-- agg_host_ip_ja4_1h — TTL 7 jours (était : aucun)
-- Note : PARTITION BY ne peut pas être ajouté via ALTER TABLE.
-- Pour la partition quotidienne (recommandée), recréer la table via deploy_views.sql.
-- Sans partition explicite, ClickHouse applique le TTL par granule (moins efficace).
ALTER TABLE ja4_processing.agg_host_ip_ja4_1h
MODIFY TTL window_start + INTERVAL 7 DAY;
-- agg_header_fingerprint_1h — TTL 7 jours (était : aucun)
ALTER TABLE ja4_processing.agg_header_fingerprint_1h
MODIFY TTL window_start + INTERVAL 7 DAY;
-- ml_detected_anomalies — CRITIQUE : corriger ORDER BY (était (src_ip), causait une
-- déduplication agressive — une seule ligne conservée par IP au lieu de src_ip+ja4+host+model)
-- Note : ALTER TABLE ... MODIFY ORDER BY nécessite ClickHouse >= 22.6
-- Si la version est antérieure, recréer la table via deploy_views.sql.
ALTER TABLE ja4_processing.ml_detected_anomalies
MODIFY ORDER BY (src_ip, ja4, host, model_name);
-- ml_detected_anomalies — TTL 7 jours (était 30 jours, déjà corrigé en 7j pour certains)
ALTER TABLE ja4_processing.ml_detected_anomalies
MODIFY TTL detected_at + INTERVAL 7 DAY;
-- ml_all_scores — TTL 7 jours (était 3 jours)
-- Note : PARTITION BY ne peut pas être ajouté via ALTER TABLE.
-- Pour la partition quotidienne (recommandée), recréer la table via deploy_views.sql.
ALTER TABLE ja4_processing.ml_all_scores
MODIFY TTL window_start + INTERVAL 7 DAY;
-- =============================================================================
-- Vues dashboard — suppression des vues inutilisées, ajout des vues manquantes
-- Ces vues n'ont pas d'état persistant : les DROP/CREATE sont idempotents.
-- =============================================================================
-- Supprimer les vues inutilisées (non référencées par les routes Python)
DROP VIEW IF EXISTS ja4_processing.view_dashboard_summary;
DROP VIEW IF EXISTS ja4_processing.view_dashboard_timeseries;
DROP VIEW IF EXISTS ja4_processing.view_dashboard_threat_dist;
DROP VIEW IF EXISTS ja4_processing.view_dashboard_variability;
-- Les nouvelles vues (view_dashboard_entities, view_dashboard_user_agents,
-- view_ai_features_24h) sont créées par deploy_views.sql (section finale).
-- Les exécuter ici revient à rejouer cette section de deploy_views.sql.