Cours RechercherCtrl K

Sécuriser un serveur Leçon 3

La double authentification

Demander, en plus de la clé, un code à 6 chiffres qui change toutes les 30 secondes.

25 min

À la fin de cette leçon, tu sauras

  • Comprendre les codes à usage unique (TOTP)
  • Installer et configurer google-authenticator pour SSH
  • Combiner clé et code, avec une exception pour la maison

Deux preuves valent mieux qu'une

La double authentification (A2F) demande deux choses de nature différente : quelque chose que tu as (ta clé SSH, ton téléphone) et quelque chose que tu sais ou qui change sans cesse (un code). Si l'une est volée, l'autre protège encore.

Les applis comme Google Authenticator, Microsoft Authenticator ou Aegis calculent un code TOTP : à partir d'un secret partagé une seule fois (le QR code) et de l'heure, elles produisent un nombre à 6 chiffres qui change toutes les 30 secondes. Le serveur fait le même calcul et compare. Aucun réseau n'est nécessaire au téléphone.

Mise en place sur un serveur Debian

sudo apt install libpam-google-authenticator
google-authenticator          # en TON nom (pas sudo) : affiche le QR code et les codes de secours

Scanne le QR code avec ton appli et range les codes de secours en lieu sûr (hors du serveur) : ils servent si tu perds ton téléphone. Le secret est enregistré dans ~/.google_authenticator.

Ensuite, deux réglages :

  1. PAM, le système qui vérifie les identités sous Linux, doit demander le code : on ajoute une ligne à /etc/pam.d/sshd ;
  2. SSH doit exiger la clé puis le code.
echo "auth required pam_google_authenticator.so" | sudo tee -a /etc/pam.d/sshd

echo "KbdInteractiveAuthentication yes" | sudo tee /etc/ssh/sshd_config.d/00-a2f.conf
echo "AuthenticationMethods publickey,keyboard-interactive" | sudo tee -a /etc/ssh/sshd_config.d/00-a2f.conf

sudo sshd -t
sudo systemctl reload ssh

publickey,keyboard-interactive (avec une virgule) veut dire : la clé et ensuite le code. Avec un espace à la place de la virgule, l'une ou l'autre suffirait.

Pour aller plus loin : sur Debian, PAM demande aussi le mot de passe du compte (la ligne @include common-auth). Pour « clé + code » seulement, on met cette ligne en commentaire en la précédant d'un #.

Une exception pour la maison

Un bloc Match change les règles pour certaines connexions. À la fin du fichier, on peut se contenter de la clé depuis son adresse personnelle :

Match Address 198.51.100.10
    AuthenticationMethods publickey

Attention : teste toujours la connexion avec code dans une deuxième fenêtre avant de fermer ta session actuelle. Et vérifie que l'heure du serveur est juste (timedatectl) : avec une horloge décalée, tous les codes sont refusés.

À retenir

  • A2F : deux preuves différentes, par exemple la clé SSH et un code du téléphone.
  • Un code TOTP se calcule à partir d'un secret partagé (le QR code) et de l'heure ; il change toutes les 30 secondes.
  • google-authenticator se lance en ton nom ; les codes de secours se rangent hors du serveur.
  • PAM : auth required pam_google_authenticator.so dans /etc/pam.d/sshd.
  • SSH : KbdInteractiveAuthentication yes et AuthenticationMethods publickey,keyboard-interactive (virgule = les deux).

Voir la fiche de révision de cette leçon (à imprimer ou à relire avant un contrôle)

Exercice 1 · Clé + code pour SSH

Moyen

Mets en place la double authentification pour SSH :

  1. installe le paquet libpam-google-authenticator ;
  2. génère ton secret avec google-authenticator (en ton nom, sans sudo) ;
  3. ajoute à la fin de /etc/pam.d/sshd la ligne auth required pam_google_authenticator.so ;
  4. crée /etc/ssh/sshd_config.d/00-a2f.conf avec KbdInteractiveAuthentication yes et AuthenticationMethods publickey,keyboard-interactive ;
  5. vérifie la configuration, puis recharge SSH.
commandes.sh
eleve@cours: ~

Tape tes commandes ici ou dans le fichier à gauche : chaque commande tapée dans le terminal est ajoutée au fichier.

Consignes à réussir

  • À faire : libpam-google-authenticator est installé
  • À faire : Le secret ~/.google_authenticator existe
  • À faire : google-authenticator est lancé sans sudo
  • À faire : PAM demande le code
  • À faire : Les lignes d'origine de PAM sont gardées (tee -a)
  • À faire : KbdInteractiveAuthentication vaut yes
  • À faire : La clé ET le code sont exigés
  • À faire : sshd -t avant le rechargement
Toujours bloqué ? Voir une solution
sudo apt install libpam-google-authenticator
google-authenticator
echo "auth required pam_google_authenticator.so" | sudo tee -a /etc/pam.d/sshd
echo "KbdInteractiveAuthentication yes" | sudo tee /etc/ssh/sshd_config.d/00-a2f.conf
echo "AuthenticationMethods publickey,keyboard-interactive" | sudo tee -a /etc/ssh/sshd_config.d/00-a2f.conf
sudo sshd -t
sudo systemctl reload ssh

Exercice 2 · Virgule ou espace ?

Pour aller plus loin

Un collègue a configuré l'A2F, mais n'importe qui possédant seulement la clé peut entrer. Il a écrit AuthenticationMethods publickey keyboard-interactive (avec un espace).

  1. affiche la valeur réellement appliquée avec sshd -T et grep authenticationmethods ;
  2. réécris /etc/ssh/sshd_config.d/00-a2f.conf pour exiger la clé et le code (en gardant KbdInteractiveAuthentication yes) ;
  3. vérifie la configuration et recharge SSH.
commandes.sh
eleve@cours: ~

Tape tes commandes ici ou dans le fichier à gauche : chaque commande tapée dans le terminal est ajoutée au fichier.

Consignes à réussir

  • À faire : La valeur appliquée est affichée
  • À faire : La clé ET le code sont exigés
  • À faire : KbdInteractiveAuthentication vaut toujours yes
  • À faire : SSH est rechargé après vérification
Toujours bloqué ? Voir une solution
# la configuration du collègue (ne pas modifier)
echo "KbdInteractiveAuthentication yes" | sudo tee /etc/ssh/sshd_config.d/00-a2f.conf
echo "AuthenticationMethods publickey keyboard-interactive" | sudo tee -a /etc/ssh/sshd_config.d/00-a2f.conf

# à toi :
sudo sshd -T | grep authenticationmethods
echo "KbdInteractiveAuthentication yes" | sudo tee /etc/ssh/sshd_config.d/00-a2f.conf
echo "AuthenticationMethods publickey,keyboard-interactive" | sudo tee -a /etc/ssh/sshd_config.d/00-a2f.conf
sudo sshd -t
sudo systemctl reload ssh

Quiz

1De quoi a besoin l'appli pour calculer le code ?
2Que veut dire AuthenticationMethods publickey,keyboard-interactive ?
3Pourquoi lancer google-authenticator sans sudo ?