Configurer la double authentification SSH (2FA/MFA) sur Debian 13
- Mise à jour le 17 août 2025

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
- 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 :

- 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 :

- 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 ligneauth required pam_google_authenticator.so nullok
en haut du fichier.auth
: indique que cette ligne s’applique à la phase d’authentificationrequired
: signifie que le contrôle est obligatoire ; l’authentification échouera si celui-ci ne réussit paspam_google_authenticator.so
: le module PAM qui active le TOTPnullok
: 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 suryes
- Ajoutez
# 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: