Mise en place de l'authentification TOTP sur Debian¶

Informations¶
- Auteur : Louis MEDO
- Date : 05/09/2026
- Domaine : Exploitation des services
1. Sommaire¶
- 2. Contexte
- 3. Synchronisation du temps (NTP)
- 4. Installation des paquets TOTP
- 5. Génération et sécurisation du secret TOTP
- 6. Configuration du module PAM pour SSH
- 7. Configuration du service SSH
- 8. Génération du QR Code client
2. Contexte¶
La mise en place de l'authentification à double facteur (2FA) via le protocole TOTP (Time-Based One-Time Password) permet de renforcer la sécurité des accès SSH au système. L'algorithme TOTP reposant strictement sur une fenêtre temporelle, il est critique d'assurer une synchronisation parfaite de l'horloge locale avec des serveurs NTP pour éviter les désynchronisations et le rejet des codes valides. Un bypass sera également implémenté via PAM pour le compte de service adminbastion, garantissant le fonctionnement des flux d'automatisation.
3. Synchronisation du temps (NTP)¶
3.1. Installation et activation du service NTP. Installation de chrony pour assurer une synchronisation temporelle précise à la seconde près, prérequis absolu pour l'algorithme TOTP.
chrony: Démon de synchronisation temporelle (NTP), plus réactif et adapté que ntp classique.enable --now: Active le service au démarrage et le démarre immédiatement.chronyc tracking: Commande de vérification affichant les statistiques de synchronisation et le décalage actuel (offset).
Résultat de chronyc tracking :
Reference ID : 52408D90 (82-64-141-144.subs.proxad.net)
Stratum : 5
Ref time (UTC) : Sat Sep 05 13:09:50 2026
System time : 0.000005774 seconds fast of NTP time
Last offset : -0.003339077 seconds
RMS offset : 0.003339077 seconds
Frequency : 0.969 ppm slow
Residual freq : +101.807 ppm
Skew : 1000000.000 ppm
Root delay : 0.073084749 seconds
Root dispersion : 17.692459106 seconds
Update interval : 1.4 seconds
Leap status : Normal
4. Installation des paquets TOTP¶
4.1. Déploiement des dépendances requises. Installation des bibliothèques d'authentification PAM et des outils de génération de mots de passe à usage unique et de QR Codes.
libpam-oath: Module PAM permettant l'authentification via les composants de sécurité OATH.oathtool: Utilitaire en ligne de commande permettant de manipuler et de générer des clés OATH/TOTP.
5. Génération et sécurisation du secret TOTP¶
5.1. Génération de la clé cryptographique. Création d'un secret aléatoire hexadécimal et assignation au compte de l'utilisateur visé dans le fichier de configuration OATH.
openssl rand -hex 20: Génère une séquence aléatoire sécurisée de 20 octets au format hexadécimal.HOTP/T30/6: Déclare un token basé sur le temps (T30 = valide 30 secondes) générant un code à 6 chiffres.>> /etc/security/users.oath: Concatène la configuration à la fin du fichier centralisant les clés secrètes.
5.2. Sécurisation du fichier des clés. Verrouillage des droits d'accès au fichier contenant les secrets cryptographiques pour éviter les fuites.
chown root:root: Assigne la propriété exclusive du fichier à l'utilisateur et au groupe root.chmod 600: Restreint les permissions en lecture/écriture uniquement au propriétaire (root), bloquant tout autre utilisateur.
6. Configuration du module PAM pour SSH¶
6.1. Modification du tunnel d'authentification SSH. Édition du fichier PAM pour imposer l'authentification locale puis OTP, tout en excluant le compte de rebond adminbastion.
Remplacer la ligne @include common-auth et ajouter les règles spécifiques (Attention l'ordre est important !) :
# PAM configuration for the Secure Shell service
#@include common-auth
auth required pam_unix.so nullok_secure
auth [success=1 default=ignore] pam_succeed_if.so user = adminbastion
auth required pam_oath.so usersfile=/etc/security/users.oath window=30 digits=6
#@include common-auth: Ligne commentée car elle court-circuite l'obligation de l'OTP si le mot de passe système est valide.[success=1 default=ignore] pam_succeed_if.so user = adminbastion: Règle d'exception ; si l'utilisateur estadminbastion, PAM passe outre la règle d'authentification suivante (bypass 2FA).pam_unix.so nullok_secure: Impose la validation du mot de passe système en premier facteur (interdit les mots de passe vides).pam_oath.so: Déclenche le second facteur (OTP) en spécifiant le fichier des clés, une fenêtre temporelle (window=30) et la longueur du code (digits=6).
7. Configuration du service SSH¶
7.1. Activation de l'interaction clavier et redémarrage. Modification du démon SSH pour autoriser le dialogue (Challenge/Response) requis pour demander le code OTP.
Modifier ou ajouter les directives suivantes :
ChallengeResponseAuthentication yes: Autorise le serveur à interagir avec le client pour demander des informations supplémentaires (le code TOTP).UsePAM yes: Indique à SSHD de déléguer la politique d'authentification à la couche PAM que nous venons de configurer.
7.2. Application de la configuration. Relance du service pour charger les nouveaux paramètres.
restart: Coupe et relance le démonsshd, rendant la connexion 2FA immédiatement active.
8. Génération du QR Code client¶
8.1. Extraction et conversion du secret en Base32. Récupération de la clé hexadécimale générée précédemment et conversion pour compatibilité avec l'application client.
Récupérer la clé :
Copier la clé :
Conversion en Base32 :
Résultat :
5f0ee54c7
Hex secret: 562...
Base32 secret: KYVW... # Copier cette suite et garder là dans le gestionnaire de mots de passe
Digits: 6
Window size: 0
TOTP mode: SHA1
Step size (seconds): 30
Start time: 1970-01-01 00:00:00 UTC (0)
Current time: 2026-09-05 13:21:22 UTC (1788614482)
Counter: 0x38DBC82 (59620482)
cat: Affiche le contenu du fichier pour récupérer la clé hexadécimale de l'utilisateuretudiant.oathtool --totp -v: Mode verbeux qui affiche les détails de la clé, permettant d'extraire la versionBase32 secret(ex:MX2...).
8.2. Création de l'image QR Code. Génération d'un fichier image contenant l'URI de provisioning compatible avec Google Authenticator ou FreeOTP.
Installation de l'outil qrencode sur votre machine.
Génération du qrcode :
-o etudiant.png: Spécifie le nom et le format du fichier de sortie généré parqrencode.otpauth://totp/...: Structure standard de l'URI OTP spécifiant le type (totp), l'identité (etudiant@192.168.1.90) et le paramètre contenant la clé secrète en Base32.