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 :
- 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.
- Liaison avec l’action automatique (blocage) — le /24 de chaque IP menaçante est confronté à la table de défense automatique
blacklist_infoafin d’y attacher un badge Bloquée / Détectée, pour que détection et réponse se lisent d’un seul tenant. - 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
- Triage du matin : parcourir les IP qui vous ont le plus frappé au cours des 24 dernières heures et leur gravité.
- Décider si une IP donnée est une vraie menace ou du bruit — classez vite grâce au ton [benign/watch/malicious] de l’explication et au badge de blocage automatique.
- Expliquer à un collègue « mais que veut dire cette signature ? » — le panneau explicatif fait aussi office de support pédagogique.
- Après avoir investigué une IP menaçante, la promouvoir en candidate au blocage (→ lien profond vers la Liste de blocage, → fenêtre Réputation IP).
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 avecNOT LIKEle /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 badgeinternal(piloté parinternalMatchers) lui est attaché et le bouton de réputation est masqué.
répartition des gravités · catégories · signatures
- répartition des gravités :
{1: n, 2: n, 3: n}— nombre d’alertes critiques/d’avertissement/informatives. - catégories : les 10 premières catégories (nombre décroissant) avec leur gravité minimale.
- signatures : les 12 premières signatures (nombre décroissant). Chaque élément porte
signature·sid·cnt·sev(minimum) plusexplain(la classification SignatureLore). Cliquer sur une signature ouvre le panneau explicatif voisin.
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
- Commencez par les entités de gravité la plus élevée (
sev=1critique) et au plus grand nombre d’alertes. - Un badge Bloquée signifie que la défense automatique a déjà répondu — consultez
block_sourcepour savoir quel moteur a bloqué. - 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"
}
}
- geo/ASN : enrichissement
ip_info_loop. - signatures : les 8 principales signatures de cette IP (nombre décroissant), chacune avec son explication
explain. - statut de blocage : correspondance /24 avec
blacklist_info(c_class,is_use=1) → étiquette de source · reason brut · heure du blocage.
4) Vérifier la réputation · promouvoir au blocage
- Cliquez sur le symbole (
.infr-ipsym) à côté d’une IP → fenêtre AbuseIPDB intégrée Réputation IP (mixins/abuse_check.js+/security/ip-reputation). Elle affiche l’indice de confiance d’abus, le nombre de signalements, le pays, le type d’usage et le détail des signalements récents. - Après investigation, si vous décidez de bloquer → lien profond vers la Liste de blocage avec
?add=<IP>(normalisé en /24 à l’insertion, sous une autorisation distincte et avec audit).
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 estApp\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
- Les résultats de
ThreatService::build()sont mis en cache 30 secondes par plage (cléinfr:sec:th:<range>). - L’écran se rafraîchit par interrogation toutes les 30 secondes (
/security/threats/live) — pas via Reverb. - Comme la gravité maximale s’obtient par
MIN(severity), unsevplus bas est plus dangereux (1=critique, 3=informative).
Accès
| Action | Niveau |
|---|---|
| Consulter l’écran · détail · réputation | ≥ 2 (staff=5, admin=10) |
| Accès démo (1) | refusé |
- L’ensemble du préfixe
/security/*est protégé par le middlewareinfr.level:2. La démo (1) n’a pas accès aux données de sécurité (Niveaux RBAC). - Menaces est entièrement en GET (lecture seule) et ne fait donc pas l’objet d’écritures d’audit. Les actions destructrices ou externes telles que l’écriture d’un blocage ou le signalement d’abus s’effectuent sous leur propre autorisation et audit, respectivement dans la Liste de blocage et dans les flux de collaboration internationale.
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
- Vue d’ensemble de la sécurité — l’entonnoir de défense menace→détection→réponse (pièce maîtresse)
- Détections et JA3 — Kitsune ML · heuristiques srct · anomalie de séquence JA3
- Jeux de règles — le catalogue de détection de référence, 44 jeux de règles
- Liste de blocage et réputation — consulter/ajouter/lever les blocages automatiques (
blacklist_info) - Réputation IP — fenêtre de réputation AbuseIPDB intégrée
- Liste blanche — IP/CIDR exemptés de blocage
