Un VPS exposé à Internet sans sécurisation est compromis en moyenne en moins de 24 heures. Pourtant, les mesures essentielles prennent moins de 30 minutes à mettre en place.
Voici la checklist que j'applique sur chaque serveur de production.

1. SSH : désactiver l'authentification par mot de passe

C'est la mesure numéro 1. Les bots scannent en continu les ports 22 et tentent des milliers de combinaisons login/mot de passe par heure.

# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password

Générez une paire de clés Ed25519 sur votre machine locale :

ssh-keygen -t ed25519 -C "votre@email.fr"
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@votre-vps

Redémarrez SSH : systemctl restart sshd. Testez la connexion par clé AVANT de fermer votre session actuelle.

2. Firewall : UFW

UFW (Uncomplicated Firewall) est le firewall par défaut d'Ubuntu. Configurez-le pour n'autoriser que le strict nécessaire :

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp   # SSH
ufw allow 80/tcp   # HTTP (pour Let's Encrypt)
ufw allow 443/tcp  # HTTPS
ufw enable

N'ouvrez jamais le port MySQL (3306), Redis (6379), ou tout autre service interne au réseau.

3. Fail2ban : bloquer les brute-force

Fail2ban surveille les logs et bannit les IPs qui échouent trop de tentatives :

apt install fail2ban
systemctl enable fail2ban
systemctl start fail2ban

La configuration par défaut protège SSH. Après quelques jours, vous verrez typiquement des dizaines d'IPs bannies : ce sont des bots qui auraient eu accès si vous aviez gardé l'auth par mot de passe.

4. Docker : ne pas exposer les ports internes

Erreur classique : publier les ports des services internes dans docker-compose.yml.

# MAUVAIS : MySQL accessible depuis Internet
mysql:
  ports:
    - "3306:3306"
CORRECT : MySQL accessible uniquement par les autres conteneurs

Avec Traefik comme reverse proxy, seuls les ports 80 et 443 doivent être publiés.

5. Mises à jour automatiques

Les mises à jour de sécurité Ubuntu doivent être appliquées automatiquement :

apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

6. Monitoring

Un serveur non surveillé est un serveur vulnérable. Mettez en place :

  • Uptime Kuma : surveillance de la disponibilité de vos services (alertes par email/Telegram)
  • Netdata : métriques système en temps réel (CPU, RAM, disque, réseau)

Ces deux outils sont open-source, légers (~60 Mo de RAM à eux deux), et se déploient en Docker.

7. Backups

Le dernier point mais pas le moindre : des sauvegardes automatiques et testées.

  • MySQL : mysqldump quotidien via cron
  • Données Ghost : tar des volumes Docker
  • Stockage distant : envoyez les backups sur un service externe (S3, rsync vers un autre serveur)

Conclusion

Ces 7 mesures transforment un VPS vulnérable en une plateforme de production sécurisée. Elles prennent moins d'une heure à mettre en place et évitent 99% des compromissions courantes. Le coût de la sécurité est négligeable comparé au coût d'une intrusion.