Petite présentation de ce qu'est une yubikey

Une yubikey est une clé usb qui est un jeton (le mot anglais token est plus joli je trouve) cryptographique. Elle permet de générer un one time password (OTP) et plein d'autres choses, mais je ne l'utilise que pour l'OTP donc je ne parlerai pas du reste. Pour plus d'info, il y a eu une présentation à PSES2011 et il y a plein de sites qui en parlent, je vous laisse chercher.

Mon but est de pouvoir me connecter à mon serveur en ssh à partir d'un pc dont je ne suis pas sûr. Donc impossible d'avoir une paire de clé ni de pouvoir s'assurer l'absence de keylogger. Ce qui est intéressant c'est que comme le nom l'indique, un OTP n'est valable qu'une fois : si on essaie de se connecter avec un OTP déjà utilisé, l'authentification est refusée donc rendant un keylogger inutile.

Mise en place sur OpenBSD

Parfois, avant de me lancer dans de l'adminsys, je me dis "oww sur OpenBSD, je vais galérer" et généralement c'est en fait très simple (une des raisons pour laquelle j'apprécie cet OS).

Pour chaque chose, je donne ce que j'ai fait (de mémoire, c'est pas dit que je n'oublie rien) mais lisez les pages man des différents soft/fichiers de conf qui interviennent, vous apprendrez sûrement des choses qui vous seront sans doute utiles.

Installation

Tout est déjà présent sur OpenBSD en fait, rien à installer.

Attention

Par contre c'est un serveur autonome donc si on fait le même setup sur deux serveurs, vu qu'ils ne communiquent pas entre eux (c'est sans doute possible, mais n'en ayant pas besoin j'ai pas regardé) vous pourrez utiliser un OTP qui a déjà été utilisé sur un autre serveur, il ne pourra pas savoir qu'il n'est plus valide.

Il me semble que sur Debian, le système présent fait appel au serveur de Yubico (la boite qui fait la yubikey) et donc ça supprime ce problème (mais vous dépendez alors des serveurs de la boite, avec tous les inconvénients que ça apporte) même si ça doit être possible d'avoir son propre serveur qui valide l'OTP, bref.

Spécifier la clé au système

Il faut tout d'abord indiquer au système les infos de votre clé : avec l'utilitaire Yubikey Personalization Tool il faut récupérer les champs Private identity et Secret key qu'on met respectivement dans /var/db/yubikey/$nomdutilisateur.uid et /var/db/yubikey/$nomdutilisateur.key (en remplaçant par le nom de votre user, évidemment). On vérifie qu'ils appartiennent à root:auth.

Choix des types de login

Tout ce qui se rapporte à la configuration des types de login a lieu dans /etc/login.conf. Voici les lignes que j'ai rajouté ou modifié :

auth-defaults:auth=passwd,yubikey:
auth-ssh-defaults:auth-ssh=yubikey:
auth-su-defaults:auth-su=yubikey,passwd:
auth-sudo-defaults:auth-sudo=passwd,yubikey:

La première ligne ce sont les moyens de s'authentifier par défaut ("defaults"), par défaut c'est via le mot de passe, mais on peut aussi utiliser la yubikey. Pour ssh, uniquement avec yubikey. Pour su et sudo, c'est passwd et yubikey seul celui par défaut change (yubikey dans le cas de su et par mot de passe pour sudo). Pour pouvoir choisir le moyen de s'authentifier avec su et sudo, il suffit de rajouter l'option "-a passwd" ou "-a yubikey".

Il ne reste plus qu'à rajouter dans les classes d'authentification ce qu'on veut. Par exemple dans la classe default, j'ai rajouté à la suite :

:tc=auth-defaults:\
:tc=auth-ftp-defaults:\
:tc=auth-su-defaults:\
:tc=auth-ssh-defaults:\
:tc=auth-sudo-defaults:

Conclusion

Voilà, maintenant vous devriez pouvoir vous authentifier avec une yubikey sur votre machine OpenBSD.

Dans /var/log/authlog vous devriez voir :

Jun 28 12:38:41 manoir yubikey: user monuser: counter 300.0 > 299.0
Jun 28 12:38:41 manoir yubikey: user monuser: authorize
Jun 28 12:38:41 manoir sshd[1405]: Accepted password for monuser from ip.src.v.4 port 34567 ssh2

On voit bien le counter qu'il incrémente pour que l'OTP ne soit valide qu'une fois. Si vous amusez à remettre un OTP déjà utilisé, vous allez voir dans vos logs :

Jun 29 20:28:21 manoir yubikey: user monuser: counter 306.0 <= 306.0 (REPLAY ATTACK!)
Jun 29 20:28:21 manoir yubikey: user monuser: reject
Jun 29 20:28:21 manoir sshd[640]: Failed password for monuser from 10.19.18.1 port 55526 ssh2

Donc vous avez maintenant un moyen de vous connectez depuis n'importe quel pc, sans avoir de mot de passe à taper \o/

Ajout du 16/09/2014

Depuis, obinou m'a donné une yubikey, que j'ai donc donnée à une personne de confiance afin qu'elle puisse si besoin se connecter à mon serveur. De confiance, de confiance ... je ne sais pas ce qu'elle fait avec sa yubikey, et même si son compte n'a pas accès à grand chose (on s'en sert plus comme un espace de stockage pour se transmettre des trucs), et aussi pour le PoC, j'ai voulu faire en sorte que pour cette personne il y ait de l'authentification à deux facteurs. Et aussi parce que c'est un plaisir de jouer avec OpenSSH, entre la man page qui est claire et la syntaxe qui est sensée. Pour faire cela, c'est tout simple, on rajoute dans /etc/ssh/sshd_config :

Match User nomduuserenquestion
##Authentification forte
    AuthenticationMethods password,publickey

Et ainsi quand nomduuserenquestion tentera de se connecter, ille devra d'abord utiliser la yubikey puis utiliser une clé ssh pour pouvoir se connecter.