Linux : comment activer le MFA sur un accès SSH ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à configurer l'authentification multi-facteurs (MFA) sur l'accès SSH d'un serveur Linux afin de renforcer l'authentification : en complément de l'identifiant et du mot de passe, un code de vérification à usage unique devra être saisi pour s'authentifier sur le serveur.
Le MFA est compatible avec l'authentification par identifiants (utilisateur / mot de passe), mais aussi avec l'authentification par clés.
Sur le serveur Linux, nous allons devoir installer et configurer Google PAM Authenticator, correspondant au paquet "libpam-google-authenticator" (page du projet). Du côté de votre smartphone, vous pouvez utiliser l'application de génération de code de votre choix : FreeOTP, Microsoft Authenticator, Google Authenticator, etc... Il y a du choix !
Cette configuration s'applique à différentes distributions, notamment Debian, Ubuntu, Fedora, Rocky Linux, etc... Pour ma part, j'utilise une machine Debian 11 pour cette démonstration.
II. Installation et configuration de Google PAM Authenticator
Connectez-vous sur votre serveur Linux, mettez à jour le cache des paquets et installez le paquet mentionné en introduction :
sudo apt-get update sudo apt-get install libpam-google-authenticator
Une fois l'installation effectuée, nous pouvons attaquer la configuration du module. Ceci va nécessiter d'utiliser votre smartphone avec votre application OTP. Exécutez cette commande :
google-authenticator
Répondez "y" à la première question pour qu'un QR code soit généré. Ce code doit être scanné avec votre application OTP, à partir de votre smartphone.
Sous le QR code, il y a la question "Enter code from app" : saisissez le code affiché sur votre smartphone, et validez, afin de vérifier que cela fonctionne correctement. Notez également les codes d'urgence en lieu sûr, dans votre gestionnaire de mots de passe préféré, par exemple. Ces codes sont à utiliser uniquement si vous avez un problème avec l'application OTP sur votre smartphone.
Ensuite, il faut répondre à 4 questions pour affiner la configuration. Pour que la configuration soit sécurisée (protection contre certaines attaques), il est nécessaire de répondre "y" donc "oui" à l'ensemble de ces questions. Par exemple, cela va imposer une limite pour les tentatives de connexion : 3 tentatives toutes les 30 secondes.
La configuration de Google PAM est terminée ! Passons à la suite.
III. Activer le MFA sur la connexion SSH
Maintenant, nous devons configurer le module d'authentification de Linux et SSH pour qu'ils s'appuient sur Google PAM afin d'activer le MFA. Commencez par modifiez ce fichier :
sudo nano /etc/pam.d/sshd
Ajoutez cette ligne à la fin du fichier et enregistrez :
auth required pam_google_authenticator.so
Si vous souhaitez autoriser la connexion sans MFA, par exemple pour un utilisateur pour lequel le MFA n'est pas configuré, ajoutez cette option :
auth required pam_google_authenticator.so nullok
Ensuite, c'est le serveur SSH en lui-même qu'il faut configurer. Ouvrez le fichier de configuration de SSH :
sudo nano /etc/ssh/sshd_config
Recherchez l'option "ChallengeResponseAuthentication" est définissez là sur "yes" à la place de "no".
ChallengeResponseAuthentication yes
Pour utiliser le MFA avec l'authentification par clés (ce qui suit n'est pas utile pour une authentification par login et mot de passe), la configuration est un peu différente... Car, en plus de l'option que nous venons d'activer, il faut ajouter cette option :
AuthenticationMethods publickey,keyboard-interactive
Bien sûr, cela vient s'ajouter aux lignes pour désactiver l'authentification par mot de passe et pour activer la méthode basée sur une clé publique :
PubkeyAuthentication yes PasswordAuthentication no
Fermez le fichier et redémarrez le service SSH pour appliquer les changements :
sudo systemctl restart sshd
Il est temps de tester !
IV. SSH : tester la connexion MFA
À partir d'une machine distante, initiez une connexion SSH vers votre serveur sur lequel le MFA est actif, et connectez-vous avec l'utilisateur pour lequel nous venons d'activer le MFA. Et là, surprise, une nouvelle étape nommée "Verification code" s'affiche ! C'est à ce moment-là qu'il faut ouvrir l'application de génération de code sur votre smartphone pour obtenir un code et le saisir.
Suite à cette connexion, dans le journal "/var/log/auth.log", vous verrez une ligne comme celle-ci :
sshd(pam_google_authenticator)[1192687]: Accepted google_authenticator for flo
Dans le cas où un mauvais code est saisi, il y aura également une entrée dans les logs pour notifier cette tentative. Cet événement est intéressant et peut indiquer un signe de compromission, car il indique que quelqu'un connaît le nom d'utilisateur et le mot de passe, mais qu'il bloque sur le second facteur d'authentification.
Maintenant, c'est à vous de configurer vos serveurs !
Bonjour,
Super comme article 👍
Par contre, est-ce qu’il y a un autre outil que celui de Google pour réaliser le MFA sur le serveur ?
Hello Axl,
Personnellement je connais uniquement cet outil proposé par Google pour réaliser le MFA. Je pense qu’il doit exister des alternatives… Je suis preneur d’un retour si tu fais quelques recherches 🙂
Et si tu scannes le QRcode avec Aegis, cela devrait fonctionner. Teste-le si tu as l’occasion 😉
Microsoft à le sien au besoin qui fonctionne exactement pareil » Microsoft authenticator » mais je préfère Google car Google n’a aucun lien avec mes accès protégés, c’est comme utiliser MS Auth app pour une session windows j’éviterai …
J’avais fait la même chose sous debian avec oathtool libpam-oath qrencode zbar-tools
J’avoue qu’avoir recours à du code Google pour ce type de chose est plutôt repoussant…
Ce qui m’intéresserai c’est utiliser une clé de sécurité fido u2f ou une carte à puce fido en lieu et place du mfa …
Cela devrait être possible avec un agent ssh sur votre poste client, à mon avis. Par contre, ce ne serait pas forcément simple de sauter de ssh en ssh.
Bonjour,
Très bien cet article mais du coup on est obligé d’entrer son mot passe, la clé privée n’est plus utilisée ?
J’aimerais forcer l’authentification par clé privée et y ajouter le MFA sans pour autant obliger l’utilisation du mot de passe. Ce n’est pas possible ?
@ Cornely : Tu as dû rater cette étape du tuto :
Pour utiliser le MFA avec l’authentification par clés (ce qui suit n’est pas utile pour une authentification par login et mot de passe), la configuration est un peu différente… Car, en plus de l’option que nous venons d’activer, il faut ajouter cette option :
AuthenticationMethods publickey,keyboard-interactive
Bien sûr, cela vient s’ajouter aux lignes pour désactiver l’authentification par mot de passe et pour activer la méthode basée sur une clé publique :
PubkeyAuthentication yes
PasswordAuthentication no
Bonjour
il faut mettre à jour votre tuto pour préciser deux choses :
– à partir de Debian 12, dans sshd_config c’est l’option « KbdInteractiveAuthentication » qu’il faut définir sur « yes » (à la place de « ChallengeResponseAuthentication » qui n’apparaît plus)
– quand on utilise l’authentification par clé, il faut commenter dans le fichier /etc/pam.d/sshd l’option « @include common-auth » du paragraphe « # Standard Un*x authentication. » Sans quoi le mot de passe est demandé.
Bonjour
Excellent tuto ! mis en place pour accéder en SSH avec MFA à un Raspberry pi4, et c’est fonctionnel ! 🙂
Par contre j’ai une question concernant une machine sur laquelle j’ai installée Nextcloud. L’accès web est configuré avec le MFA, je voulais savoir si il est possible de configurer le MFA en utilisant ce tuto mais pour un accès SSH a ce même serveur ?
Est qu’il n’y aurait pas un conflit ?
Dans l’attente de vos retours
Bonne journée