Aller au contenu

Ma configuration SSH

·8 mins
Sommaire

Dès lors qu’on administre des serveurs à distance, SSH devient la norme. Le problème c’est que bien souvent la configuration par défaut n’est pas suffisamment sécurisée. Voyons donc comment configurer OpenSSH de manière à avoir quelque chose de vraiment solide côté serveur.

Les clés serveur et client
#

Le protocole SSH permet trois méthode d’authentification : par mot de passe, clé ou certificat. Nous verrons plus loin pour désactiver l’authentification par mot de passe, ce qui nous laisse avec les clés et les certificats. Les certificats nécessitant de déployer une autorité de certification, c’est une solution principalement utilisée en entreprise.

Le client et le serveur ont chacun une clé ou certificat. Actuellement, trois principaux algorithmes sont supportés : RSA, ECDSA et Ed25519. D’une manière général, il est préférable de bannir RSA qui est un véritable champ de mines. Il nous reste donc deux algorithmes basés sur les courbes elliptiques. ECDSA est standardisé par le NIST mais critiqué pour sa difficulté d’implémentation ainsi que pour sa conception sous-optimale. Nous préférerons donc utiliser exclusivement Ed25519.

La liste des algorithmes supportés par la commande ssh -Q HostKeyAlgorithms. Notez que les variantes sk concernent les clés de sécurité (SK pour Security Key). Suivant votre situation, vous pouvez ou non les utiliser.

HostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com
# HostKeyAlgorithms sk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com
PubkeyAcceptedAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com
# PubkeyAcceptedAlgorithms sk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com

L’échange de clés
#

Afin de pouvoir échanger de manière chiffrée, le serveur et le client doivent se mettre d’accord sur une clé. Ceci est donc logiquement réalisé à l’aide d’un protocole d’échange de clé basé sur la cryptographie asymétrique.

Si vous avez suivi l’actualité de ces dernières années, vous savez qu’une des craintes actuelles est l’apparition d’un ordinateur quantique suffisamment puissant pour casser les protocoles classiques de cryptographie asymétrique. Une technique fréquente des services de renseignement est celle du « stockons aujourd’hui, déchiffrons demain » qui consiste à enregistrer dès à présent tout ce qui peut s’avérer utile dans l’espoir de pouvoir un jour obtenir le technologie nécessaire pour le déchiffrer. Cette technique nous impose d’utiliser dès à présent des algorithmes post-quantiques afin de ne pas se retrouver en mauvaise posture le moment venu.

Le RSSI et la cryptographe
#

Le RSSI, ayant procrastiné
Tout l’été,
Se trouva fort dépourvu
Quand l’ordinateur quantique fut venu :
Pas un seul petit morceau
De RSA ou de courbe elliptique.
Il alla crier famine
Chez la cryptographe sa voisine,
La priant de lui prêter
Quel qu’algorithme pour subsister
Jusqu’à la prochaine version.
« Je vous paierai, lui dit-il,
Avant l’Oût, foi d’administratif,
Intérêt et principal. »
La cryptographe n’est pas prêteuse :
C’est là son moindre défaut.
Que faisiez-vous à la période de transition ?
Dit-elle à cette emprunteur.
– Nuit et jour à tout venant
J’assistais à des réunions, ne vous déplaise.
– Vous assistiez à des réunions ? J’en suis fort aise.
Eh bien ! notifiez votre violation de donnés maintenant.

La commande pour connaître les algorithmes d’échange de clés supportés par OpenSSH est ssh -Q kex.

Notons qu’à cause du manque de recul sur ces algorithmes post-quantiques, la démarche la plus sécuritaire à prendre est d’utiliser un algorithme hybride qui utilise donc à la fois un algorithme classique et un algorithme post-quantique. Plusieurs mode d’hybridations sont possibles, mais cela dépasse grandement le sujet de cet article.

Une première expérimentation d’algorithme post-quantique hybride basée sur NTRU (Streamlined NTRU Prime en vrai, d’où l’abréviation sntrup mais ne chipotons pas) et X25519 est arrivée dans OpenSSH en 2019 grace à la version 8.0. Cette expérimentation a dû être corrigée d’une manière non-rétro-compatible en 2021 (OpenSSH v8.5). En 2022, cette nouvelle version a été introduite dans la liste des algorithmes supportés par défaut (OpenSSH v8.9) puis a été propulsée en tête de cette liste (OpenSSH v9.0) afin d’être utilisée par défaut.

Capture d'écran d'une discussion sur Bluesky au sujet du support d'un algorithme post-quantique pour l'échange de clés lors des connexion SSH à GitHub. La première réponse de Filippo Valsorda (cryptographe en charge de la bibliothèque standard cryptographique du langage Go) est « Wait, with Streamlined NTRU Prime?! », ce a quoi Deirdre Connolly (célèbre cryptographe) répond « yep 🫠🫠🫠 ». Les réponses suivantes évoquent l'absence de support de ML-KEN par libssh et le fait que l'implémentation de cet algorithme soit en cours.
Les expert·e·s en cryptographie ne sont pas impressionné·e·s par NTRU. (source)

En 2024, OpenSSH 9.9 introduit un nouvel algorithme post-quantique hybride basé cette fois sur ML-KEM et X25519, qui est la standardisation par le NIST de Kyber. En 2025, avec OpenSSH 10.0 ce nouvel algorithme est désormais utilisé par défaut à la place du précédent.

En conséquent, si l’on n’utilisez que des versions récentes d’OpenSSH, il est préférable de n’autoriser que l’algorithme mlkem768x25519-sha256. Si vous avez des versions un peu moins à jour (Debian bookworm sans les backports, Ubuntu 22.04 LTS, 24.04 LTS et 24.10), il est possible d’ajouter sntrup761x25519-sha512 et sntrup761x25519-sha512@openssh.com. Les versions plus anciennes (Debian bullseye) ne supportant pas ces algorithmes post-quantiques devraient être bannies.

KexAlgorithms mlkem768x25519-sha256
# Retro-compatibility only:
# KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com

Le chiffrement
#

Une fois l’échange de clés effectué, les communications sont chiffrées à l’aide d’un algorithme de chiffrement symétrique. La liste des algorithmes supportés est disponible avec la commande ssh -Q cipher.

De nos jours, ce qui se fait de mieux ce sont des algorithmes de chiffrement authentifié avec données associées (AEAD). Il nous faut donc ne garder que ces modes là, ce qui restreint grandement la liste des possibles.

Si les algorithmes AEAD incluent de base un code d’authentification (MAC) permettant de vérifier son intégrité, ce n’était pas le cas des algorithmes plus anciens. Il est donc possible de définir les algorithmes utilisés pour calculer le MAC des messages. Je ne sais pas si c’est très utile dans le cas présent dans la mesure où nous n’avons autorisé que des algorithmes AEAD, mais par précaution restreignons les MAC possibles aux seuls algorithmes reconnus comme fiable. La liste est disponible avec la commande ssh -Q mac. Notons qu’ici les algorithmes ne disposant pas de la mention etm (encrypt-then-mac) fonctionnent en mode mac-then-encrypt et sont donc à bannir.

Ciphers chacha20-poly1305@openssh.com,aes128-gcm@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com

L’authentification
#

Si vous pensiez que pour désactiver l’authentification par mot de passe il suffisait de passer PasswordAuthentication à no, j’ai une mauvaise pour vous. En effet, beaucoup de configurations par défaut activent, à raison, UsePAM. Or, l’authentification interactive de PAM permet également de s’authentifier avec un mot de passe. Bref, il nous faut également désactiver KbdInteractiveAuthentication. Et tant que nous y sommes, désactivons également les mots de passe vides, juste au cas où.

Afin d’éviter certains abus d’authentification, réduisons le nombre de tentative par connexion ainsi que le temps que chaque connexion peut rester sans s’authentifier.

PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
MaxAuthTries 2
LoginGraceTime 30

Divers
#

Maintenant, assurons nous de quelques paramètres qui améliorent un peu la sécurité.

  • PrintLastLog permet, à la connexion, d’afficher la dernière fois où l’on s’est connecté ;
  • StrictModes permet de s’assurer que les fichiers des utilisateurs ne sont pas librement accessibles ;
  • PermitUserEnvironment définit s’il est possible où non de définir des variables d’environnement dans la configuration, ce que l’on évitera de faire ;
  • AllowTcpForwarding permet d’autoriser ou non les redirections TCP, ce que l’on évitera ;
  • GatewayPorts permet de spécifier si les machines distantes sont autorisées à se connecter à des ports redirigés pour le client ;
  • X11Forwarding permet d’autoriser ou non les redirections du protocole graphique X11, ce que l’on évitera.
PrintLastLog yes
StrictModes yes
PermitUserEnvironment no
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no

Audit
#

Afin de vous assurer de la bonne configuration d’un serveur SSH, il est possible d’utiliser l’outil ssh-audit. Cet outil est vraiment bien fait, mon seul reproche si j’ose dire c’est qu’il n’est sans doute pas assez paranoïaque à mon goût.

$ ssh-audit "example.org"

Et bien entendu, si vous avez besoin de diagnostiquer un problème de connexion ou bien juste vérifier ce que fait votre client, vous pouvez toujours lancer ssh en mode verbose. Plus vous ajoutez de v plus le log sera complet. Notez que chaque ligne commence par une indication du niveau de log l’ayant déclenchée (debug1, debug2, debug3).

$ ssh -v "example.org"
$ ssh -vv "example.org"
$ ssh -vvv "example.org"

Fichiers finaux
#

J’ai choisi de diviser ma configuration en plusieurs fichiers. À cette fin, il faut commencer par s’assurer que le fichier /etc/ssh/sshd_config contienne la ligne permettant d’inclure les autres fichiers de configuration :

Include /etc/ssh/sshd_config.d/*.conf

J’ai donc d’abord créé un fichier de durcissement générique qui contient tout ce qui est commun à l’ensemble de mes machines. C’est le fichier /etc/ssh/sshd_config.d/10-hardened.conf.

#
# Hardened OpenSSH configuration
#

# Host and client keys
HostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com
PubkeyAcceptedAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com

# Key exchange and encryption
KexAlgorithms mlkem768x25519-sha256
Ciphers chacha20-poly1305@openssh.com,aes128-gcm@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com

# Authentication
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
MaxAuthTries 2
LoginGraceTime 30

# Misc
PrintLastLog yes
StrictModes yes
PermitUserEnvironment no
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no

Ensuite, vient un fichier spécifique pour chaque machine qui permet de limiter les utilisateurs autorisés. C’est le fichier /etc/ssh/sshd_config.d/20-users.conf.

# PermitRootLogin prohibit-password
PermitRootLogin no
AllowUsers derpina toto

Alternatives à OpenSSH
#

OpenSSH n’est pas la seule implémentation du protocole SSH : deux alternatives bien connues sont Dropbear et wolfSSH. Le problème de ces alternatives est qu’elles sont plutôt destinées aux systèmes embarqués et ne sont donc pas configurables comme peut l’être OpenSSH. À la place il faut de les compiler avec les options que l’on souhaite. Les paquets pré-compilés que vous pouvez trouver dans certaines distributions ne sont donc pas forcément adaptés et peuvent inclure des paramètres dangereux que vous ne pourrez pas toujours désactiver.