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.
À 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 secoursScanne 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 :
- PAM, le système qui vérifie les identités sous Linux, doit demander le code : on ajoute une ligne à
/etc/pam.d/sshd; - 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 sshpublickey,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 publickeyAttention : 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-authenticatorse lance en ton nom ; les codes de secours se rangent hors du serveur.- PAM :
auth required pam_google_authenticator.sodans/etc/pam.d/sshd. - SSH :
KbdInteractiveAuthentication yesetAuthenticationMethods 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 ✓ RéussiMets en place la double authentification pour SSH :
- installe le paquet
libpam-google-authenticator; - génère ton secret avec
google-authenticator(en ton nom, sans sudo) ; - ajoute à la fin de
/etc/pam.d/sshdla ligneauth required pam_google_authenticator.so; - crée
/etc/ssh/sshd_config.d/00-a2f.confavecKbdInteractiveAuthentication yesetAuthenticationMethods publickey,keyboard-interactive; - vérifie la configuration, puis recharge SSH.
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
Bravo, cet exercice est réussi !
- Indice 1 :
sudo apt install libpam-google-authenticator, puisgoogle-authenticatortout court. - Indice 2 : Ajouter sans écraser :
echo "auth required pam_google_authenticator.so" | sudo tee -a /etc/pam.d/sshd. - Indice 3 : Pour SSH : un
teepour la première ligne, untee -apour la deuxième, puissudo sshd -tetsudo systemctl reload ssh.
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 ✓ RéussiUn 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).
- affiche la valeur réellement appliquée avec
sshd -Tetgrep authenticationmethods; - réécris
/etc/ssh/sshd_config.d/00-a2f.confpour exiger la clé et le code (en gardantKbdInteractiveAuthentication yes) ; - vérifie la configuration et recharge SSH.
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
Bravo, cet exercice est réussi !
- Indice 1 :
sudo sshd -T | grep authenticationmethodsmontre « publickey keyboard-interactive » : deux méthodes au choix. - Indice 2 : Réécris le fichier : un
tee(sans -a) pourKbdInteractiveAuthentication yes, puis untee -apour la bonne ligne. - Indice 3 : La bonne valeur :
publickey,keyboard-interactive, avec une virgule. Puissudo sshd -tetsudo systemctl reload ssh.
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