Services: - ja4sentinel: TLS/JA4 fingerprint capture daemon (Go, libpcap) - logcorrelator: JA4 log correlation engine (Go, ClickHouse) - mod_reqin_log: Apache module (C, JSON request logging) - bot_detector: ML bot detection pipeline (Python) - dashboard: FastAPI/Streamlit analytics UI (Python) Shared libraries: - shared/go/ja4common: logger, config, shutdown, ipfilter (Go module) - shared/python/ja4_common: ClickHouseClient, ClickHouseSettings (Python package) - shared/clickhouse/: canonical SQL migrations (10 files) Build & packaging: - Unified 3-stage Dockerfile.package for Go RPMs (el8/el9/el10) - go.work workspace linking sentinel, correlator, ja4common - Makefile with test-all, build-all, rpm-* targets Fixes applied: - go.work: 1.21 → 1.24.6 (required by sentinel) - correlator Dockerfiles: golang:1.21 → golang:1.24 - replace directives in go.mod for ja4common local path - pyproject.toml: setuptools.backends → setuptools.build_meta - Removed static libpcap linking (unavailable on Rocky 9) - Fixed data races in output/writers_test.go (sync.Mutex + atomic.Int32) - Rewrote corrupted test files (logger_test.go × 2) Test coverage: - correlator: 67.1% total (unixsocket 80.5%, config 91.7%, app 83.3%, multi 87.7%, stdout 100%) - sentinel: all 10 packages pass (api, capture, config, fingerprint, ipfilter, logging, output, tlsparse) Documentation: - README.md + docs/ (architecture, development, 5 services, shared libs, DB schema & migrations) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
7.1 KiB
7.1 KiB
Audit SOC du dashboard
Résumé exécutif
Le dashboard est riche fonctionnellement (incidents, investigation IP/JA4, threat intel), mais pas prêt pour un usage SOC en production sans durcissement.
Points majeurs :
- Sécurité d’accès insuffisante : pas d’authentification/RBAC.
- Navigation incohérente : plusieurs liens pointent vers des routes inexistantes.
- Traçabilité/audit partielle : journalisation contournable et parfois “success” même en échec.
- Organisation UX perfectible pour un triage SOC rapide (priorisation, workflow, “next actions”).
Périmètre audité
- Frontend React (
frontend/src/App.tsx+ composants de navigation et investigation). - Backend FastAPI (
backend/main.py+ routesincidents,audit,entities,analysis,detections,reputation). - Documentation projet (
README.md).
Cartographie des pages et navigation
Routes front déclarées
/→IncidentsView/threat-intel→ThreatIntelView/detections→DetectionsList/detections/:type/:value→DetailsView/investigation/:ip→InvestigationView/investigation/ja4/:ja4→JA4InvestigationView/entities/subnet/:subnet→SubnetInvestigation/entities/:type/:value→EntityInvestigationView/tools/correlation-graph/:ip→CorrelationGraph/tools/timeline/:ip?→InteractiveTimeline
Graphe de navigation (pages)
flowchart LR
A["/ (Incidents)"] --> B["/investigation/:ip"]
A --> C["/entities/subnet/:subnet"]
A --> X["/bulk-classify?ips=... (route absente)"]
A --> T["/threat-intel"]
D["/detections"] --> E["/detections/:type/:value"]
D --> B
E --> B
E --> F["/investigation/ja4/:ja4"]
C --> B
C --> G["/entities/ip/:ip"]
G --> B
G --> F
F --> B
B --> H["/tools/correlation-graph/:ip"]
B --> I["/tools/timeline/:ip?"]
Q["QuickSearch (global + local)"] --> Y["/investigate/... (route absente)"]
Q --> Z["/incidents?threat_level=CRITICAL (route absente)"]
Incohérences de navigation identifiées
QuickSearchnavigue vers/investigate/...et/incidents...mais ces routes n’existent pas.IncidentsViewenvoie vers/bulk-classify?...sans route déclarée.DetectionsListutilisewindow.location.href(rechargement complet) au lieu du router.- Navigation top-level limitée à 2 entrées (“Incidents”, “Threat Intel”), alors que “Détections” est une vue centrale SOC.
- Usage de
window.location.pathnamedansApp.tsxpour récupérer:ipsur certaines routes outils (fragile, non idiomatique React Router).
Constat sécurité / robustesse (usage SOC)
Critique
-
Absence d’authentification et de RBAC (confirmé aussi dans le README “usage local”).
- Impact SOC : impossible d’attribuer correctement les actions analyste, risque d’accès non maîtrisé.
-
Injection potentielle dans
entities.py:- Construction d’un
IN (...)SQL par concaténation de valeurs (ip_values), non paramétrée. - Impact : surface d’injection côté backend.
- Construction d’un
-
Audit log non fiable :
/api/audit/logsaccepte unuserfourni par la requête (defaultsoc_user).- En cas d’échec d’insert audit, le code retourne quand même
status: success. - Impact : non-répudiation faible, traçabilité compromise.
Élevé
-
Rate limiting non appliqué :
- Variable
RATE_LIMIT_PER_MINUTEexiste mais pas de middleware effectif. - Impact : exposition aux abus/DoS et scraping massif.
- Variable
-
Fuite d’erreurs internes :
- Plusieurs endpoints retournent
detail=f"Erreur: {str(e)}". - Impact : divulgation d’informations techniques.
- Plusieurs endpoints retournent
Moyen
- Dépendance externe réputation IP (
ip-apien HTTP +ipinfo) sans contrôle de résilience avancé (fallback opérationnel limité). - Composants avec
console.error/console.logen production front. - Endpoints incidents partiellement “mockés” (
Implementation en cours) pouvant tromper l’analyste.
Format des pages : ce qu’il faut améliorer
1) Priorisation SOC visuelle
- Uniformiser les conventions de sévérité (couleur, wording, position).
- Ajouter un bandeau “Incidents nécessitant action immédiate” en haut de
/. - Afficher systématiquement : niveau, confiance, impact, dernière activité, action recommandée.
2) Densité et lisibilité
- Réduire l’usage d’emojis non essentiels dans les zones de décision.
- Passer les tableaux volumineux en mode “triage” :
- colonnes par défaut minimales,
- tri par criticité/recence,
- tags compacts avec tooltip.
3) Workflow analyste explicite
- Introduire des CTA standardisés :
Investiguer,Escalader,Classer,Créer IOC,Exporter.
- Ajouter une timeline d’actions SOC (qui a fait quoi, quand, pourquoi) directement sur les vues incident/investigation.
4) Accessibilité opérationnelle
- Raccourcis clavier cohérents (navigation, filtres, next incident).
- État vide explicite + actions suggérées.
- Breadcrumb homogène entre toutes les vues.
Organisation de l’information : recommandations
IA) Repenser l’IA de navigation (menu)
Proposition de structure :
- Triage
- Incidents (par défaut)
- Détections
- Investigation
- Recherche entité
- Vue IP
- Vue JA4
- Subnet
- Knowledge
- Threat Intel
- Tags/Patterns
- Administration
- Audit logs
- Santé plateforme
IB) Normaliser les routes
- Remplacer les routes mortes (
/investigate,/incidents,/bulk-classifynon déclaré) par des routes existantes ou les implémenter. - Éviter
window.location.*dans les composants routés. - Centraliser les chemins dans un module unique (ex:
routes.ts) pour éviter les divergences.
IC) Standardiser le modèle de page
Chaque page SOC devrait avoir la même ossature :
- Contexte (titre + périmètre + horodatage).
- KPIs critiques.
- Tableau principal de triage.
- Panneau actions.
- Journal d’activité lié à la page.
Plan d’amélioration priorisé
Phase 1 (bloquant prod SOC)
- Ajouter auth SSO/OIDC + RBAC (viewer/analyst/admin).
- Corriger routes mortes et navigation cassée.
- Corriger requête SQL non paramétrée dans
entities.py. - Fiabiliser audit log (identité dérivée de l’auth, échec explicite si log non écrit).
Phase 2 (fiabilité)
- Mettre en place rate limiting effectif.
- Assainir gestion d’erreurs (messages utilisateurs + logs serveurs structurés).
- Retirer
window.location.hrefet unifier navigation SPA.
Phase 3 (UX SOC)
- Refonte “triage-first” des écrans (priorité, next action, temps de traitement).
- Uniformiser design tokens et hiérarchie visuelle.
- Ajouter vues “queue analyste” et “handover” (passation de quart).
Verdict
Le socle est prometteur pour l’investigation technique, mais pour un SOC opérationnel il faut d’abord :
- Sécuriser l’accès et la traçabilité.
- Fiabiliser la navigation et les routes.
- Recentrer les pages sur le flux de triage SOC.
Sans ces corrections, le risque principal est une dette opérationnelle (temps perdu en triage) et une dette de conformité (auditabilité insuffisante).