InfraGuard

Pare-feu (surface d’attaque)

Une carte d’exposition qui recoupe les règles de pare-feu de chaque hôte avec les services enregistrés et colore chaque port ouvert selon son risque.

Vue d’ensemble — ce que fait cet écran

Sécurité ▸ Pare-feu (/security/firewall) dessine tous les ports que votre parc de serveurs laisse ouverts sur une seule carte d’exposition. Il colore chaque port ouvert selon son risque (crit / warn / ok / unknown) et distingue s’il s’agit d’un service enregistré (managed) ou d’une ouverture inattendue (unmanaged), afin que vous voyiez immédiatement « ce qui est visible depuis l’extérieur, et pourquoi ».

Il combine trois sources :

infr_instance_firewall   (per-instance firewall rules = open ports/services)
        ×  infr_instance  (host meta — public IP · criticality · env · status)
        ×  infr_service   (registered logical services — instance_id · port)
        →  classified by FirewallLore →  exposure map

Frontière des rôles : cette page examine l’ouverture et l’exposition physiques des ports (surface d’attaque). L’accessibilité logique des services (contrôles de santé) relève de Service ▸ Catalogue. Un même port est envisagé sous un angle différent à chaque endroit.

Quand l’utiliser

Disposition

En-tête (HERO)

Titre/sous-titre (Ports your fleet leaves open — attack-surface exposure map), horodatage de la dernière collecte, bascule LIVE / PAUSED (interrogation de 30 s activée ou non) et bouton plein écran.

État vide

S’il n’existe aucune règle de pare-feu, un panneau de prise en main apparaît — le bouton Go to Instances vous conduit à /asset/instances. Importez un résultat de firewall-cmd depuis Instances ▸ [fw], ou collectez les ports ouverts par émulation distante, et la carte se remplit.

Bandeau de KPI (5 tuiles)

KPI Libellé Définition Calculé comme
ports Ports ouverts Total des lignes de ports ouverts sur tous les hôtes nombre de règles classées
hosts Hôtes exposés Machines qui ouvrent au moins un port instance_id distincts
crit Exposition risquée Ports classés crit risk == 'crit'
unmanaged Exposition non gérée Ports qui ne sont PAS un service enregistré ET dont le risque n’est pas ok !managed && risk != 'ok'
public_crit Publique · crit Ports crit ouverts sur un hôte doté d’une IP publique crit && public

Publique · crit est un double comptage délibéré. Un port crit sur une IP publique apparaît déjà dans Risky exposure et (s’il ne s’agit pas d’un service enregistré) également dans Unmanaged exposure — mais comme cette intersection (public × crit) constitue la pire exposition du parc, elle est mise en avant une seconde fois sous forme de KPI distinct pour que rien ne passe entre les mailles. Si cette tuile n’est pas à zéro, corrigez-la en priorité.

Bandeau de risque d’exposition

Une barre empilée en quatre couleurs (crit·warn·ok·unknown) montre la répartition du risque. La légende située en dessous est un filtre cliquable : cliquez sur un niveau de risque pour ne conserver que celui-ci (cliquez de nouveau pour l’annuler). À côté du bandeau, coverage (par ex. 7 / 12 hosts collected) indique le nombre d’hôtes disposant de règles de pare-feu rapporté au nombre total d’instances.

Barre d’outils · filtres

Vue par port

Une grille de cartes de port. Chaque carte affiche port/protocole · libellé de service · badge de risque, les pastilles d’hôte qui ouvrent ce port (jusqu’à 8 + +N), et un pied de carte avec le nombre d’hôtes · le nombre d’expositions publiques · la catégorie. Cliquez sur une carte → fenêtre de détail du port et d’explication du risque. Tri par risque → nombre d’hôtes → numéro de port.

Vue par hôte

Une grille de cartes d’hôte. Chaque carte affiche le nom d’hôte · l’alias · env · la criticité, un badge public, les pastilles de port que cette machine ouvre (colorées selon le risque, avec le marqueur check-decagram s’il s’agit d’un service enregistré), et un pied de carte avec les décomptes par risque · le nombre total de ports. Cliquez sur une pastille de port → la même fenêtre de détail. Tri par nombre de crit → nombre de warn → nombre de ports.

Fenêtre de détail du port et d’explication du risque

Port/protocole · nom du service · badge de risque · catégorie, plus l’explication fwlore en trois parties :

En dessous, la liste des hôtes qui ouvrent ce port (env · criticité · zone · publique/interne · badges géré/non géré) et un lien Manage in Instances ▸ [fw].

Mode d’emploi

  1. Si LIVE est actif, la page se rafraîchit toutes les 30 secondes. Si des valeurs qui bougent vous gênent pendant une investigation, passez en PAUSED.
  2. Vérifiez d’abord le KPI Publique · crit : s’il n’est pas à zéro, cliquez sur crit dans la légende des risques pour restreindre la vue par port, puis traitez en priorité les hôtes portant une pastille publique (icône de globe).
  3. Utilisez Non gérés uniquement pour isoler les « ouvertures inattendues ». Si une base de données (3306/5432/27017), un cache (6379/11211), Docker (2375) ou une administration distante (23/3389/VNC) qui n’est pas un service enregistré apparaît ici, restreignez-la immédiatement.
  4. Cliquez sur une carte de port, lisez why/best dans la fenêtre d’explication, puis suivez Manage in Instances ▸ [fw] pour durcir la règle ou l’enregistrer comme service.
  5. Fermer réellement un port ou modifier une règle se fait non pas ici, mais sur le pare-feu de l’hôte cible ainsi que dans Instances ▸ [fw]. Cette page est une carte et un outil d’audit.

