Sécurité

Pare-feu Proxmox : le piège du firewall=1 qui ne filtre rien

Un audit de notre propre parc l'a montré : des machines avec le pare-feu « activé » sur leur interface étaient en réalité ouvertes au monde. Le pare-feu Proxmox exige deux conditions, pas une, et les règles du datacenter ne protègent jamais les invités. Anatomie du piège, vérification en une commande, et la recette complète.

Interrupteur de pare-feu sur ON dont le câble est coupé avant d'atteindre le serveur, resté exposé
Sommaire (4 sections)
  1. Trois niveaux, et une hiérarchie contre-intuitive
  2. Le piège : un interrupteur sans circuit
  3. Notre audit : 4 machines protégées sur 9
  4. La recette complète

Le pare-feu de Proxmox a une interface trompeusement simple : une case Firewall sur la carte réseau de chaque machine, cochée par défaut à la création. Cochée = protégé, n'est-ce pas ? Non. Cette case est un interrupteur… qui peut n'être relié à aucun circuit. Nous l'avons constaté sur notre propre parc lors d'un audit : des machines à IP publique, pare-feu « activé », en réalité ouvertes au monde entier. Voici l'anatomie exacte du piège, et comment vérifier chez vous en trente secondes.

Trois niveaux, et une hiérarchie contre-intuitive #

Le pare-feu Proxmox se configure à trois niveaux : datacenter (cluster entier), nœud (chaque hyperviseur), et invité (chaque VM/CT). L'intuition dit que les règles du datacenter « ruissellent » vers tout ce qu'il contient. La réalité du code est autre : les règles du niveau datacenter et du niveau nœud protègent les hyperviseurs eux-mêmes : leur SSH, leur interface d'admin. Elles ne s'appliquent jamais au trafic des invités. Croire qu'une règle datacenter « SSH restreint à nos IP » couvre le parc entier, c'est laisser chaque VM à IP publique exposer son propre SSH au monde.

Le piège : un interrupteur sans circuit #

Pour qu'un invité soit réellement filtré, il faut deux conditions cumulatives : la case firewall=1 sur son interface réseau, et un fichier de règles propre à l'invité (/etc/pve/firewall/<vmid>.fw) contenant au minimum enable: 1 et une politique. La case seule ne fait rien : pas de politique par défaut, pas de blocage implicite, le trafic passe intégralement. Et comme la case est cochée d'office à la création, le parc se remplit naturellement de machines qui affichent un pare-feu sans en avoir un.

Bash
# La vérification, depuis un noeud du cluster :
ls /etc/pve/firewall/
# cluster.fw  105.fw  133.fw ...

# Croiser avec les invités qui portent une IP publique :
# toute machine exposée SANS son <vmid>.fw est un trou.

# Et le juge de paix : tester DEPUIS L'EXTÉRIEUR
nmap -Pn <ip-publique-du-guest>

Notre audit : 4 machines protégées sur 9 #

Chiffres réels de notre audit interne : sur neuf machines à IP publique, seules quatre avaient un fichier de règles. Cinq « pare-feu activés » ne filtraient rien. Cerise instructive : un fichier de règles actif référençait un invité… supprimé depuis longtemps : le symétrique du piège, la règle sans machine. Deux leçons : ce défaut ne se voit pas dans l'interface (tout a l'air normal), et il ne se détecte que par un audit qui croise la liste des fichiers de règles avec la liste des machines exposées.

La recette complète #

INI
# /etc/pve/firewall/<vmid>.fw : le minimum vital d'un guest exposé
[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT

[RULES]
IN ACCEPT -p tcp -dport 80
IN ACCEPT -p tcp -dport 443
# SSH : jamais ouvert au monde, restreint à un ipset d'IP d'administration
IN ACCEPT -source +admin-ips -p tcp -dport 22
  • À la création de toute machine exposée : la carte réseau et son fichier de règles se posent ensemble, jamais l'un sans l'autre. C'est une ligne de check-list, pas un souvenir.
  • Les ipsets (définis au niveau datacenter) centralisent les listes d'IP d'administration : une IP change, un seul endroit à modifier.
  • À la suppression d'une machine : retirer son fichier de règles : les règles orphelines sont le bruit qui masquera le prochain vrai trou.
  • Périodiquement : re-scanner depuis l'extérieur. Un pare-feu se prouve, il ne se suppose pas.

Ce piège est un cas d'école de notre conviction sur la sécurité comme série de détails vérifiés : l'outil est bon, l'interface est claire, et le défaut naît précisément de ce que tout a l'air configuré. L'audit qui l'a débusqué chez nous fait partie de ce que nous appliquons aux infrastructures que nous infogérons. Si vos machines exposées n'ont jamais été scannées depuis l'extérieur, commencez par ça.

À propos
À lire ensuite

Articles liés

Sécurité

Subscription bombing : autopsie d'un formulaire newsletter détourné en relais de spam

Une nuit, quatorze mails de confirmation sont partis d'un site que nous hébergeons vers des adresses qui n'avaient rien demandé. Le captcha était résolu, le plafond par destinataire contourné, le rate-limit inutile, CrowdSec aveugle. Reconstitution complète depuis les logs : ce que le robot faisait, comment on l'a reconnu, et pourquoi la seule vraie parade a été de lui retirer son arme.

sécuritébots
Infrastructure

Autopsie d'une panne NVMe : les condensateurs morts qui ralentissaient tout

Pendant deux mois et demi, un hyperviseur a accumulé des timeouts de réplication sans qu'aucun disque ne soit « mort ». Le coupable : les condensateurs de Power Loss Protection d'un NVMe, tombés en panne en silence. Autopsie complète : du symptôme au smartctl, du remplacement OVH au resilver qui a révélé 20 000 erreurs latentes.

nvmeplp
Virtualisation

Proxmox HA en production : ce que les tutoriels ne disent pas

Activer la haute disponibilité Proxmox prend cinq minutes. La comprendre nous a pris des pannes : conteneurs qui ne migrent jamais à chaud, failback sans lequel les machines ne reviennent jamais, priorités lues à l'envers, et le qm stop qui ne stoppe rien. Retour d'un cluster de production, 31 ressources en HA.

proxmoxhaute disponibilité

Une infrastructure infogérée et supervisée 24/7 ?

Bastion, SIEM, correctifs décidés, sauvegardes testées : ce que nous appliquons à nos clients. Premier échange gratuit.