Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 713 minIntermédiaire

DMZ avec pfSense et proxy inverse HAProxy

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • mettre en place une DMZ sur une interface dédiée du pare-feu ;
  • fournir à la DMZ le DNS et l'heure sans ouvrir l'accès aux serveurs internes ;
  • cloisonner les serveurs d'une même DMZ entre eux ;
  • publier un site par le proxy inverse HAProxy avec un certificat Let's Encrypt.

3 exercices corrigés

Une DMZ (zone démilitarisée) est un réseau isolé, branché sur une interface dédiée du pare-feu, qui accueille les serveurs joignables depuis Internet ; le pare-feu n'y laisse entrer que les services publiés et n'en laisse presque rien sortir vers le réseau interne. Ce chapitre met en œuvre la DMZ de Sorbier sur pfSense : architecture, serveur, services que le pare-feu rend à la DMZ, cloisonnement entre serveurs, puis publication par un proxy inverse HAProxy avec un certificat Let's Encrypt.

Pourquoi une DMZ

Un serveur publié sur Internet sera attaqué : ce n'est pas une hypothèse. La DMZ limite les conséquences de sa compromission. Si srv-web est piraté, l'attaquant se retrouve dans un réseau d'où il ne peut joindre ni les postes, ni l'annuaire, ni les partages : seulement l'API de srv-gestion, sur un port, et l'envoi de ses journaux. Le choix des zones et des flux, et la comparaison des architectures, sont expliqués dans le cours Cybersécurité des infrastructures ; ici, on construit.

ArchitecturePrincipeChez qui
Pare-feu à trois pattes (ou plus)Une interface WAN, une interface DMZ, une ou plusieurs interfaces internes, sur le même pare-feuLes PME, dont Sorbier
Deux pare-feu en cascadeUn pare-feu externe entre Internet et la DMZ, un pare-feu interne entre la DMZ et l'intérieur, idéalement de deux marques différentesLes organisations plus exposées : une faille d'un produit ne suffit pas à traverser

La DMZ de Sorbier

  • Interface : vtnet2, branchée sur le pont vmbr2 de Proxmox, lui-même relié au switch de la DMZ par le port eno3 de l'hôte. Une carte et un pont dédiés plutôt qu'un VLAN du trunk interne : une erreur de configuration du trunk ne peut pas mélanger la DMZ et l'intérieur, et la séparation se voit sur le schéma.
  • Adressage : 192.168.10.224/28, passerelle 192.168.10.238 (pfSense). srv-web est en 192.168.10.225.
  • Serveur : srv-web, une machine virtuelle Debian 13 qui fait tourner le site de suivi des livraisons ; sa carte est branchée sur vmbr2, sans étiquette.

Configuration réseau de srv-web (/etc/network/interfaces) :

text
auto ens18
iface ens18 inet static
    address 192.168.10.225/28
    gateway 192.168.10.238

Et son résolveur, dans /etc/resolv.conf : nameserver 192.168.10.238. srv-web n'est pas membre du domaine Active Directory et n'interroge pas les contrôleurs de domaine : une machine de la DMZ ne doit avoir aucune raison de parler à l'annuaire.

Ce que pfSense rend à la DMZ

Le pare-feu fournit à la DMZ les services de base, pour qu'elle n'ait besoin d'aucun serveur interne :

  • le DNS : le résolveur Unbound du pare-feu écoute par défaut sur toutes les interfaces (Services > DNS Resolver, champ Network Interfaces) ; srv-web l'interroge sur 192.168.10.238 ;
  • l'heure : Services > NTP, cocher l'interface DMZ dans Interface ; pfSense synchronise sa propre horloge sur des serveurs publics et la sert à la DMZ ;
  • les journaux : srv-web les envoie à Wazuh par son agent, seul flux vers l'intérieur avec l'API.

Les règles de l'onglet DMZ sont au chapitre 5 ; la redirection du port 443 au chapitre 6.

Cloisonner les serveurs de la DMZ entre eux

Le jour où la DMZ accueille un deuxième serveur (le relais de messagerie, le serveur SFTP des transporteurs), ces serveurs sont dans le même réseau : ils se parlent sans passer par pfSense. Si l'un est compromis, il attaque l'autre. Trois parades :

ParadePrincipe
Une DMZ par serveurUn petit réseau (un /29 ou un /30) et une interface pfSense par serveur : tout flux entre eux traverse le pare-feu
Le pare-feu de ProxmoxLe pare-feu intégré à l'hyperviseur filtre au niveau de chaque carte virtuelle : srv-web n'accepte que le port 443 et le SSH depuis le bastion, quoi qu'il arrive dans le réseau
Le pare-feu local du serveurnftables sur Debian n'accepte que les ports utiles ; la moins chère, mais un attaquant qui a les droits administrateur sur le serveur peut la désactiver

C'est la micro-segmentation, présentée dans le cours Cybersécurité des infrastructures : on combine en général le pare-feu de l'hyperviseur et celui du serveur.

Le proxy inverse : pourquoi

