rss logo

Configurer la double authentification SSH (2FA/MFA) sur Debian 13

OpenSSH logo with 2FA certified stamp

Dans cet article, je vais expliquer comment mettre en place la double authentification (MFA/2FA) pour les connexions SSH sur Debian 13. La MFA/2FA ajoute une couche de sécurité supplémentaire au mot de passe traditionnel. Lors de la connexion à un hôte distant protégé par la MFA/2FA, il vous sera d’abord demandé de saisir un code à 6 chiffres, puis votre mot de passe habituel.

Ce code de vérification est généré à partir d’un secret partagé (entre l’appareil et le serveur), de l’heure actuelle (d’où la nécessité que les horloges du serveur et de l’appareil soient synchronisées) et d’un algorithme de hachage. Ce mécanisme suit la norme TOTP (Time-based One-Time Password).

Il est important de comprendre que cette méthode ne dépend d’aucun fournisseur tiers : le serveur n’a pas besoin d’une connexion Internet pour contacter Google ou tout autre service externe.

Serveur SSH

L’objectif est de sécuriser les connexions SSH (au lieu de se reposer uniquement sur un mot de passe) en demandant aux utilisateurs de fournir un mot de passe à usage unique (OTP).

Configuration de libpam-google-authenticator

  • Installez le paquet libpam-google-authenticator, qui permet la génération de codes à usage unique pour les plateformes mobiles, ainsi qu’un module PAM (Pluggable Authentication Module) :
root@debian:~# apt update && apt install libpam-google-authenticator
  • Une fois libpam-google-authenticator installé, basculez sur le compte utilisateur pour lequel vous souhaitez activer la double authentification (MFA/2FA). Par exemple, ici nous passons sur l’utilisateur john :
root@debian:~# su - john

💡 Remarque : si vous perdez votre clé, relancez simplement l’application google-authenticator pour en générer une nouvelle.

  • Exécutez la commande google-authenticator pour générer votre clé secrète et configurer l’OTP :
john@debian:~$ google-authenticator

Do you want authentication tokens to be time-based (y/n) y
  • Scannez le QR code généré avec une application OTP sur votre téléphone, par exemple FreeOTP ou Proton Pass :
QR code généré par Google Authenticator lors de la configuration de la 2FA SSH
  • Copiez la clé secrète (utile pour KeePass, voir ci-dessous) et saisissez le code généré par votre application d’authentification — ici 907039 — puis appuyez sur Entrée :
Your new secret key is: C3GTKGEKBQNIHQTXQRLCZJUMUY
Enter code from app (-1 to skip): 907039
  • Je recommande également de configurer un gestionnaire de mots de passe comme KeePass, qui est nativement compatible avec les OTP, afin d’avoir une solution de secours en cas de perte de votre téléphone :
Configuration de KeePass pour générer des OTP à partir d’une clé secrète pour la 2FA SSH
  • Une fois le code OTP confirmé, copiez les codes de secours dans un endroit sûr (par exemple dans votre KeePass — oui, j’insiste ! 😜). Ensuite, répondez aux questions de sécurité selon vos besoins (appuyez sur y en cas de doute) :
Code confirmed
Your emergency scratch codes are:
  37376676
  48157307
  91160405
  59889865
  38533612

Do you want me to update your "/home/john/.google_authenticator" file? (y/n) y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server,
we allow an extra token before and after the current time. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) y

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n) y

Modification de /etc/pam.d/sshd

  • Éditez le fichier /etc/pam.d/sshd et ajoutez la ligne auth required pam_google_authenticator.so nullok en haut du fichier.
    • auth : indique que cette ligne s’applique à la phase d’authentification
    • required : signifie que le contrôle est obligatoire ; l’authentification échouera si celui-ci ne réussit pas
    • pam_google_authenticator.so : le module PAM qui active le TOTP
    • nullok : si le fichier ~/.google_authenticator n’existe pas, le TOTP est ignoré. Supprimez cette option si vous souhaitez imposer le TOTP pour toutes les connexions.
# PAM configuration for the Secure Shell service
auth       required     pam_google_authenticator.so nullok
# Standard Unix authentication.
@include common-auth

Modification de /etc/ssh/sshd_config

  • Éditez le fichier /etc/ssh/sshd_config et appliquez les changements suivants :
    • Ajoutez ChallengeResponseAuthentication yes
    • Vérifiez que KbdInteractiveAuthentication est défini sur yes
# Ajoutez cette ligne :
ChallengeResponseAuthentication yes
# Modifiez cette ligne :
KbdInteractiveAuthentication yes
  • Enfin, redémarrez le service sshd pour appliquer les changements :
root@debian:~# systemctl restart sshd

Client SSH

  • À présent, avec l’une de vos applications OTP configurées, essayez de vous connecter à votre serveur depuis un hôte distant. Entrez d’abord l’OTP actuel généré par votre application, puis saisissez le mot de passe de votre compte :
[user@arch ~]$ ssh -l john 192.168.1.10
(john@192.168.1.10) Verification code: 
(john@192.168.1.10) Password: