Sécuriser SSH avec Google Authenticator (2FA)

Le mot de passe seul ne suffit plus. Pour sécuriser l'accès à vos serveurs critiques, l'ajout d'un code unique temporaire (OTP) est une pratique recommandée. Ce guide explique comment configurer OpenSSH pour demander un code Google Authenticator à la connexion.

Principe du MFA : Vous devrez fournir "Ce que vous savez" (votre mot de passe) ET "Ce que vous possédez" (votre téléphone avec l'application).

1. Installation du module

Sur les distributions modernes (Debian/Ubuntu), le module PAM nécessaire est directement disponible dans les dépôts officiels. Pas besoin de compiler !

sudo apt update
sudo apt install libpam-google-authenticator -y

2. Configuration de l'utilisateur (Génération du Token)

Chaque utilisateur qui souhaite se connecter avec la 2FA doit générer son secret. Connectez-vous avec l'utilisateur concerné (ex: thomas) et lancez :

google-authenticator

L'assistant va vous poser plusieurs questions. Voici les réponses recommandées :

  1. Make tokens "time-based" (y/n) : y (C'est le standard TOTP).
  2. Scan du QR Code : Un énorme QR Code s'affiche dans le terminal. Scannez-le avec l'application Google Authenticator (ou Authy, Bitwarden...).
  3. Update your "/home/user/.google_authenticator" file? : y (Sauvegarde la config).
  4. Disallow multiple uses of the same authentication token? : y (Empêche le rejeu d'un code, plus sûr).
  5. Increase the time-skew window? : n (Sauf si l'horloge de votre serveur n'est pas fiable).
  6. Enable rate-limiting? : y (Limite les tentatives de brute-force).
Sauvegardez les codes de secours : L'outil vous affiche des emergency scratch codes. Notez-les en lieu sûr (papier ou coffre-fort numérique). Ils sont le seul moyen de se connecter si vous perdez votre téléphone.

3. Configuration de SSH

Il faut maintenant dire à SSH d'utiliser ce module.

Attention Critique : Gardez toujours votre session SSH actuelle ouverte (ou ouvrez-en une deuxième de secours) pendant ces modifications. Si vous faites une erreur de configuration, vous ne pourrez plus entrer !

A. Activer le module PAM

Editez le fichier PAM de SSH :

sudo nano /etc/pam.d/sshd

Ajoutez cette ligne tout en haut du fichier (ou juste après @include common-auth) :

auth required pam_google_authenticator.so

B. Modifier la config SSH

Editez le fichier de configuration du démon SSH :

sudo nano /etc/ssh/sshd_config

Recherchez et modifiez (ou ajoutez) ces directives. Attention, sur les versions récentes d'OpenSSH, ChallengeResponseAuthentication est remplacé par KbdInteractiveAuthentication.

# Active l'interaction clavier (nécessaire pour demander le code)
KbdInteractiveAuthentication yes
# (Note : Sur les vieux systèmes, utilisez "ChallengeResponseAuthentication yes")

# Assurez-vous que PAM est actif
UsePAM yes

4. Finalisation

Redémarrez le service SSH pour appliquer les changements :

sudo systemctl restart ssh

5. Test de connexion

Ouvrez un nouveau terminal (ne fermez pas l'ancien !) et tentez de vous connecter :

ssh thomas@mon-serveur

Le serveur doit vous demander :

  1. Password: (Votre mot de passe système habituel)
  2. Verification code: (Le code à 6 chiffres de votre téléphone)
Clés SSH et 2FA : Par défaut, si vous utilisez une clé SSH, la 2FA sera ignorée (la clé suffit).
Pour forcer la 2FA même avec une clé, ajoutez cette ligne dans votre sshd_config :
AuthenticationMethods publickey,keyboard-interactive