Secure Shell Daemon & Crypto
Le serveur OpenSSH est un outil fondamental pour garantir des communications sûres sur des réseaux non fiables. Le protocole SSH permet aux administrateurs de gérer serveurs et machines à distance via un terminal bash, en utilisant une connexion totalement protégée.
La configuration et la mise en sécurité correctes d’OpenSSH sont cruciales : un serveur SSH mal configuré peut devenir la porte d’entrée pour des attaquants. Dans cet article, on voit comment configurer OpenSSH pour obtenir le niveau maximal de sécurité, en excluant les algorithmes obsolètes et en n’utilisant que de la cryptographie moderne et robuste.
Principes de sécurité SSH
Avant d’entrer dans les détails techniques, il est important de comprendre les principes de base de la sécurité SSH :
- Utilisation exclusive du Protocol 2 : le Protocol 1 est obsolète et vulnérable
- Clés fortes : seulement RSA (4096 bits) et Ed25519
- Exclusion des algorithmes faibles : pas de DSA, ECDSA avec courbes NIST, SHA1 ou MD5
- Perfect Forward Secrecy : protection des communications passées même si une clé est compromise
1. Préparation du serveur : suppression des clés par défaut
La première étape fondamentale est de supprimer toutes les clés par défaut générées lors de l’installation d’OpenSSH. Ces clés pourraient être faibles ou basées sur des algorithmes obsolètes.
On exécute ces commandes pour éliminer les anciennes clés et en générer de nouvelles, sûres :
# On se place dans le répertoire SSH
cd /etc/ssh
# On supprime TOUTES les clés existantes
rm ssh_host_*key*
# On génère une nouvelle clé Ed25519 (la plus sûre)
ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N "" < /dev/null
# On génère une clé RSA robuste (4096 bits)
ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N "" < /dev/null
Note importante : après cette opération, les clients qui s’étaient déjà connectés au serveur recevront un avertissement de changement de clé. C’est normal et attendu.
2. Configuration du protocole et des clés hôte
Dans le fichier /etc/ssh/sshd_config, on impose l’usage exclusif du Protocol 2 et on indique quelles clés utiliser :
# Utilise seulement le protocole sûr
Protocol 2
# Spécifie uniquement les clés sûres
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
3. Algorithmes d’échange de clés (Key Exchange)
L’échange de clés est le moment le plus critique de la connexion SSH. Pendant cette phase, client et serveur se mettent d’accord sur une clé secrète partagée qui sera utilisée pour chiffrer toute la communication.
On utilise uniquement des algorithmes qui garantissent Perfect Forward Secrecy et qui ne sont pas soupçonnés de contenir des backdoors :
# Dans /etc/ssh/sshd_config
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Pourquoi ces choix ?
- curve25519-sha256 : courbe elliptique moderne, non compromise par le NIST
- diffie-hellman-group-exchange-sha256 : version sûre du classique Diffie-Hellman avec SHA256
- Courbes NIST exclues : soupçonnées de contenir des backdoors NSA
4. Algorithmes d’authentification : pourquoi éviter DSA et ECDSA
Problèmes avec DSA
Les clés DSA sont limitées à 1024 bits, une taille considérée comme insuffisante depuis 2010. Elles sont vulnérables à :
- Des attaques de factorisation avec du hardware moderne
- Des vulnérabilités dans la génération de nombres aléatoires
Problèmes avec ECDSA
ECDSA présente deux soucis principaux :
- Dépendance à la qualité des nombres aléatoires : si le générateur de nombres aléatoires est faible, la clé privée peut être récupérée
- Courbes NIST suspectes : OpenSSH ne supporte que les courbes NIST pour ECDSA, fortement soupçonnées de contenir des backdoors
Les alternatives sûres : Ed25519 et RSA
Ed25519 est l’évolution sûre d’ECDSA :
- Utilise la courbe Curve25519, non compromise
- Excellentes performances
- Résistant aux attaques side-channel
RSA avec des clés de 4096 bits reste sûr si :
- On utilise des clés d’au moins 4096 bits
- On évite RSA-SHA1 pour les nouvelles implémentations
5. Configuration de l’authentification client
Génération des clés client
Côté client, on génère les deux types de clés sûres :
# Clé Ed25519 (recommandée)
ssh-keygen -t ed25519
# Clé RSA de backup
ssh-keygen -t rsa -b 4096
Important : protège toujours les clés privées avec une passphrase robuste !
Envoi de la clé publique au serveur
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname
Désactivation de l’authentification par mot de passe
Une fois l’authentification par clé configurée, on désactive immédiatement les mots de passe :
# Dans /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
6. Chiffres pour la protection des données
Après l’authentification, les données sont chiffrées. On n’utilise que des chiffres modernes et sûrs :
# Dans /etc/ssh/sshd_config
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
Pourquoi ces chiffres ?
- chacha20-poly1305 : chiffre stream moderne, rapide et sûr
- aes-gcm : mode authentifié d’AES, combine chiffrement et authentification
- aes-ctr : mode counter d’AES, sûr et parallélisable
7. MACs pour l’intégrité des données
Les Message Authentication Codes (MACs) garantissent que les données ne sont pas modifiées en transit :
# Dans /etc/ssh/sshd_config
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
Notes importantes sur les MACs :
- On n’utilise que SHA2-256 et SHA2-512 (SHA1 et MD5 sont vulnérables aux attaques par collision)
- Les versions « etm » (Encrypt-then-MAC) sont préférables pour la sécurité
- Taille minimale : 128 bits pour les clés et les tags
8. Configuration client
Dans le fichier ~/.ssh/config du client, on reproduit les paramètres de sécurité :
Host *
# Protocole et authentification
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
# Algorithmes d’authentification hôte
HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa
# Échange de clés
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
# Chiffres
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
# MACs
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
9. Vérification de la configuration
Après avoir appliqué toutes les modifications :
# Test de la configuration
sshd -t
# Restart du service
systemctl restart sshd
# Vérification des algorithmes actifs
ssh -Q kex
ssh -Q cipher
ssh -Q mac
10. Mesures de sécurité supplémentaires
Limiter les accès
# N’autoriser que des utilisateurs spécifiques
AllowUsers admin developer
# Ou n’autoriser que des groupes spécifiques
AllowGroups ssh-users
# Désactiver le login root
PermitRootLogin no
Protection contre les attaques brute force
# Nombre maximum de tentatives
MaxAuthTries 3
# Temps maximum pour s’authentifier
LoginGraceTime 20
# Nombre maximum de sessions
MaxSessions 2
11. Protection supplémentaire : custom chain iptables anti-bruteforce
Comme protection supplémentaire, on configure une chaîne iptables personnalisée pour limiter les tentatives de bruteforce sur SSH. On utilise le port 22222 au lieu du standard 22.
D’abord on modifie le port dans /etc/ssh/sshd_config :
Port 22222
Puis on crée la custom chain avec iptables :
# On crée une nouvelle chaîne appelée SSH_BRUTEFORCE
iptables -N SSH_BRUTEFORCE
# Dans la chaîne, on trace les nouvelles connexions avec le module recent
# Chaque IP est mémorisée dans la liste "sshbrute"
iptables -A SSH_BRUTEFORCE -m recent --name sshbrute --set
# Si une IP tente plus de 3 connexions en 60 secondes, elle est droppée
iptables -A SSH_BRUTEFORCE -m recent --name sshbrute --update --seconds 60 --hitcount 3 -j DROP
# Si l’IP respecte le rate limit, on accepte la connexion
iptables -A SSH_BRUTEFORCE -j ACCEPT
# On redirige le trafic TCP sur le port 22222 vers notre custom chain
iptables -A INPUT -p tcp --dport 22222 -m state --state NEW -j SSH_BRUTEFORCE
Comment ça marche :
- Le module
recentgarde la trace des IPs qui tentent de se connecter - Chaque nouvelle tentative de connexion est enregistrée avec
--set --hitcount 3compte les tentatives : à la troisième en 60 secondes, l’IP est bloquée- Après 60 secondes le compteur se réinitialise automatiquement
Pour rendre les règles persistantes au redémarrage :
# Sur systèmes Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4
# Sur systèmes RedHat/CentOS
service iptables save
Cette configuration simple bloque efficacement les attaques bruteforce automatisées, en permettant au maximum 2 tentatives de login par minute pour chaque IP.
Conclusions
Cette configuration d’OpenSSH offre le niveau maximal de sécurité actuellement disponible, en excluant tous les algorithmes faibles ou suspects. N’oublie pas de :
- Maintenir OpenSSH toujours à jour
- Surveiller les logs système pour des activités suspectes
- Revoir périodiquement la configuration à la lumière de nouvelles vulnérabilités
- Toujours utiliser des passphrases solides pour les clés privées
La sécurité n’est pas un produit mais un processus : cette configuration est un excellent point de départ, mais elle demande maintenance et mises à jour constantes.