Vue d’ensemble — à quoi sert cet écran
Liste de blocage et réputation (/security/blocklist) raconte l’histoire des plages malveillantes que Kitsune ML et Suricata IDS bloquent automatiquement, et offre aux opérateurs une console de contrôle pour bloquer (ajouter) · lever · rebloquer des plages à la main.
- La table source est
blacklist_infosur la connexionlegacy_glory(environ 8 000 à 9 000 lignes). L’unité de blocage n’est pas une IP isolée mais une plage /24 (c_class, p. ex.203.0.113.0/24). - Cette table est écrite par les collecteurs de détection (
kts_tx.js·srct_tx.js) ainsi que par cette interface opérateur ; le démonsync_black(sync_black.mjs) la lit et applique les blocages sous forme de règles DROP ipset/iptables sur chaque hôte. Ajouter ou lever ici relève donc du plan de contrôle — le rejet effectif des paquets est appliqué par sync_black. - L’étiquette de source du champ
reason([Kitsune ...]·[Suricata Auto-Block]·[Manual] ...) et les chiffres probants (score · port · ja3 · hits …) sont analysés pour produire un libellé lisible expliquant « pourquoi cette plage a été prise » (analyse indépendante de la langue).
Un « blocage » couvre toujours une plage /24 entière. Même si vous saisissez une IP isolée, seuls les trois premiers octets sont conservés et l’entrée est normalisée en
x.y.z.0/24. Les faux positifs sont exemptés via la Liste blanche, et non en rétrécissant le blocage.
Quand l’utiliser
- Pour voir d’un coup d’œil ce que la défense automatique bloque actuellement et dans quelle proportion (nombre de blocages actifs · contribution par moteur · pays d’origine).
- Pour bloquer manuellement une IP malveillante repérée dans Menaces, Détections ou une fenêtre d’investigation d’IP (lien profond via
?add=, champ prérempli). - Pour lever une plage bloquée par erreur, ou rebloquer une plage levée dont l’activité a repris.
- Pour recouper l’IP représentative d’une plage bloquée avec la réputation AbuseIPDB.
Disposition
Indicateurs en haut de page
Calculés par summary() avec un cache de 30 secondes (infr:sec:blocklist:summary).
| Indicateur | Signification | Calcul |
|---|---|---|
| Blocages actifs | Plages /24 actuellement appliquées | COUNT(*) WHERE is_use=1 |
| Adresses protégées (sous-titre) | Adresses couvertes par les blocages actifs | active × 256 (/24 ≈ 256) |
| Bloquées aujourd’hui | Nouveaux blocages sur les 24 dernières heures | is_use=1 AND created_at >= today 00:00 |
| Taux de défense automatique | Part traitée automatiquement par l’IA et l’IDS | (kitsune + suricata) / active × 100 |
| Pays surveillés | Pays distincts parmi les plages actives | COUNT(DISTINCT country) WHERE is_use=1 |
| Levées | Actuellement levées (en attente d’un nouveau blocage) | COUNT(*) WHERE is_use=0 |
Contribution des moteurs de défense
Les blocages actifs sont répartis par étiquette de source dans une barre de parts complétée par des tuiles. Le classement repose sur une correspondance LIKE sur reason.
| Moteur | Règle de correspondance | Signification |
|---|---|---|
| Kitsune ML | reason LIKE '%Kitsune%' |
Détection d’anomalies par auto-encodeur d’ensemble |
| Suricata IDS | reason LIKE '%Suricata%' |
Blocage automatique sur balayage ou violation de protocole |
| Manuel | reason LIKE '%Manual%' ou %수동% |
Blocage désigné par l’opérateur |
| Autre | Tout ce qui ne correspond à rien de ce qui précède | active − (kitsune+suricata+manual), plancher à 0 |
Origine des menaces
blockByCountry(12) agrège les plages actives en un top 12 des pays (GROUP BY country ORDER BY COUNT DESC), affiché sous forme d’émojis de drapeaux et de barres de classement. Cliquer sur une barre filtre la liste sur ce pays.
Fil d’activité de défense récente
blockFeed(16) affiche les 16 lignes les plus récentes, tous statuts confondus (ORDER BY created_at DESC, id DESC) dans une grille 4×4 — une perception en direct de ce qui vient d’être attrapé.
Liste de blocage filtrable
40 cartes par page (PER_PAGE=40, ORDER BY created_at DESC, id DESC). Chaque carte affiche la plage · le pays · le badge de source · la puce de preuve (comportement + chiffre clé) · l’heure du blocage · le statut, avec les actions de ligne [Réputation] · [Détails] · [Lever]/[Rebloquer]. Si une plage correspond à un réseau interne enregistré, elle reçoit un badge Internal et son bouton de réputation est masqué (internal_scope.js).
Filtres :
- Statut —
active(par défaut) ·released·all - Source —
kitsune·suricata·manual(vide = toutes) - Pays — correspondance exacte (≤ 64 caractères)
- Recherche (q) — préfixe CIDR uniquement (expression régulière
^[0-9.]{0,20}$, p. ex.211.→c_class LIKE '211.%')
Comment l’utiliser
Lire le motif
La puce de preuve de chaque carte retient le seul jeu de règles au poids le plus élevé dans la chaîne reason et l’affiche sous forme de libellé accompagné d’un chiffre représentatif. Parmi les catégories heuristiques de srct, la principale est choisie selon cet ordre de poids :
| Marqueur de catégorie | Poids | Clé behavior | Libellé | Chiffre représentatif (détail) |
|---|---|---|---|---|
[A2:...] |
6 | brute | Force brute sur l’administration | hits=N → N hits |
[A:...] |
5 | scanner | Balayage de chemins vulnérables | hits=N → N hits |
[D:...] |
4 | ja3 | Empreinte JA3 de botnet | ja3=N → ja3×N |
[B:...] |
3 | bot_ua | Accès de robot malveillant | hits=N → N hits |
[C:...] |
2 | err_flood | Déluge d’erreurs 4xx | err_rate=NN% |
[E:...] |
1 | short_scan | Balayage de ports TCP | port=N ou N scan |
Si la source est Kitsune, ou si reason contient score=, la ligne est classée en ml_anomaly (anomalie d’apprentissage automatique) avant toute catégorie, avec affichage de top= (la composante à l’erreur la plus forte) et de score. Le manuel et le reste retombent sur manual / auto.
Faits supplémentaires extraits de reason : score=, top=, port=, short_scan_sessions=, bytes=. Exemples de motifs :
[Kitsune v2.2] anomaly top=TLS score=0.83
[Suricata Auto-Block] [A:URL] hits=42 port=443
[Manual] repeated login abuse (uid=5)
Ajouter un blocage manuel
- [Blocage manuel] dans l’en-tête de la liste ouvre la fenêtre d’ajout. (Lorsque vous arrivez depuis Menaces ou une investigation d’IP, l’IP est préremplie à partir de
?add=203.0.113.10.) - Saisissez une IP ou un CIDR. Une IP isolée est étendue en
/24(203.0.113.10→203.0.113.0/24). - Saisissez un motif facultatif (≤ 160 caractères) et cliquez sur [Bloquer].
- Comportement du serveur :
- La saisie est normalisée en
x.y.z.0/24viacclassCidr()(tout ce qui n’est pas de l’IPv4 est rejeté avecinvalid_cidr). - Pour une IPv4 complète, le pays est enrichi depuis
ip_info_loop(sinon la valeur existante /Unknown). - Si
(server_index=0, c_class)existe déjà, la ligne passe àis_use=1(réactivée) ; sinon une nouvelle ligne est insérée. Le motif devient"[Manual] <note> (uid=N)". - Le cache du résumé est vidé, puis la liste et le résumé rafraîchis sont renvoyés.
- La saisie est normalisée en
Le blocage atteint
blacklist_infoimmédiatement, mais le DROP effectif du pare-feu n’est appliqué que lorsque le démonsync_blackde chaque hôte le synchronise ensuite dans ipset/iptables. Si ce traitement par lot ne tourne pas, le blocage n’est pas appliqué au niveau du pare-feu.
Lever / Rebloquer
- [Lever] positionne
is_use=0afin que sync_black le retire d’ipset (la ligne subsiste). L’action s’exécute après une boîte de dialogue de confirmation. - [Rebloquer] ramène une plage levée à
is_use=1. - Les deux renvoient
not_foundsi la ligne visée n’existe pas.
Interrogation périodique
security-blocklist.js appelle /security/blocklist/live toutes les 30 secondes pour rafraîchir le résumé et la page courante.
Sources de données
| Élément | Source | Remarques |
|---|---|---|
| Registre des blocages | blacklist_info (legacy_glory) |
id, server_index, c_class, country, reason, is_use, created_at, updated_at · UNIQUE(server_index, c_class) |
| Enrichissement du pays | ip_info_loop (legacy_glory) |
recherche du pays pour une IPv4 complète lors de l’ajout |
| Contrôle de réseau interne | SecurityScope::internalMatchers() |
IP des instances enregistrées + liste blanche de la Politique d’exploitation → badge Internal |
| Application par le pare-feu | démon sync_black |
blacklist_info → DROP ipset/iptables |
| Alimentation du blocage automatique | kts_tx.js · srct_tx.js |
écrivent les étiquettes de source et les chaînes probantes de reason |
| Journal d’audit | infr_audit_log |
sec.block_add · sec.block_release · sec.block_readd |
L’ossature de lecture est App\Repositories\SecurityRepository ; la narration et les écritures sont orchestrées par App\Services\Security\BlocklistService. Les identifiants proviennent uniquement de config('database.connections.legacy_glory') — jamais codés en dur.
Accès
- Consulter la page — vous devez appartenir au domaine de rôle Sécurité (
min_req=2dans sitemap). Sur l’échelle de niveaux déployée, staff (5) et admin (10) voient les écrans de Sécurité ; demo (1) est hors du périmètre de sécurité. - Écritures (ajout/levée/reblocage) — le serveur impose
infr_user_level >= 2(canWrite). En dessous, il renvoie403 forbidden. Ainsi demo (1) ne peut pas écrire ; staff et admin le peuvent. - Chaque écriture est consignée dans
InfrAuditLoget traçable dans le Journal d’audit (acteur, CIDR ciblé, indicateur de réactivation, etc. dans le meta).
Comme il s’agit d’actions de sécurité destructrices, l’interface affiche une boîte de dialogue de confirmation (step-up) avant l’exécution. Vérifiez deux fois le CIDR pour ne pas bloquer par accident une plage étendue.
Dépannage et FAQ
- J’ai bloqué, mais les attaques continuent. Cet écran ne met à jour que le registre. Vérifiez que
sync_blacktourne sur l’hôte visé et qu’ipset a bien été mis à jour. De plus, les blocages sont par /24 : les attaques venant d’autres plages nécessitent leurs propres blocages. - [Blocage manuel] renvoie 403. Votre niveau de connexion est inférieur à 2. Réessayez avec un compte staff ou admin (voir Niveaux RBAC).
- La saisie est rejetée comme « IP/CIDR invalide ». Seuls
a.b.c/a.b.c.d/a.b.c.d/nnsont acceptés. L’IPv6 et les noms d’hôtes ne sont pas pris en charge. - Le pays affiche Unknown. Il n’existe pas d’enrichissement
ip_info_looppour cette IP, ou vous n’avez saisi qu’un CIDR. Ajouter une IPv4 complète peut renseigner le pays. - Les indicateurs ou la liste ne changent pas. Le résumé est mis en cache 30 secondes. Il est vidé juste après une écriture, mais les changements issus des collecteurs peuvent accuser jusqu’à 30 secondes de retard.
- J’ai bloqué par erreur une plage légitime. Levez le blocage immédiatement et, si le faux positif se reproduit au reblocage, ajoutez la plage à la Liste blanche pour que srct_tx l’exempte juste avant de bloquer.
Voir aussi
- Menaces — transmettez ici une IP malveillante via
?add=pour la bloquer - Liste blanche — exemptions de blocage (prévention des faux positifs, avec expiration)
- Détections et JA3 — comment fonctionne la détection Kitsune / srct / JA3
- Blocage automatique — le pipeline planifié de blocage automatique
- Réputation d’IP (AbuseIPDB) — recouper l’IP représentative
- Journal d’audit — retracer l’historique des blocages et des levées
