Activer la double authentification sur un accès distant SSH

Activer la double authentification sur un accès distant SSH

SSH est un protocole sécurisé permettant de se connecter à distance sur une machine, via un lien chiffré passant s’il le faut par Internet. SSH dispose de plusieurs modes de fonctionnement dont la couverture n’est pas le propos du présent article.

Basiquement, on fait tourner un serveur ssh sur la machine qu’on veut atteindre à distance de manière sécurisée (sudo apt-get install openssh), et on lance un client ssh sur la machine distante qu’on utilise pour se connecter au serveur. Sous Linux le client ssh est fourni par défaut, et sous Windows aussi depuis la mise à jour d’octobre 2018 (Voir la procédure ici pour savoir comment activer ce client ssh).

Pour se connecter sur le serveur distant depuis le client, il faut bien sûr que le serveur soit accessible via un nom DNS sur Internet (le site noip.com permet d’obtenir gratuitement un nom DNS). Supposons que le serveur se nomme foo.toto.com, et que le compte qu’on ait sur le serveur se nomme titi. On cherche donc à se connecter en SSH à distance au compte titi@foo.toto.com

La commande : ssh titi@foo.toto.com nous demandera alors d’entrer le mot de passe du compte et, si mot de passe ok, nous ouvrira un shell sécurisé à distance.

Avec ssh, on peut aussi utiliser le serveur comme VPN pour surfer sur Internet. Pour cela rien de plus simple, il suffit de taper sur le client :

ssh -2NfCT -D 20002 titi@toto.foo.com

Après saisie du mot passe, on se retrouve avec un serveur SOCKS chiffré entre notre machine client et le serveur. Pour surfer via ce tuyau SOCKS local, il suffit de paramétrer notre navigateur Internet local (Firefox ici) pour qu’il utilise ce tuyau SOCKS sur localhost.

Paramétrage de Firefox pour qu’il se branche sur le serveur SOCKS SSH sur localhost:20002

Une fois branché sur le serveur SOCKS écoutant sur le port 20002 en local, lui-même relié via un tunnel chiffré avec le serveur ssh du serveur, on se retrouve à surfer sur Internet avec l’adresse IP du client, dans une configuration VPN classique mais hyper simple à mettre en oeuvre.

La double authentification

Le procédé décrit ci-dessus, qui consiste à avoir un serveur ssh sur lequel on se connecte depuis un client soit en direct pour avoir un shell, soit via un serveur SOCKS local pour surfer en VPN, est génial, chiffré et simple à mettre en oeuvre, mais il a une grosse faille de sécurité : il utilise une simple authentification (le mot de passe). Si le mot de passe est connu d’un ennemi, celui-ci a le champ libre pour rentrer sur le serveur.

La double authentification consiste à avoir, en plus du mot de passe, un code à rentrer, code qu’on reçoit sur notre smartphone. Ainsi, si l’ennemi veut rentrer le mot de passe seul ne suffit plus, il lui faut aussi voler le smartphone, ce qui fait que le piratage du serveur ssh vient de notablement se compliquer.

Google, qui a le chic pour avoir une solution à tous les problèmes, a bien évidemment une solution toute faite et facile à utiliser à proposer : Google authenticator. Bon, pour être franc, ils ne sont pas les seuls : Microsoft par exemple propose lui aussi sa propre solution. Pour en revenir à Google authenticator, qui est celui qu’on va utiliser, le principe est le suivant :

Sur le serveur, on installe Google authenticator et l’on paramètre le serveur ssh pour qu’il utilise la double authentification de Google.

Sur le client, il n’y a rien à faire de particulier. Simplement, une fois que le serveur sera paramétré, il sera demandé un code de vérification sur le client en plus du mot de passe.

Sur le smartphone de la personne nomade, il faut installer l’application Google authenticator.

Paramétrage du serveur

D’abord installer google authenticator : sudo apt-get install libpam-google-authenticator

Puis taper la commande : google-authenticator

Le programme pose 4 questions. La première demande si l’on veut des codes qui changent avec le temps : répondre y (oui). Ensuite le programme affiche un QR code.

Code à photographier avec Google authenticator sur smartphone. Bien conserver les codes dans un coin

Ce QR code est à flasher avec l’application Google authenticator sur smartphone. Ainsi, l’application sur le smartphone reste synchronisée en permanence avec le code google attendu par le serveur ssh à un instant t.

Viennent ensuite les 3 autres questions. Enregistrer la config ? Répondre y. Désactiver la possibilité d’utiliser plusieurs fois le même code ? Répondre y. Passer à des codes valables 4 mn au lieu d’1mn 30 ? Répondre n. Et enfin lutter contre les attaques de force brute ? Répondre y.

Ensuite, à la fin du fichier /etc/pam.d/sshd rajouter la ligne :

auth required pam_google_authenticator.so

Puis, dans le fichier /etc/ssh/sshd_config paramétrer la ligne ChallengeResponseAuthentification comme suit :

ChallengeResponseAuthentication Yes

Rebooter votre serveur pour que ces changements soient pris en compte. Le serveur ssh est maintenant paramétré pour demander le code google authenticator en plus du mot de passe.

Quant à l’application Google authenticator sur le smartphone, elle affiche en permanence le code de validation en vigueur pour la minute trente en cours

La petite horloge sur la droit montre le temps qu’il reste avant que le code ne change (toutes les 1 mn 30)