
Sécuriser SSH avec des algorithmes post-quantiques
Pourquoi le post-quantique maintenant
L'objection habituelle — « les ordinateurs quantiques, c'est loin » — ignore une menace bien concrète et actuelle : le harvest now, decrypt later. Un attaquant capture le trafic chiffré aujourd'hui, le stocke, et attend vingt ans que la technologie quantique permette de le déchiffrer rétroactivement.
Pour un NAS perso, le risque reste limité. Mais OpenSSH supporte les algos post-quantiques depuis la 9.x et Debian 13 embarque une version assez fraîche : autant prendre les bonnes habitudes.
Les clés hôte
Par défaut, Debian génère ECDSA, Ed25519 et RSA. On supprime ECDSA et DSA (obsolètes) pour ne garder qu'Ed25519 et RSA 4096 :
# Supprimer les clés hôte non souhaitées
rm -f /etc/ssh/ssh_host_ecdsa_key*
rm -f /etc/ssh/ssh_host_dsa_key*
# Régénérer la clé RSA en 4096 bits si nécessaire
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
Puis on est explicite dans sshd_config :
# /etc/ssh/sshd_config - Clés hôte
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
Ed25519 en priorité — compact, rapide, basé sur Curve25519 — et RSA 4096 en backup pour les clients pas à jour.
Échanges de clés post-quantiques
OpenSSH propose des algos hybrides combinant un échange classique (X25519) avec un algo post-quantique. Si l'algo post-quantique se révèle faible, la sécurité classique reste intacte — et inversement.
# /etc/ssh/sshd_config - Échange de clés
KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512@openssh.com,curve25519-sha256,diffie-hellman-group16-sha512
- mlkem768x25519-sha256 : hybride ML-KEM 768 (standard NIST FIPS 203, ex-CRYSTALS-Kyber) + X25519. L'option la plus récente et la recommandation actuelle.
- sntrup761x25519-sha512@openssh.com : hybride NTRU Prime 761 + X25519, présent depuis plus longtemps dans OpenSSH, excellent fallback.
- curve25519-sha256 : échange classique, pour les clients sans support post-quantique.
- diffie-hellman-group16-sha512 : DH classique en dernier recours.
Chiffrement et MACs
# /etc/ssh/sshd_config - Chiffrement
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
ChaCha20-Poly1305 par défaut, performant et bien étudié ; les AES-GCM pour les machines avec accélération AES-NI, dont l'Intel N95.
Authentification durcie
Clés SSH uniquement, pas de mots de passe :
# /etc/ssh/sshd_config - Authentification
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
PermitRootLogin no impose de passer par nasadmin puis sudo, MaxAuthTries 3 limite le brute-force, et LoginGraceTime 30 réduit la fenêtre d'authentification à trente secondes, ce qui décourage rapidement les bots.
Bannière d'avertissement
Souvent ignorée, elle est pourtant obligatoire dans certaines juridictions pour pouvoir poursuivre une tentative d'intrusion :
# /etc/ssh/sshd_config
Banner /etc/ssh/banner.txt
# /etc/ssh/banner.txt
*************************************************************
WARNING: Unauthorized access to this system is prohibited.
All connections are monitored and recorded.
By connecting, you agree to comply with applicable policies.
*************************************************************
Automatisation avec Ansible
Le tout est déployé via un rôle Ansible s'appuyant sur la collection devsec.hardening, qui applique des centaines de règles basées sur CIS et ANSSI :
# playbook.yml - extrait
- name: Harden SSH
hosts: nas
roles:
- role: devsec.hardening.ssh_hardening
vars:
ssh_kex:
- mlkem768x25519-sha256
- sntrup761x25519-sha512@openssh.com
- curve25519-sha256
- diffie-hellman-group16-sha512
ssh_host_key_algorithms:
- ssh-ed25519
- rsa-sha2-512
- rsa-sha2-256
ssh_ciphers:
- chacha20-poly1305@openssh.com
- aes256-gcm@openssh.com
- aes128-gcm@openssh.com
ssh_allow_users: nasadmin
ssh_max_auth_retries: 3
Le playbook est idempotent : le relancer cinquante fois ne change rien.
Côté client et vérification
Une clé Ed25519 côté client, et un contrôle des algos supportés :
# Générer une clé Ed25519
ssh-keygen -t ed25519 -C "user@workstation"
# Vérifier les algos supportés
ssh -Q kex
Si mlkem768x25519-sha256 apparaît dans la sortie, le client est compatible. Après déploiement, on valide la négociation réelle :
ssh -vv nasadmin@192.168.1.50 2>&1 | grep "kex:"
# Résultat attendu :
# debug1: kex: algorithm: mlkem768x25519-sha256
Configurer SSH en post-quantique n'est ni complexe ni coûteux en performance : avec OpenSSH 9.x et Debian 13, tout est disponible, il suffit de poser les bons paramètres et de laisser Ansible faire le reste.
Articles similaires