InfraGuard

Menaces — Triage des menaces IDS

Triez les alertes de l’IDS Suricata sous forme d’entités d’IP source, avec des badges de liaison au blocage automatique et des explications de signatures qui précisent ce que chaque détection implique réellement.

Vue d’ensemble — à quoi sert cet écran

Sécurité ▸ Menaces (/security/threats) réorganise la table d’alertes de l’IDS Suricata suricata_alert_ct en une vue d’entités d’IP source (src_ip) destinée au triage. Au lieu d’égrener des milliers d’alertes brutes, elle les regroupe pour répondre à « qui (quelle IP) nous a frappés, avec quelle intensité et de quelle manière », puis les classe par gravité.

L’écran relie trois choses :

  1. Triage des entités de menace — une carte par src_ip qui résume le nombre d’alertes, la gravité maximale, les signatures distinctes et l’heure de dernière observation.
  2. Liaison avec l’action automatique (blocage) — le /24 de chaque IP menaçante est confronté à la table de défense automatique blacklist_info afin d’y attacher un badge Bloquée / Détectée, pour que détection et réponse se lisent d’un seul tenant.
  3. Explication des signatures (Signature Lore) — la plupart des chaînes de signature Suricata sont des événements moteur difficiles à lire (événements stream / decoder / app-layer), et non des règles de contenu. Cet écran raconte dans un panneau explicatif ce que chaque signature implique réellement (ce qu’elle a détecté · pourquoi elle s’est déclenchée [benign→malicious] · à quoi prêter attention · le pire scénario).

Tout est en lecture seule. La seule action modifiant l’état est un lien profond qui envoie une IP menaçante vers la Liste de blocage ; l’écriture réelle du blocage s’y effectue sous une autorisation distincte.

Quand l’utiliser

Disposition

Indicateurs supérieurs (limités à la fenêtre)

KPI Signification Calcul
alerts Total des alertes IDS dans la fenêtre comptage de suricata_alert_ct avec alert_ts >= since
entities Nombre d’entités d’IP menaçante src_ip principales (jusqu’à 48)
blocked IP menaçantes déjà bloquées automatiquement le /24 de l’entité ∈ blacklist_info(is_use=1)
critical IP menaçantes critiques non traitées (total observé = critical_all) max_sev <= 1 et pas encore bloquées

Cartes/lignes des entités de menace

Affiche jusqu’à 48 src_ip principales, triées par nombre d’alertes (décroissant). Chaque entité porte :

Champ Description
ip IP source (src_ip)
alerts nombre d’alertes de cette IP dans la fenêtre
sev gravité maximale (1=critique … 3=informative). Suricata : plus la valeur est basse, plus c’est grave → MIN(severity) donne le maximum
sigs signatures distinctes (sid) — variété de l’attaque
last_ts heure de dernière observation
blocked true si le /24 de cette IP figure sur la liste de blocage automatique
block_source étiquette de source du blocage : kitsune · suricata · manual · other (extraite de la chaîne reason)
country / asn enrichissement géo/ASN (ip_info_loop, dernière ligne)

Votre propre réseau est exclu. SecurityScope::excludePrefixes() filtre avec NOT LIKE le /24 des IP des instances enregistrées (ainsi que la liste blanche des réseaux internes issue de la Politique d’exploitation), afin que vos propres serveurs n’apparaissent pas comme source et n’encombrent pas la liste des menaces. Si une IP interne apparaît malgré tout à cause de l’étiquette de direction, un badge internal (piloté par internalMatchers) lui est attaché et le bouton de réputation est masqué.

répartition des gravités · catégories · signatures

Panneau d’explication des signatures

App\Support\SignatureLore::classify() classe la chaîne de signature en une famille et une clé de détail ; le texte lui-même réside dans le pack de langue resources/lang/{ko,en}/siglore.php. Le frontend fusionne family + key (le détail l’emporte sur la famille) en un récit en quatre parties.

Partie Contenu
Ce qu’elle a détecté (meaning) ce que la signature a capté, au niveau du protocole
Pourquoi elle s’est déclenchée · possibilités (why) causes candidates listées par ton [benign] → [watch] → [malicious]
À quoi prêter attention (caution) comment distinguer le bruit d’un vrai signal
Le pire scénario (worst) la compromission à laquelle cela peut mener si on l’ignore

Chaque famille porte une gravité implicite (tone) — même des événements informatifs n’impliquent pas la même chose.

family Libellé tone Icône
stream Anomalie de réassemblage de flux TCP warn mdi-transit-connection-variant
decoder Anomalie de décodage/intégrité des paquets info mdi-package-variant-closed
applayer Anomalie du protocole applicatif warn mdi-swap-horizontal-bold
http Anomalie d’analyse HTTP warn mdi-web
tls Anomalie TLS warn mdi-lock-outline
dns Anomalie DNS warn mdi-dns-outline
scan Balayage/reconnaissance warn mdi-radar
exploit Tentative d’exploitation crit mdi-bug-outline
malware Maliciel/C2 crit mdi-virus-outline
dos DoS/inondation crit mdi-flash-alert-outline
policy Politique/information info mdi-file-document-outline
generic Autre signature IDS info mdi-shield-alert-outline

Il existe 14 clés de détail qui priment sur la famille : invalid_timestamp · checksum · retransmit · handshake · evasion · stateanomaly · host_header · desync · malformed · one_direction · mismatch · starttls · tls_anomaly · unsolicited.

La plupart des signatures stream/decoder (par exemple SURICATA STREAM Packet with invalid timestamp, SURICATA TCPv4 invalid checksum) sont informatives, en sev3, et se déclenchent en masse à cause de caractéristiques d’infrastructure comme le routage asymétrique et le déchargement des sommes de contrôle par la carte réseau — du bruit inoffensif. Regardez moins la signature elle-même que le fait qu’une même src_ip empile plusieurs familles sur une courte fenêtre (balayage + anomalie de handshake, etc.). C’est cet empilement qui signale l’intention.

Mode d’emploi

1) Choisir la plage

La fenêtre par défaut est de 24 h. Plages prises en charge :

range fenêtre (min)
1h 60
6h 360
24h 1440 (par défaut)

Le sélecteur est transmis via ?range= ; toute valeur absente de la liste blanche est ramenée à 24h.

2) Trier les IP menaçantes

  1. Commencez par les entités de gravité la plus élevée (sev=1 critique) et au plus grand nombre d’alertes.
  2. Un badge Bloquée signifie que la défense automatique a déjà répondu — consultez block_source pour savoir quel moteur a bloqué.
  3. Non bloquée + gravité élevée + nombreuses signatures : voilà votre première candidate à l’investigation ou au blocage.

3) Détail d’une IP (fenêtre contextuelle propre à la sécurité)

Cliquer sur une IP appelle GET /security/threats/ip-detail?ip=<IP>&range=<range>. L’IP est strictement validée par FILTER_VALIDATE_IP ; une valeur invalide renvoie 422 (invalid_ip). Champs renvoyés :

{
  "ok": true,
  "detail": {
    "ip": "203.0.113.10",
    "cidr": "203.0.113.0/24",
    "geo": { "country": "US", "city": null, "asn": "ASNNNNN", "isp": "...", "org": "..." },
    "signatures": [
      { "signature": "...", "severity": 3, "cnt": 42, "explain": { "family": "stream", "key": "invalid_timestamp", "tone": "warn", "icon": "mdi-...", "svg": "stream" } }
    ],
    "blocked": true,
    "block_source": "suricata",
    "block_reason": "[Suricata Auto-Block] ...",
    "block_at": "2026-08-13 04:12:00",
    "abuse_url": "https://www.abuseipdb.com/check/203.0.113.10"
  }
}

4) Vérifier la réputation · promouvoir au blocage

Sources de données

Table Rôle Accès
suricata_alert_ct alertes IDS (src_ip · severity · category · signature · sid · alert_ts) lecture
blacklist_info liste de blocage automatique (/24 c_class · reason · country · is_use) lecture (badge d’action automatique)
ip_info_loop enrichissement géo/ASN/FAI lecture
IP des instances enregistrées + réseaux internes de la Politique d’exploitation exclusion du réseau propre · badge internal SecurityScope

Toutes les sources se trouvent sur la connexion legacy_glory (tables historiques sans préfixe alimentées par la flotte de collecteurs) et sont en lecture seule. La colonne vertébrale de lecture est App\Repositories\SecurityRepository (liaison de paramètres · fenêtres étroites · LIMIT). Le contrôleur et le service ne créent ni ne modifient jamais ces tables.

Cache · rafraîchissement

Accès

Action Niveau
Consulter l’écran · détail · réputation ≥ 2 (staff=5, admin=10)
Accès démo (1) refusé

Dépannage et FAQ

Q. invalid timestamp / invalid checksum dominent — est-ce une attaque ? Généralement non. invalid checksum se déclenche en masse sur le trafic de vos propres serveurs à cause du déchargement des sommes de contrôle par la carte réseau ; invalid timestamp provient du routage asymétrique et des middleboxes. Les deux sont du bruit inoffensif en sev3 — les entrées [benign] de l’explication décrivent exactement cela. Ne les suspectez que lorsqu’elles se concentrent sur une src_ip externe précise qui empile en outre d’autres signaux (balayage · anomalie de handshake).

Q. Pourquoi la gravité 1 est-elle la plus critique ? Par convention Suricata, severity 1=haute, 2=moyenne, 3=informative. Le risque maximal d’une entité se calcule donc avec MIN(severity).

Q. L’IP de mon propre serveur apparaît dans la liste des menaces. SecurityScope exclut les /24 des instances enregistrées et la liste blanche interne, mais une IP non enregistrée ou une étiquette de direction (src/dst) peut encore la faire remonter. Enregistrez l’IP dans Instances ou ajoutez la plage dans Politique d’exploitation. Si elle s’affiche toujours, un badge internal lui est attaché.

Q. Le détail d’IP renvoie 422. Le paramètre ip n’est pas une IP valide (invalid_ip). Vérifiez qu’il s’agit bien d’une valeur IPv4/IPv6 réelle.

Q. L’explication n’affiche que « Autre signature IDS ». Les signatures qu’aucune règle de mots-clés de SignatureLore::match() ne capture retombent sur la famille generic. Jugez d’après la catégorie et le nom de la signature et, au besoin, ajoutez une clé de détail dans siglore.php.

Q. La liste ne change pas pendant 30 secondes. C’est attendu. Le service utilise un cache de 30 secondes par plage plus une interrogation de 30 secondes. Si vous avez besoin immédiatement de la valeur la plus fraîche, rechargez après l’expiration du cache (cela force le recalcul).

Voir aussi

IDS 위협 트리아지
IDS 위협 트리아지