Skip to content

feat(soar): triage apprenant des alertes (empreintes + boutons Discord + suppression + digest) - #24

Merged
AbrahamOP merged 1 commit into
devfrom
feat/soar-triage
Aug 25, 2026
Merged

AbrahamOP merged 1 commit into
devfrom
feat/soar-triage

Conversation

@AbrahamOP

Copy link
Copy Markdown
Collaborator

Quoi

Le chantier SOAR Triage apprenant (design validé le 2026-08-25) : classer une alerte depuis Discord (By design / Faux positif / J'enquête / Résolu) et ne plus revoir les similaires — sans jamais rendre une suppression invisible.

Comment

  • Empreinte : sha256(rule.id | agent | champ-clé) par famille — FIM → chemin, auth → compte visé, sudo → compte qui élève (srcuser, pas dstuser qui vaut toujours root), repli description normalisée. Alertes de statut agent (Perdu/Retrouvé) incluses, une empreinte par direction.
  • Table soar_triage (nouvelle, via coreTables + miroir schema.sql) : statut, compteurs de suppression, sample JSON (matière de la phase 2 similarité), décideur (username affiché + ID Discord immuable pour la traçabilité).
  • Boutons Components V2 sur chaque alerte, custom_id validé côté serveur (verdict connu + 64 hex). Handler InteractionCreate idempotent (la double-session transitoire d'un hot-reload ApplyDiscord reste inoffensive — commentaire du registry mis à jour) et réservé aux membres portant Gérer les messages sur le canal d'alertes.
  • Suppression avant post des empreintes by_design/false_positive, fail-open sur toute erreur DB (une alerte de sécurité part toujours). investigating/resolved continuent de poster ; une récidive après résolution rouvre.
  • Digest hebdo : top 10 + agrégat + totaux, ancre soar_state, retenté tant que Discord est indisponible, reset soustractif (une suppression concurrente survit), réancrage sur ancre corrompue ou future.
  • Au clic : ack différé → relecture de la dernière décision en DB → re-fetch du message → re-rendu. Ni un clic concurrent ni l'édition d'enrichissement IA ne sont écrasés.

Tests

  • Unitaires : empreintes (familles, normalisation, format), custom_id, composants (boutons, retag via round-trip JSON gateway, digest).
  • Intégration MySQL (SOAR_TEST_DSN, désormais exécutés en CI dans le job db-tests) : cycle de vie du store, compteurs/reset du digest, suppression de bout en bout dans checkSoarEvents, machine à états de l'ancre.
  • go test ./... -race complet au vert en local contre MariaDB 11.8.

Revue

Passée par une revue multi-lentilles (concurrence, sécurité, API Discord, logique métier, conventions) + vérification adversariale : 11 constats confirmés, tous corrigés dans cette branche (autorisation des boutons, empreinte sudo, traçabilité par ID, ancre future, convergence des clics concurrents, CI, simplifications).

NB : la branche dev avait été supprimée par la fermeture de la PR #22 (release v0.11.12) — recréée depuis main pour restaurer le git-flow.

Phase 2 (similarité Qdrant) et phase 3 (page Triage du dashboard) suivront dans des chantiers séparés.

…d, suppression, digest hebdo

Classement Wiz-like des alertes SOAR depuis Discord :

- Empreinte sha256(rule.id|agent|champ-clé) par famille de règle : FIM sur le
  chemin, auth sur le compte visé, sudo sur le compte qui élève (srcuser),
  repli sur la description normalisée. Table soar_triage (Migrate + schema.sql).
- Quatre boutons Components V2 sur chaque alerte (By design / Faux positif /
  J'enquête / Résolu), custom_id triage:<statut>:<empreinte> validé côté
  serveur. Handler InteractionCreate idempotent (hot-reload double-session
  sans danger), réservé aux membres portant « Gérer les messages » sur le
  canal d'alertes, traçabilité par ID Discord immuable (decided_by_id).
- Suppression AVANT post des empreintes by_design/false_positive — comptée,
  jamais silencieuse : digest hebdomadaire des suppressions (top 10 + agrégat
  + total vie-entière), ancre persistée en soar_state, retenté tant que
  Discord est indisponible, reset soustractif des compteurs (une suppression
  concurrente survit au reset). investigating/resolved continuent de poster ;
  une récidive après résolution rouvre l'empreinte.
- Au clic : ack différé puis re-rendu depuis l'état frais du message et la
  dernière décision en DB — un clic concurrent ou une édition d'enrichissement
  IA ne sont jamais écrasés. Fail-open sur toute erreur DB : une alerte de
  sécurité part toujours.
- CI : tests SOAR/triage MySQL (SOAR_TEST_DSN) exécutés dans le job db-tests.
@AbrahamOP
AbrahamOP merged commit d61ee1b into dev Aug 25, 2026
@AbrahamOP
AbrahamOP deleted the feat/soar-triage branch August 25, 2026 07:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant