Retour au cours

cyber / cybersecurite-fondamentale

Sécurité réseau : pare-feu, segmentation et IDS/IPS

Leçon 131 exercice

Explication

Ce que vous allez apprendre

  • Configurer un pare-feu selon le principe "tout refuser, puis autoriser explicitement" (whitelist)
  • Distinguer un pare-feu stateless d'un pare-feu stateful
  • Segmenter un réseau en zones (DMZ, applicatif, données, administration) pour limiter l'impact d'une compromission
  • Différencier IDS et IPS, et détection par signature vs détection par anomalie
  • Mettre en place fail2ban pour réagir automatiquement à des tentatives de connexion suspectes

Dans quel contexte ?

Une entreprise découvre qu'un attaquant, après avoir compromis un simple serveur web public, a pu se connecter directement à la base de données de production et à un serveur d'administration interne, car tout le réseau communiquait sans restriction. Une segmentation correcte (DMZ pour le serveur web, réseau isolé pour la base de données) aurait limité l'incident au seul serveur web compromis, sans laisser l'attaquant rebondir plus loin.

Changement de niveau : de l'application au réseau

Après les vulnérabilités applicatives (OWASP Top 10), on remonte d'un cran : comment protéger le réseau qui transporte et héberge ces applications. Un pare-feu est le premier filtre : il décide quel trafic entre et sort, selon des règles.

La bonne philosophie : tout refuser, puis autoriser explicitement

Piège fréquent

Un pare-feu mal conçu commence par tout autoriser et bloque au cas par cas les menaces connues — une approche perdante car on ne peut pas prévoir toutes les menaces futures. La bonne pratique inverse la logique : on part d'un refus total, puis on ouvre explicitement chaque flux dont on a la preuve qu'il est légitime et nécessaire. Tout ce qui n'a pas été explicitement autorisé est automatiquement bloqué.

Pourquoi segmenter le réseau

Un réseau plat, où tout communique avec tout, transforme une seule machine compromise en porte d'entrée vers l'ensemble du système d'information. Segmenter en zones revient à cloisonner un bateau : une brèche dans un compartiment ne coule pas le navire entier.

ZoneContientAccessible depuis Internet ?
DMZReverse proxy, API gatewayOui, en façade
Réseau applicatifServices backendNon, seulement depuis la DMZ
Réseau de donnéesBases de donnéesNon, seulement depuis l'applicatif
Réseau d'administrationAccès SSH/bastionNon, restreint par IP + MFA

IDS vs IPS : détecter n'est pas bloquer

Un IDS (Intrusion Detection System) observe le trafic et alerte en cas d'anomalie, sans intervenir — un gardien qui prévient mais n'agit pas. Un IPS (Intrusion Prevention System) va plus loin et bloque activement le trafic suspect. La détection par signature reconnaît des attaques déjà connues et documentées ; la détection par anomalie repère des comportements inhabituels même inédits, au prix de davantage de fausses alertes.

Lien avec les leçons suivantes

Une fois le réseau segmenté et surveillé, il reste à durcir chaque couche applicative individuellement — c'est l'objet des leçons sur les headers de sécurité et les cookies qui suivent.

Commandes & code

Sécurité réseau : pare-feu, segmentation et IDS/IPS

text
# Pare-feu (firewall) : filtre le trafic selon des règles (IP source/dest, port, protocole, état)
Stateless : évalue chaque paquet indépendamment (rapide, moins précis)
Stateful  : suit l'état des connexions (ex: n'autorise une réponse que si la requête sortante existe)
bash
# iptables : règles de base pour un serveur exposant une API web (drop par défaut = whitelist)
iptables -P INPUT DROP                                   # tout refuser par défaut en entrée
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

