6 couches de défensefail2ban · CrowdSecUFW firewallGeoIP2 · SSH hardenedRotation des clés
6
COUCHES DE DÉFENSE
3
SERVEURS PROTÉGÉS
0
EXPOSITION SSH WAN
LAN
UNIQUEMENT ACCÈS SSH
// défense en profondeur — modèle en couches
$ cat defense-in-depth.json
Chaque couche intercepte une catégorie de menaces différente. Une attaque doit traverser
toutes les couches pour atteindre l'application. Modèle inspiré du principe de moindre
privilège et de la segmentation réseau.
module nginx base MaxMind restriction géo whitelist admin
08
CrowdSec
collections nginx collections linux bouncer firewall AppSec WAF 7422
// UFW — règles type
$ cat ufw-rules.txt
Politique par défaut : tout bloquer en entrée, tout autoriser en sortie. Ouverture explicite
des services nécessaires uniquement. Le réseau local est traité différemment (SSH LAN uniquement).
// UFW — POLITIQUE DENY ALL + OUVERTURES EXPLICITES
# Politique par défaut
ufw default deny incoming
ufw default allow outgoing
# Services publics
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
# SSH — LAN uniquement (jamais exposé sur internet)
ufw allow in to [NGINX_IP] port [SSH_PORT] proto tcp \
from [LAN_SUBNET] comment 'SSH LAN only'
# Monitoring interne — LAN uniquement
ufw allow in to [NGINX_IP] port 8080 proto tcp \
from [LAN_SUBNET] comment 'Monitoring LAN'
# Règles sortantes explicites (backends)
ufw allow out to [BACKEND_IP_A] port 80
ufw allow out to [BACKEND_IP_B] port 80
# Activer
ufw enable && ufw status numbered
// fail2ban — configuration type
$ cat fail2ban-config.txt
fail2ban surveille les logs et bannit les IPs après N échecs dans une fenêtre de temps.
Le réseau local est systématiquement whitelisté pour éviter l'auto-blocage lors des rotations
de clés ou des tests.
// /ETC/FAIL2BAN/JAIL.LOCAL
# /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 [LAN_SUBNET]
bantime = 1h
findtime = 10m
maxretry = 3
banaction = nftables
[sshd]
enabled = true
port = [SSH_PORT]
backend = systemd
maxretry = 3
bantime = 2h
findtime = 10m
# Vérifier qu'un jail est actif :# fail2ban-client status sshd# Vérifier la whitelist LAN :# fail2ban-client get sshd ignoreip
// CrowdSec — analyse comportementale + WAF
$ cat crowdsec-stack.txt
CrowdSec analyse les logs en temps réel et bannit les IPs dont le comportement correspond
à des patterns d'attaque connus. Le bouncer firewall bloque au niveau réseau. L'AppSec WAF
(port 7422) intercepte les attaques applicatives avant qu'elles atteignent le backend.
Firewall Bouncer
Lit les décisions CrowdSec → bannit via nftables au niveau réseau.
Actif sur les 3 serveurs.
AppSec WAF
auth_request nginx → analyse chaque requête sur port 7422 →
bloque SQLi/XSS/traversal. Actif sur les vhosts publics.
Une clé ed25519 dédiée par serveur. Pas de réutilisation de clé entre destinations.
Rotation périodique. Le LAN est systématiquement whitelisté dans fail2ban avant toute
rotation pour éviter le lockout.
01
Génération clé
ssh-keygen -t ed25519 -C "[usage]" une clé par lien
02
Déploiement
ssh-copy-id ou authorized_keys test avant durcissement
03
Hardening sshd
Port [non-standard] PermitRootLogin prohibit-password PasswordAuth no
04
Rotation
nouvelle clé → déploiement → test → retrait ancienne LAN whitelisté f2b