InfraGuard

Détections + jeux de règles de séquence JA3

L’écran phare de la détection — présente les moteurs de détection (Kitsune, srct, nginx, JA3) et déduit des jeux de règles d’anomalie à partir des séquences JA3 grâce à une heuristique déterministe (infr_sec_ruleset).

Aperçu — ce que fait cet écran

Security ▸ Detections (/security/detections) est l’écran phare de la détection d’InfraGuard. Il réunit trois choses sur une seule page :

  1. Récit des algorithmes de détection — des info-bulles pédagogiques expliquant comment chaque moteur attrape les menaces (Kitsune ML · heuristiques srct · nginx is_suspicious · JA3).
  2. Récit post-détection — met en évidence, à partir de données réelles, les IP anormales · requêtes web suspectes · historique d’exécution que chaque moteur a capturés sur la fenêtre récente.
  3. ★ Jeux de règles de séquence JA3 — une heuristique déterministe lit la séquence chronologique d’empreintes JA3 d’une seule IP source et énumère son « comportement anormal continu » sous forme de jeux de règles professionnels enregistrés dans infr_sec_ruleset.

La collecte et le blocage automatique tournent déjà côté backend (l’ancienne interface stats-design n’affichait que les tables pare-feu et liste noire) — l’objet de cet écran est de faire remonter cette télémétrie cachée sous forme de récit fiable.

Cet écran est principalement en lecture + analyse à la demande. Les détecteurs eux-mêmes (kts_tx · srct_tx · eve_ingest) sont des collecteurs Node exécutés sous pm2 sur les hôtes cibles ; l’application se contente de lire les tables qu’ils remplissent. Elle n’inspecte jamais le trafic elle-même.

La voie de narration par LLM a été supprimée le 2026-09-04. L’analyse envoyait auparavant le résumé de séquence à un adaptateur IA et enregistrait sa réponse en texte libre. Trois problèmes mesurés y ont mis fin : la conclusion du LLM (« rotation JA3 ») était celle qu’un calcul de ratio de trois lignes produisait déjà, pour environ 9 100 jetons par exécution ; le texte libre figeait la langue de son auteur, si bien que les sessions en anglais lisaient des cartes en coréen ; et l’écriture apposait provider/model depuis l’adaptateur même sur la voie de repli, de sorte que 10 des 13 lignes enregistrées se réclamaient de model=kimi-k2.6 tout en étant une sortie de gabarit. L’analyse est désormais purement heuristique — aucun appel externe, aucun coût en jetons — et provider/model consignent ce qui s’est réellement exécuté.


Quand l’utiliser


Disposition

Bandeau de KPI

KPI Signification Source
Anomalies IA Nombre d’anomalies Kitsune sur la fenêtre choisie comptage de kitsune_detail_log
Blocages IA Parmi elles, is_blocked=1 (seuil + veto réunis) kitsune_detail_log where is_blocked
Web suspect Requêtes nginx is_suspicious=1 sur la fenêtre comptage de nginx_meta_ct
Jeux de règles Règles actuellement actives (status=active) infr_sec_ruleset

Les deux premiers KPI parlent d’« IA » parce que Kitsune est réellement un auto-encodeur d’apprentissage automatique — cette étiquette est exacte et reste en place.

Panneau des algorithmes de détection (info-bulles edu)

Chaque carte de moteur ouvre une info-bulle pédagogique avec principe · ce qu’il surveille · astuces. Le texte vit dans le pack de langue statique security.det.edu.*.

Guide de déploiement pm2

Fournit la commande et le code source pour déployer les 5 collecteurs de détection en cron pm2 sur un hôte cible (voir Sources de données · tableau pm2).

Journal de détection et historique d’exécution

Contrevenants JA3 et jeux de règles


Mode d’emploi

1) Balayer l’état de la détection

Le sélecteur de plage (1h / 6h / 24h) en haut change la fenêtre d’observation (24h par défaut). Les KPI et les journaux de détection sont recalculés pour cette fenêtre. La page interroge toutes les ~30 s et le service met en cache 30 s.