Une redirection de port envoie les paquets tels quels au serveur : le pare-feu ne regarde pas ce qu'ils contiennent. Un proxy inverse (reverse proxy) reçoit lui-même la connexion du client, déchiffre le HTTPS, lit la requête, puis ouvre une seconde connexion vers le serveur interne. Il apporte :

  • plusieurs sites sur une seule adresse publique et un seul port 443 : le proxy choisit le serveur selon le nom demandé (suivi.sorbier.example, transporteurs.sorbier.example) ;
  • la terminaison TLS au même endroit, avec des certificats Let's Encrypt renouvelés automatiquement ;
  • la répartition de charge et le contrôle de santé quand il y a plusieurs serveurs pour un même site (cours Haute disponibilité) ;
  • un serveur caché : le client ne voit que le proxy ; on peut ajouter des en-têtes de sécurité, limiter les méthodes HTTP, refuser les chemins d'administration.

Sorbier publie aujourd'hui un seul site : la redirection de port suffit. Quand le portail des transporteurs ouvrira, sur un second serveur de la DMZ, il faudra publier deux sites sur la même adresse : c'est le moment de passer au proxy inverse. Sur pfSense, il s'installe en paquet : HAProxy.

Installer HAProxy et ACME

System > Package Manager > Available Packages : installe haproxy (le paquet stable ; haproxy-devel suit la branche de développement) et acme (le client du protocole ACME, celui de Let's Encrypt). Les menus apparaissent dans Services.

Le port 443 du pare-feu. HAProxy va écouter sur l'adresse publique, port 443. Or l'interface web de pfSense écoute déjà sur le port 443 de toutes les adresses du pare-feu : HAProxy ne pourrait pas démarrer. Change d'abord le port de l'interface web : System > Advanced > Admin Access, TCP port 10443, puis reconnecte-toi sur https://192.168.10.222:10443. Mets à jour la règle d'administration de l'onglet ADMIN si elle vise le port 443.

Le certificat. Services > ACME Certificates :

  1. Onglet Account keys : Add, un nom, ACME Server Let's Encrypt Production ACME v2 (le serveur Staging sert aux essais, ses certificats ne sont pas reconnus), une adresse électronique de l'équipe ; Create new account key, puis Register ACME account key.
  2. Onglet Certificates : Add, Name suivi-sorbier, le compte créé, une clé privée ECDSA ou RSA, et dans Domain SAN list le nom suivi.sorbier.example avec sa méthode de validation. La méthode DNS (par l'interface de programmation de l'hébergeur DNS, ou manuelle) prouve la possession du domaine sans ouvrir de port ; la méthode HTTP impose que le port 80 de l'adresse publique réponde au défi.
  3. Dans Actions list, une commande qui recharge HAProxy après chaque renouvellement.
  4. Issue/Renew : le certificat apparaît dans System > Cert. Manager et se renouvellera seul.

Configurer HAProxy

Services > HAProxy, trois onglets :

  1. Backend : Add, nom be_suivi. Dans Server list, une ligne : nom srv-web, adresse 192.168.10.225, port 443, case de chiffrement (Encrypt (SSL)) cochée si le serveur parle HTTPS (recommandé : le trafic reste chiffré jusqu'au serveur). Health check method : HTTP, sur une page légère du site. HAProxy retire de la rotation un serveur qui ne répond plus.
  2. Frontend : Add, nom fe_https. Listen address : WAN address (IPv4), port 443, case SSL Offloading cochée. Type : http / https (offloading). Default Backend : be_suivi. Dans la section du certificat (SSL Offloading), choisis le certificat suivi-sorbier. Pour un second site, une règle de contrôle d'accès (Access Control lists) du type « l'en-tête Host vaut transporteurs.sorbier.example » et une action Use Backend vers son propre backend.
  3. Settings : Enable HAProxy, un nombre maximal de connexions adapté à la mémoire, Save, Apply Changes.

Il reste à remplacer la redirection de port par une règle qui autorise le trafic vers le pare-feu lui-même : Firewall > NAT > Port Forward, supprime la redirection du port 443 (sa règle associée disparaît avec elle) ; puis Firewall > Rules > WAN : Pass, TCP, source any, destination WAN address, port 443, description « HTTPS vers HAProxy ». HAProxy ouvre ensuite lui-même la connexion vers srv-web : c'est un flux émis par le pare-feu, autorisé en sortie.

Redirection de port ou proxy inverse ?

Redirection de portProxy inverse HAProxy
CoucheRéseau et transport (adresses, ports)Application (HTTP)
Plusieurs sites sur une adresse et le port 443ImpossibleOui, selon le nom demandé
CertificatsSur chaque serveurCentralisés sur le pare-feu (ou de bout en bout)
Adresse du client vue par le serveurLa vraieCelle du proxy, plus l'en-tête X-Forwarded-For
ProtocolesTousHTTP et HTTPS surtout (TCP possible)
Charge pour le pare-feuFaibleDéchiffrement TLS : processeur et mémoire
Filtrage du contenuAucunPossible (méthodes, chemins, en-têtes) ; pour un vrai pare-feu applicatif web (WAF), un produit dédié

Exercices

Exercice 1 sur 3 Concevoir une DMZ Réussi À revoir

Une agence de voyages veut publier son site de réservation (serveur web) qui lit une base de données MariaDB, et recevoir ses courriels sur un relais de messagerie. Elle a un pfSense avec un WAN, un LAN des postes et des serveurs internes, et une carte libre.

  1. Où places-tu le serveur web, la base de données et le relais de messagerie ? Justifie.
  2. Écris la matrice des flux qui concernent la DMZ.
  3. Comment empêches-tu le relais de messagerie compromis d'attaquer le serveur web ?
Voir la réponseMasquer la réponse de l'exercice 1
  1. Le serveur web et le relais de messagerie en DMZ, sur l'interface libre : ils sont joignables depuis Internet. La base de données reste dans le réseau des serveurs internes : elle contient les données des clients et ne doit pas être joignable depuis Internet ; seul le serveur web l'atteint, sur un port précis.
  2. Internet → serveur web : TCP 443 (et 80 redirigé) ; Internet → relais : TCP 25 ; serveur web → base de données interne : TCP 3306, journalisé ; relais → serveur de messagerie interne : TCP 25 ; DMZ → pare-feu : DNS, NTP ; DMZ → dépôts de mises à jour : HTTP, HTTPS ; DMZ → serveur de journaux : envoi des journaux ; réseau d'administration → DMZ : SSH ; tout le reste refusé et journalisé, en particulier DMZ → réseaux internes.
  3. Les deux serveurs sont dans le même réseau et se parlent sans passer par le pare-feu. Solutions : deux DMZ distinctes (deux interfaces ou deux VLAN, chacun sa passerelle sur pfSense), ou un filtrage au plus près des machines : pare-feu de l'hyperviseur sur chaque carte virtuelle, pare-feu local de chaque serveur, qui n'acceptent que leurs ports publiés et le SSH depuis l'administration.

Tu avais trouvé ?

Exercice 2 sur 3 HAProxy refuse de démarrer Réussi À revoir

Après avoir configuré un frontend HAProxy sur WAN address, port 443, le service ne démarre pas et le journal indique qu'il ne peut pas se lier au port 443. Explique et corrige. Quelle autre règle faut-il vérifier après la correction ?

Voir la réponseMasquer la réponse de l'exercice 2

L'interface web de pfSense écoute déjà sur le port 443 de toutes les adresses du pare-feu : le port est pris. Correction : System > Advanced > Admin Access, changer le TCP port de l'interface web (par exemple 10443), se reconnecter sur ce port, puis redémarrer HAProxy. Après le changement, il faut adapter la règle d'administration de l'onglet ADMIN (port 10443 au lieu de 443) avant de désactiver la règle anti-lockout, et vérifier que la règle WAN n'autorise que le port 443 vers WAN address : l'interface web, sur son nouveau port, ne doit toujours pas être joignable depuis Internet.

Tu avais trouvé ?

Exercice 3 sur 3 Le serveur web qui parle trop Réussi À revoir

Un samedi à 3 h 12, Wazuh remonte ces blocages de l'onglet DMZ :

HeureRègleSourceDestinationProtocole
03:12:04DMZ vers interne refusé192.168.10.225:41022192.168.10.177:445TCP:S
03:12:04DMZ vers interne refusé192.168.10.225:41023192.168.10.177:389TCP:S
03:12:05DMZ vers interne refusé192.168.10.225:41024192.168.10.178:445TCP:S
03:12:09Refus final DMZ192.168.10.225:52011198.51.100.66:4444TCP:S
  1. Qu'en déduis-tu ?
  2. La DMZ a-t-elle rempli son rôle ?
  3. Quelles sont tes premières actions ?
Voir la réponseMasquer la réponse de l'exercice 3
  1. srv-web, qui n'a aucune raison d'ouvrir ces connexions, tente SMB et LDAP vers les contrôleurs de domaine et le serveur de fichiers (reconnaissance ou propagation latérale), puis une connexion vers une adresse d'Internet sur un port inhabituel (une tentative de joindre un serveur de commande de l'attaquant). Le serveur est très probablement compromis.
  2. Oui : chaque tentative a été bloquée, et journalisée, par les règles « DMZ vers interne refusé » et « Refus final DMZ ». Sans DMZ, ces connexions auraient atteint l'annuaire.
  3. Isoler srv-web (désactiver sa carte réseau dans Proxmox ou bloquer toute la DMZ par une règle flottante) sans l'éteindre, pour garder la mémoire comme preuve ; prendre un instantané de la machine virtuelle ; conserver les journaux du pare-feu et de Wazuh ; déclarer l'incident selon la procédure ; rechercher la faille exploitée avant toute remise en service, et reconstruire le serveur plutôt que le « nettoyer ». La démarche complète est dans le cours Réponse à incident.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : DHCP et DNS : pfSense ou Active Directory ?Revoir le sommaire du cours