iptables -A INPUT -i lo -j ACCEPT                         # autoriser loopback
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  # autoriser les réponses aux connexions sortantes
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT       # SSH uniquement depuis le réseau admin
iptables -A INPUT -p tcp --dport 443 -j ACCEPT             # HTTPS ouvert au public
iptables -A INPUT -p tcp --dport 80 -j ACCEPT              # HTTP (redirection vers HTTPS uniquement)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " # journaliser avant le drop final implicite
bash
# nftables (successeur moderne d'iptables), équivalent plus lisible
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input iifname "lo" accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport 22 ip saddr 10.0.0.0/24 accept
nft add rule inet filter input tcp dport 443 accept
text
# Segmentation réseau : limiter le "blast radius" d'une compromission
DMZ (zone démilitarisée)  : serveurs exposés publiquement (reverse proxy, API gateway)
Réseau applicatif         : services backend, isolés du réseau public direct
Réseau de données          : bases de données, accessible UNIQUEMENT depuis le réseau applicatif
Réseau d'administration    : accès SSH/bastion, isolé, accès restreint par IP + MFA

# Règle d'or : la base de données ne doit JAMAIS être directement joignable depuis Internet
yaml
# Exemple de segmentation avec Docker Compose : réseaux internes séparés
services:
  api:
    build: ./backend
    networks: [frontend_net, backend_net]

  db:
    image: postgres:16
    networks: [backend_net]        # PAS de réseau frontend -> injoignable depuis l'extérieur
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password

  reverse_proxy:
    image: nginx:alpine
    networks: [frontend_net]
    ports: ["443:443"]

networks:
  frontend_net:
  backend_net:
    internal: true                 # aucune route vers l'extérieur, isolation forte
text
# IDS (Intrusion Detection System) vs IPS (Intrusion Prevention System)
IDS : détecte et alerte, n'intervient pas sur le trafic (passif, en dérivation - "tap"/"span port")
IPS : détecte ET bloque en temps réel, en ligne sur le chemin du trafic (actif)

# Approches de détection
Signature-based : compare le trafic à une base de signatures d'attaques connues (rapide, faux négatifs sur 0-day)
Anomaly-based   : détecte les écarts par rapport à une baseline de trafic normal (détecte l'inconnu, plus de faux positifs)
bash
# Suricata : IDS/IPS open-source, exemple de règle personnalisée détectant un scan de ports agressif
# /etc/suricata/rules/local.rules
alert tcp any any -> $HOME_NET any (msg:"Scan de ports détecté - nombreuses connexions courtes";   flags:S; threshold:type both, track by_src, count 20, seconds 10; sid:1000001; rev:1;)

# Lancer Suricata en mode IDS (écoute passive) sur une interface réseau
suricata -c /etc/suricata/suricata.yaml -i eth0
bash
# fail2ban : réagit aux logs (ex: échecs SSH répétés) en ajoutant des règles de blocage dynamiques
# /etc/fail2ban/jail.local
cat <<'EOF' > /etc/fail2ban/jail.local
[sshd]
enabled = true
port    = 22
maxretry = 5
findtime = 600
bantime  = 3600
EOF
systemctl restart fail2ban
fail2ban-client status sshd

Résumé

  • Un pare-feu bien conçu part d'une politique "tout refuser" puis autorise explicitement (whitelist).
  • La segmentation réseau (DMZ, applicatif, données, admin) limite l'impact d'une compromission.
  • IDS détecte et alerte, IPS détecte et bloque ; signature-based et anomaly-based sont complémentaires.
  • fail2ban/Suricata automatisent la réaction à des comportements suspects observés dans les logs/trafic.

Exercices pratiques

1 disponible
1

Mission : le rebond depuis le serveur web vers la base de production

Objectif : Analyser un incident de compromission par manque de segmentation et concevoir une architecture réseau qui l'aurait limité.

Contexte

Après une intrusion via une faille applicative sur son serveur web public, Technologik découvre que l'attaquant a pu se connecter directement au serveur PostgreSQL de production ET au panneau d'administration interne, car les trois machines communiquaient librement sur le même réseau plat, sans aucune règle de pare-feu entre elles.

Résoudre l’exercice →