Règles de classification du risque (FirewallLore)

Une chaîne de port peut être une valeur unique (8080) ou une plage (6081-6100). Une plage est confrontée à la table des ports bien connus par son port de départ.

risk rank signification exemples
crit 3 Danger immédiat en cas d’exposition — magasin de données · administration distante · partage de fichiers · conteneurs MySQL 3306, Redis 6379, RDP 3389, SMB 445, Docker 2375, k8s-api 6443
warn 2 À surveiller — administration · hérité · non standard SSH 22, SMTP 25, 8080/8443, SNMP 161, Grafana 3000
ok 1 Service public standard HTTP 80, HTTPS 443, DNS 53, NTP 123, WireGuard 51820
unknown 0 Non répertorié — à examiner ports/plages absents du catalogue

Détermination du statut géré

La table des services enregistrés est indexée par infr_service.instance_id : port. Si l’instance possède un service enregistré sur ce port, la règle est gérée (marqueur check-decagram, managed_name). Les ports en plage correspondent sur leur port de départ (low). Sans service enregistré, la règle est non gérée — et si son risque n’est pas ok, elle entre dans le KPI Unmanaged exposure.

Sources de données

Table / source Rôle Alimentée par
infr_instance_firewall Règles de ports/services ouverts par instance (registre) Actifs ▸ Instances ▸ [fw] — CRUD manuel / import du texte brut firewall-cmd --list-all / import JSON de scripts/infr_firewall_probe.cjs
infr_instance Métadonnées de l’hôte — name · alias · env · criticality · status · ip_public Actifs ▸ Instances
infr_service Services logiques enregistrés (instance_id · port · name · kind) → contrôle du statut géré Service ▸ Catalogue
App\Support\FirewallLore Référence de la classification port → {key,label,category,risk,icon} (indépendante de la langue) code
resources/lang/{ko,en}/fwlore.php Explications what/why/best par niveau de risque et par catégorie pack de langue

Forme d’une règle infr_instance_firewall (UNIQUE instance_id, zone, proto, port) :

{
  "zone": "public",
  "ports": [
    { "port": "22",         "proto": "tcp", "service": "ssh" },
    { "port": "443",        "proto": "tcp", "service": "https" },
    { "port": "3306",       "proto": "tcp", "service": "mysql" },
    { "port": "6081-6100",  "proto": "tcp", "service": "" }
  ]
}

L’importateur [fw] analyse aussi le texte brut de firewall-cmd --list-all (en-tête de zone → correspondance services: → ports: directement) :

public (active)
  services: http https ssh
  ports: 8080/tcp 6081-6100/tcp 3306/tcp

Le tableau de bord construit est mis en cache côté serveur pendant 30 secondes (infr:sec:firewall:dashboard). En l’absence totale de règles, il renvoie une charge utile vide (empty=true) qui affiche l’état de prise en main.

Accès

Dépannage et FAQ

Je ne vois que l’écran vide (« Aucune donnée de pare-feu pour l’instant »). Cela signifie que infr_instance_firewall ne contient aucune règle. Collez un résultat de firewall-cmd --list-all dans Actifs ▸ Instances ▸ [fw] pour l’importer, ou collectez les ports ouverts par émulation distante.

Un port s’affiche comme Unknown service. Le port ne figure pas dans le catalogue FirewallLore (risque unknown). S’il s’agit d’un service légitime, enregistrez-le dans Service ▸ Catalogue ou ajoutez un libellé dans le champ service/note de la règle [fw]. S’il est inutile, fermez-le.

C’est un service enregistré, mais il apparaît comme unmanaged. Le contrôle du statut géré exige un infr_service sur la même instance et sur ce port. Si le service se trouve sur un autre hôte ou un autre port, la correspondance échoue. Les ports en plage ne correspondent que sur leur port de départ.

Risky exposure n’est pas à zéro, mais Public · crit vaut 0. Cela signifie que tous les hôtes ouvrant des ports crit sont uniquement internes (pas d’ip_public) — un rayon d’exposition réduit, donc relativement plus sûr. Restreignez-les malgré tout, pour tenir compte des menaces internes et des déplacements latéraux.

Les valeurs ne sont pas en temps réel. LIVE est peut-être en PAUSED, ou l’onglet est en arrière-plan. Le tableau de bord est mis en cache 30 secondes côté serveur : jusqu’à 30 secondes après avoir modifié une règle dans [fw], vous pouvez donc encore voir les anciennes valeurs.

Puis-je fermer un port ici ? Non. Cette page est une carte en lecture seule. Le blocage effectif s’opère sur le pare-feu de l’hôte cible, et les mises à jour du registre des règles dans Instances ▸ [fw].

Voir aussi

방화벽 — 오픈 포트 노출 지도
방화벽 — 오픈 포트 노출 지도