Déploiement

Sécurité du VPS

Durcissement du VPS de production — pare-feu, SSH, fail2ban et Docker.

Sécurité du VPS

Ce document décrit les mesures de sécurité appliquées sur le VPS de production.

Pare-feu (ufw)

Seuls trois ports sont autorisés en entrée, tous les autres sont bloqués par défaut.

PortProtocoleUsage
22TCPSSH
80TCPHTTP (redirigé vers HTTPS par Traefik)
443TCPHTTPS
# Vérifier l'état du pare-feu
sudo ufw status verbose

# En cas de réinstallation
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable

Protection brute-force SSH (fail2ban)

fail2ban surveille les tentatives de connexion SSH et bannit automatiquement les IP suspectes.

ParamètreValeur
Tentatives avant ban5
Fenêtre d'observation10 minutes
Durée initiale du ban1 heure
RécidiveDurée × 2 à chaque ban
# Vérifier les IP bannies
sudo fail2ban-client status sshd

# Débannir une IP manuellement
sudo fail2ban-client set sshd unbanip <IP>

# Voir les logs
sudo journalctl -u fail2ban -f

La configuration est dans /etc/fail2ban/jail.d/sshd.local.

Durcissement SSH

Configuration appliquée dans /etc/ssh/sshd_config.d/99-hardening.conf :

DirectiveValeurRaison
PermitRootLoginnoLogin root direct interdit
PasswordAuthenticationnoAuthentification par clé uniquement
MaxAuthTries3Maximum 3 tentatives par connexion
LoginGraceTime20Fenêtre d'authentification limitée à 20s
X11ForwardingnoInutile sur un serveur
AllowAgentForwardingnoPas de forwarding d'agent SSH
AllowTcpForwardingnoPas de tunnel TCP via SSH
L'accès SSH repose exclusivement sur une clé publique/privée. Ajouter la clé publique dans ~/.ssh/authorized_keys avant de modifier cette config.
# Vérifier la config SSH sans redémarrer
sudo sshd -t

# Recharger après modification
sudo systemctl reload ssh

Sécurité Docker

Ports exposés

Aucun service applicatif n'est exposé directement sur l'hôte. Tout le trafic transite par Traefik.

ServiceRéseauPorts hôte
traefikweb80, 443
back-prodweb + internalaucun
front-prodwebaucun
doc-prodwebaucun
database-prodinternalaucun

Segmentation réseau

Deux réseaux Docker sont utilisés :

  • web — réseau partagé entre Traefik et les services qui doivent être accessibles publiquement
  • internal — réseau isolé (internal: true), sans accès internet, pour la base de données

Dashboard Traefik

Le dashboard Traefik est désactivé en production. Les options --api.dashboard et --api.insecure ne doivent pas figurer dans la configuration.

Mises à jour automatiques

unattended-upgrades est actif et applique automatiquement les correctifs de sécurité du système.

# Vérifier l'état
systemctl status unattended-upgrades

# Voir l'historique des mises à jour
cat /var/log/unattended-upgrades/unattended-upgrades.log