Seule la liste des contrevenants porte toujours sur les 6 dernières heures, quelle que soit la plage. La rotation JA3 s’accumule sur plusieurs heures : une fenêtre courte ne révèle pas le schéma (aligné sur la fenêtre JA3 de 360 minutes du blocage automatique).

2) Lancer l’analyse de séquence JA3 (★)

  1. Choisissez une IP dans la liste des contrevenants (ou arrivez par lien direct depuis Overview/Threats) et cliquez sur [Analyser].
  2. Le serveur extrait la séquence TLS JA3 de cette IP depuis suricata_tls_ct dans l’ordre chronologique (fenêtre = politique d’exploitation sec_ai_window_min, 60 min par défaut · jusqu’à 200 lignes).
  3. Si la longueur de séquence est inférieure au minimum (sec_ai_min_seq, 5 par défaut), elle est ignorée avec insufficient_sequence.
  4. L’heuristique classe la séquence en constats (voir le tableau des règles ci-dessous).
  5. Le résultat est enregistré en jeux de règles ; la liste et l’entonnoir d’Overview se rafraîchissent aussitôt.

Exemple de réponse :

{
  "ok": true,
  "provider": "heuristic",
  "model": null,
  "saved": 1,
  "seq_len": 37,
  "findings": [
    { "key": "ja3_rotation",
      "params": { "conns": 37, "variety": 34 },
      "category": "tls_anomaly",
      "severity": "crit", "action": "block", "confidence": 91 }
  ]
}

L’analyse est déterministe et gratuite : la même séquence donne toujours les mêmes jeux de règles, elle ne contacte jamais de service externe et fonctionne sans accès réseau. Son exécution ne coûte rien : relancez-la librement dès que les chiffres d’un contrevenant évoluent.

Règles heuristiques

Les constats sont bâtis à partir de statistiques de séquence (rotation = ja3_variety / seq_len).

Condition Jeu de règles Catégorie Gravité Action Confiance
variety ≥ 3 ET rotation ≥ 0,5 Rotation JA3 (scanner automatisé/botnet) tls_anomaly rotation≥0,9 → crit, sinon warn block 50 + round(rotation×45), max 95
URL sensibles observées (.env·.git·wp-config…) Sondage d’identifiants/fichiers de configuration credential_access crit block 88
variety = 1 ET conns ≥ 10 ET sni_variety ≥ 4 Balayage multi-cibles à JA3 unique scan warn observe 72
Aucun des cas ci-dessus Activité TLS de référence other info observe 40

Les URL sensibles sont détectées par l’expression régulière .env .git wp-config .aws /actuator phpunit /.. shell.php wp-login xmlrpc (depuis le contexte nginx is_suspicious + suricata_http).

Catégories, gravités et actions sont validées contre les enum des colonnes avant insertion (recon · credential_access · exfil · bruteforce · c2 · tls_anomaly · scan · other / info · warn · crit / observe · block · isolate · report).

Formulation des jeux de règles et langues

Un constat est enregistré comme une identité, pas comme une phrase. heuristicFindings() émet {key, params} ; la ligne conserve rule_key + params (migration 000783) et la formulation est appliquée à la lecture, dans la langue du lecteur.

Les lignes créées avant 000783 conservent leur texte d’origine. La migration ne restaure rule_key que lorsque les propres éléments de preuve d’une ligne reproduisent exactement l’ancien gabarit (aucune supposition) ; les lignes en texte libre écrites par l’ancienne voie LLM restent figées jusqu’à ce que l’IP concernée soit réanalysée, ce qui les remplace.

3) Gérer les jeux de règles

Action Effet
Activer status=active (répercuté dans l’entonnoir d’Overview / le récit de blocage)
Écarter status=dismissed
Supprimer Retire la ligne

