N.B. :Cet article s'inscrit en liaison avec celui traitant des choix algorithmiques à mettre en place lors de la configuration d'un serveur SSH.

Un peu plus de sécurité ?

C'est vrai après tout, pourquoi ne pas rajouter une once de sécurité pour nos connexions SSH, en mettant en place une méthode d'authentification à double facteur (Two-factor authentication 2FA) qui consiste à présenter deux preuves d'identité différentes lors d'une phase d'authentification...

Mais pourquoi donc me direz-vous... Et bien tout simplement qu'il est dorénavant de notoriété publique qu'une protection par mot/phrase de passe n'est plus suffisant.

Dans notre cas, il sera question de soumettre un identifiant à usage unique (One time password OTP) lors de la dernière étape d'authentification.

Il y a de nombreux moyens permettant de mettre en place cette méthode, par exemple Google Authenticator, qui s'implante un peu partout. Ne voyant pas vraiment d'un bon œil la façon de gérer notre vie privée effectué par cette entreprise, je ne suis pas du tout attiré par sa mise en œuvre.

Mais il y a d'autres solutions – sûrement moins connues et plus onéreuses – très intéressantes dans ce domaine, c'est le cas de la Yubikey.

Quésaco ?

Il s'agit d'une petite clef USB, robuste – tant au niveau matériel que logiciel – qui permet de reproduire un clavier de type USB et contenant une clef AES en écriture seule. Il en existe de différents types en fonction de nos besoins...

Elle gère différentes méthodes d’authentification :

  • FIDO U2F
  • Yubico-OTP
  • OATH-OTP
  • OATH-HOTP
  • OATH-TOTP
  • OpenPGP
  • PIV

Le site officiel dispose d'une bonne documentation et les logiciels utilisés sont libres

Pour une description plus précise et technique – et en vue de na pas sombrer dans le plagiat – je vous recommande fortement la lecture du billet d'Aeris sur ce sujet.

Un petit tour via le marché d’Amazon vous permettra d'acquérir cet objet. Aux dernières nouvelles elle était au prix de 45 € environ – frais de port compris – courant mars 2017

One Time Password !

Afin de pouvoir intégrer cette méthode d'authentification, nous allons avoir besoin du module PAM développé par Yubico.

Du côté de mon serveur faisant tourner une Debian GNU/Linux 8.7 Jessie, cela se résume par un petit apt update && apt install libpam-yubico -y. Ni plus, ni moins...

La génération du mot de passe unique va faire appel au protocole de validation de Yubico, il faut donc que ce dernier ait connaissance de notre Yubikey.

Pour ce faire, on insère cette dernière dans un port USB, puis on se rend à cette adresse.

Il faut renseigner une adresse mail, générer un OTP en appuyant sur le bouton de la yubikey (appui court), accepter les conditions d'utilisations et obtenir sa clef API.

Une fois ces informations en notre possession, nous allons modifier - sur le serveur – le fichier /etc/pam.d/sshd.
Il faut repérer la ligne contenant @include common-auth et insérer la ligne suivante en dessous, en remplaçant ClienID et SecretKey par ceux obtenus lors de la génération de votre clef API.

# Standard Un*x authentication.
@include common-auth
auth required pam_yubico.so id=ClientID key=Secretkey url=https://api.yubico.com/wsapi/2.0/verify?id=%d&otp=%s

Yubikey = Utilisateur

Il faut maintenant mettre en place le lien entre notre yubikey et notre utilisateur se connectant via SSH.

Côté serveur, on créer le fichier ~/.yubico/authorized_yubikeys – dans le home de l'utilisateur concerné – et il contiendra le format suivant utilisateur:yubikeyid.

Pour le paramètre utilisateur, pas de soucis, il s'agit de son login. Pour récupérer le yubikeyid nous pouvons procéder de deux façons différentes...

Méthode comand line

Insérer la yubikey dans un port USB et lancer la commande :

read -p "Enter a YubiKey OTP: " s && echo 'The key id is' ${s:0:12}

Faire un appui court sur le bouton de la clef afin de récupérer notre id.

Petit exemple :

[~]read -p "Enter a YubiKey OTP: " s && echo 'The key id is' ${s :0:12}
Enter a YubiKey OTP: cccccccirlrfrvldfubllgjdjkbdgeejbuvcfcvfdurb
The key id is cccccccirlrf

Méthode web

Se rendre à cette adresse, sélectionner OTP pour le format source, faire un appui court sur le bouton de la clef et cliquer sur convert to all format.

Notre id se trouve alors sous la référence Input string

Tout ça pour dire qu'il s'agit des 12 premiers caractères de la chaîne générer lors de l'appui sur le bouton... bref.

Nous pouvons donc renseigner notre fichier de configuration ~/.yubico/authorized_yubikeys.

arnaud:cccccccirlrf

Accès SSH avec yubikey

Il ne reste plus qu'à modifier le fichier de configuration /etc/ssh/sshd_config du serveur afin de permettre à notre utilisateur d'utiliser la yubikey

Pour cela, il faut passer le paramètre ChallengeResponseAuthentication sur yes et rajouter le clavier aux méthodes d'authentifications

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

le fichier final – en repartant de la configuration décrite dans cet article – ressemble donc à ceci :

Port 22
Protocol 2
KexAlgorithms curve25519-sha256@libssh.org
HostKey /etc/ssh/ssh_host_ed25519_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
Ciphers chacha20-poly1305@openssh.com
MACs umac-128-etm@openssh.com
AllowGroups ssh-users
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile    %h/.ssh/authorized_keys
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication yes
PasswordAuthentication no
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes
UseDNS no
AuthenticationMethods publickey,keyboard-interactive

Le moment de vérité :

On relance le service ssh systemctl reload ssh et sans quitter la session en cours d'utilisation – des fois que... une petite erreur... sait-on jamais... – on instancie une nouvelle connexion.

Cela devrait donner quelque-chose du genre :

[~] ssh user@serveur
Enter passphrase for key '/home/user/.ssh/maclef':
Password:
YubiKey for `arnaud':

               _
 ___  ___ __ _| | ___           ___ _   _
/ __|/ __/ _` | |/ _ \ \ /\ / / _` | | | |
\__ \ (_| (_| | |  __/\ V  V / (_| | |_| |
|___/\___\__,_|_|\___| \_/\_/ \__,_|\__, |
                                    |___/


Welcome on Debian Jessie (GNU/Linux 4.8.14-std-2 x86_64 )

System information as of: Tue Apr  4 11:05:56 CEST 2017

Comme on peut le constater le prompt demande bien une yubikey pour notre utilisateur c'est totalement sensationnel !

Afin d'exprimer notre joie, je citerais une célèbre philosophe : « C'est gagné ! C'est gagné ! C'est gagné ! Yeaaah ! Yes we did it ! »