Pourquoi sécuriser votre VPS est la premiere chose a faire
Un VPS (Virtual Private Server) exposé sur internet est attaque en permanence. Des bots automatises scannent les ports ouverts, tentent des connexions SSH avec des mots de passe courants, et exploitent les services non mis a jour. Si vous hebergez un site WordPress, une application ou un serveur mail pour votre entreprise au Sénégal, un VPS non sécurisé sera compromis en quelques heures.
Ce guide couvre les étapes essentielles pour sécuriser un serveur Ubuntu/Debian fraichement installé chez un hébergeur comme DigitalOcean, Hetzner, OVH ou Contabo.
Étape 1 : Mise a jour du système
Premiere chose a faire après la connexion initiale en root :
apt update && apt upgrade -y
Cette commande met a jour la liste des paquets et installé toutes les mises a jour de sécurité. Faites-le régulièrement (au minimum chaque semaine) ou configurez les mises a jour automatiques :
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
Choisissez « Yes » pour activer les mises a jour de sécurité automatiques.
Étape 2 : Créer un utilisateur non-root
Ne jamais travailler en root au quotidien. Créez un utilisateur avec des droits sudo :
adduser déployer
usermod -aG sudo déployer
Testez la connexion avec ce nouvel utilisateur avant de désactiver root :
ssh déployer@VOTRE_IP
Vérifiez que sudo fonctionne :
sudo apt update
Étape 3 : Authentification par clé SSH
Les mots de passe sont vulnerables aux attaques par brute force. Les clés SSH sont incomparablement plus sures.
Sur votre ordinateur local :
ssh-keygen -t ed25519 -C "votre@email.com"
Appuyez Entree pour le chemin par défaut (~/.ssh/id_ed25519). Ajoutez un mot de passe (passphrase) pour protéger la clé.
Copier la clé publique sur le serveur :
ssh-copy-id déployer@VOTRE_IP
Ou manuellement :
cat ~/.ssh/id_ed25519.pub | ssh déployer@VOTRE_IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Testez la connexion par clé (pas de mot de passe demande) :
ssh déployer@VOTRE_IP
Étape 4 : Sécuriser la configuration SSH
Editez le fichier de configuration SSH :
sudo nano /etc/ssh/sshd_config
Modifications essentielles :
| Paramètre | Valeur | Pourquoi |
|---|---|---|
| Port | 2222 (ou autre port non-standard) | Réduit les attaques automatisees sur le port 22 |
| PermitRootLogin | no | Interdit la connexion directe en root |
| PasswordAuthentication | no | Force l’utilisation des clés SSH |
| PubkeyAuthentication | yes | Active l’authentification par clé |
| MaxAuthTries | 3 | Limite les tentatives de connexion |
| AllowUsers | déployer | Seul cet utilisateur peut se connecter en SSH |
Redemarrez SSH pour appliquer :
sudo systemctl restart sshd
IMPORTANT : Gardez votre session SSH actuelle ouverte et testez la nouvelle configuration dans un autre terminal AVANT de fermer. Si la config est mauvaise, vous pourriez vous verrouiller hors du serveur.
Étape 5 : Configurer le pare-feu (UFW)
UFW (Uncomplicated Firewall) est le pare-feu le plus simple sous Ubuntu :
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment "SSH"
sudo ufw allow 80/tcp comment "HTTP"
sudo ufw allow 443/tcp comment "HTTPS"
sudo ufw enable
Vérifiez les règles :
sudo ufw status verbose
Regles selon vos services :
| Service | Port | Commande UFW |
|---|---|---|
| SSH (port personnalise) | 2222 | sudo ufw allow 2222/tcp |
| HTTP | 80 | sudo ufw allow 80/tcp |
| HTTPS | 443 | sudo ufw allow 443/tcp |
| MySQL (local uniquement) | 3306 | NE PAS ouvrir — accès local seulement |
| PostgreSQL (local uniquement) | 5432 | NE PAS ouvrir — accès local seulement |
Étape 6 : Installer Fail2Ban contre le brute force
Fail2Ban surveille les logs et bloque automatiquement les IP qui echouent trop de connexions :
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Configuration recommandee dans [sshd] :
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
3 échecs en 10 minutes = IP bannie pendant 1 heure.
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Étape 7 : Sécuriser les services web (Nginx/Apache)
Headers de sécurité Nginx :
Ajoutez dans votre bloc server {} :
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
server_tokens off;
SSL/TLS avec Let’s Encrypt (gratuit) :
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d votredomaine.com -d www.votredomaine.com
Certbot configuré automatiquement la redirection HTTP → HTTPS et le renouvellement automatique du certificat.
Étape 8 : Sécuriser MySQL/MariaDB
sudo mysql_secure_installation
Repondez :
- Set root password : Yes (mot de passe fort)
- Remove anonymous users : Yes
- Disallow root login remotely : Yes
- Remove test database : Yes
- Reload privilege tables : Yes
Créer un utilisateur dedie par application :
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'MotDePasseComplexe123!';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
Chaque application doit avoir son propre utilisateur MySQL avec des droits limites a sa base de données.
Étape 9 : Sauvegardes automatiques
Un serveur sans sauvegarde est un serveur que vous acceptez de perdre.
Script de sauvegarde quotidienne :
#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/home/déployer/backups"
mkdir -p $BACKUP_DIR
# Sauvegarde base de données
mysqldump -u root -p'VotreMotDePasse' --all-databases | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Sauvegarde fichiers web
tar -czf $BACKUP_DIR/web_$DATE.tar.gz /var/www/
# Supprimer les sauvegardes de plus de 30 jours
find $BACKUP_DIR -type f -mtime +30 -delete
# Copie vers stockage externe (Google Drive via rclone)
rclone copy $BACKUP_DIR remote:backups-vps/
Automatisez avec cron :
crontab -e
# Sauvegarde tous les jours a 3h du matin
0 3 * * * /home/déployer/scripts/backup.sh >> /var/log/backup.log 2>&1
Étape 10 : Surveillance et alertes
Surveiller les connexions :
# Dernires connexions reussies
last -n 20
# Tentatives echouees
sudo grep "Failed password" /var/log/auth.log | tail -20
# Qui est connecté maintenant
who
Surveiller l’espace disque :
df -h
Installer un outil de surveillance léger :
sudo apt install logwatch -y
Logwatch envoie un résumé quotidien par email des événements du serveur.
Checklist sécurité VPS
- ☐ Système mis a jour (apt update && apt upgrade)
- ☐ Mises a jour automatiques configurees (unattended-upgrades)
- ☐ Utilisateur non-root créé avec sudo
- ☐ Cles SSH configurees
- ☐ Connexion root désactivée dans sshd_config
- ☐ Authentification par mot de passe désactivée
- ☐ Port SSH change (pas 22)
- ☐ Pare-feu UFW activé avec règles minimales
- ☐ Fail2Ban installé et configuré
- ☐ SSL/TLS activé (Let’s Encrypt)
- ☐ Headers de sécurité web configurés
- ☐ MySQL sécurisé (pas de root distant, pas de base test)
- ☐ Sauvegardes automatiques en place
- ☐ Surveillance des logs activée