Une nouvelle analyse ne remplace que les jeux de règles d’origine automatique de cette IP (supprime entity_type=ip, entity_key=ip, source=ai puis les recrée) — les règles rédigées à la main sont conservées.

Le champ action d’un jeu de règles est une recommandation, pas une instruction. Rien n’agit dessus : le blocage automatique calcule la rotation JA3 directement depuis suricata_tls_ct et ne lit jamais infr_sec_ruleset. Une règle indiquant action=block ne bloque rien — le blocage se fait depuis Blocklist ou via le planificateur de blocage automatique.

4) Accumulation planifiée (sur activation)

La commande infr:sec-analyze parcourt les principaux contrevenants JA3 et accumule des jeux de règles. C’est une commande à passage unique qui se termine après exécution, donc planifiable en toute sécurité (ce n’est pas un démon).

# Contourner le verrou et exécuter une fois (débogage)
php artisan infr:sec-analyze --force

# Analyser une seule IP (ignore le verrou)
php artisan infr:sec-analyze --ip=203.0.113.10

5) Copier les commandes de déploiement pm2

La carte pm2 propose [Copier la commande] (ligne d’exécution pm2), [Copier le code source] (corps du fragment) et [Remplir avec les valeurs de l’instance et copier] (substitution des jetons HOSTNAME/IP). Le code provient du fragment initialisé dans Inventory ▸ Tools (infr_snippet).


Sources de données

Tables héritées lues (ne pas modifier)

Table Usage Collecteur alimentant
kitsune_detail_log IP anormale · anomaly_score · is_blocked kts_tx
kitsune_process_log Historique d’exécution Kitsune kts_tx
srct_process_log Historique d’exécution srct srct_tx
nginx_meta_ct Requêtes web suspectes (is_suspicious) nginx_shipper/aggregator
suricata_tls_ct Séquence JA3 (ja3_hash · sni · version) eve_ingest
suricata_http_ct Contexte HTTP pour l’analyse eve_ingest
blacklist_info Résultats du blocage automatique (référence) kts_tx · srct_tx
ip_info_loop Enrichissement geo/ASN —

Nouvelles tables appartenant à l’application

Collecteurs déployés par pm2

key Alimente Commande de déploiement (cron-restart)
eve_ingest suricata_*_ct pm2 start infr_eve_ingest.cjs --name infr-eve --cron-restart="0 0 * * 6"
kts_tx kitsune_*_log · blacklist_info pm2 start infr_kts_tx.cjs --name infr-kitsune --cron-restart="0 0 * * 2"
srct_tx srct_process_log · blacklist_info pm2 start infr_srct_tx.cjs --name infr-srct --cron-restart="0 0 * * 4"
sync_black ipset · iptables pm2 start infr_sync_black.mjs --name infr-syncblack --cron-restart="*/5 * * * *"
sync_firewall firewall_status pm2 start infr_sync_firewall.cjs --name infr-firewall --cron-restart="0 0 * * 0"

Services et routes

Méthode Route
GET /security/detections (index)
GET /security/detections/live (interrogation)
POST /security/detections/analyze (analyser)
POST /security/detections/ruleset/save
POST /security/detections/ruleset/delete

Accès

Opération Contrôle
Voir l’écran Accès au domaine de rôle Security (min_req 2) — demo (1) ne voit pas du tout le domaine sécurité ; staff (5) · admin (10) peuvent consulter
Analyser / enregistrer·supprimer une règle user_level ≥ 2 (canWrite) + audit dans infr_audit_log

Dépannage et FAQ

Analyse ignorée avec insufficient_sequence — la séquence suricata_tls_ct de cette IP est inférieure à sec_ai_min_seq (5 par défaut). Élargissez la fenêtre (sec_ai_window_min, 60 min par défaut) ou choisissez une IP plus active dans la fenêtre de 6 heures de la liste des contrevenants.


Voir aussi

탐지 · AI JA3 시퀀스 분석
탐지 · AI JA3 시퀀스 분석