Authentification SSH à deux facteurs (2FA) avec un yubikey

12

J'ai donc ce petit yubikey et je veux ajouter une couche de sécurité supplémentaire lors de l'authentification des sessions ssh. Côté serveur, j'ai déjà désactivé l'authentification par mot de passe et n'autorise l'utilisation des clés ssh que lors de la connexion.

Le problème est qu'après avoir configuré sshd et PAM pour yubikey auth, sshd ne nécessite toujours qu'une clé ssh, on ne me demande jamais de fournir une réponse de yubikey.

Comment est-ce que j'ai besoin à la fois de la clé ssh et d' un yubikey?

(ubuntu 14.04 - trusty)

/etc/pam.d/common-auth:

auth    required    pam_yubico.so mode=client try_first_pass id=<id> key=<secret>
auth    [success=1 default=ignore]  pam_unix.so nullok_secure try_first_pass
# here's the fallback if no module succeeds
auth    requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth    required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth    optional            pam_cap.so
# end of pam-auth-update config

/etc/ssh/sshd_config:

...

PasswordAuthentication no
ChallengeResponseAuthentication yes
UsePAM yes
ben lemasurier
la source
BTW, si vous n'obtenez pas une réponse satisfaisante dans quelques jours, envoyez-moi un ping et je mettrai une généreuse prime sur la question. J'ai un représentant à brûler et je suis également intéressé par cette réponse. :)
EEAA

Réponses:

4

Ok, j'ai continué et je pense que j'ai trouvé une solution raisonnable. La principale chose qui me manquait auparavant était celle de sshd AuthenticationMethods publickey,password. Cela renforce l'exigence d'un publickey et d' un mot de passe - "mot de passe" est maintenant géré par PAM->auth-yubi. Des modifications supplémentaires étaient également nécessaires, voir ci-dessous:

(Ubuntu 14.04 - fidèle):

/etc/pam.d/yubi-auth

auth    required pam_yubico.so mode=client try_first_pass id=<id> key=<key>

Remarque: vous pouvez obtenir votre ID d'accès et votre clé secrète ici

/etc/pam.d/sshd

# Standard Un*x authentication.
#@include common-auth

# Yubikey auth
@include yubi-auth

/ etc / ssh / sshd_config

UsePAM yes
ChallengeResponseAuthentication no
AuthenticationMethods publickey,password
PasswordAuthentication yes

service ssh restart

Vérification

SSH à partir d'un hôte distant sans clé publique

root@0a6442bcb21c:/# ssh [email protected]
The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is ea:2a:e3:98:35:72:66:b1:e0:65:6b:3f:60:8a:af:ab.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.20' (ECDSA) to the list of known hosts.
Permission denied (publickey).

SSH à partir d'un hôte distant avec une clé publique

$ ssh [email protected]
Authenticated with partial success.
[email protected]'s password:
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.19.0-33-generic x86_64)

Amélioration

Ce serait bien de voir "Yubikey Auth:" au lieu de "mot de passe:" du serveur ssh distant lors de l'authentification.

Que se passe-t-il lorsque le serveur ssh n'est pas en mesure de contacter le système de vérification d'authentification de yubico? Une solution idéale serait entièrement autonome.

Commentaires et suggestions appréciés.

ben lemasurier
la source
2

La configuration de 2FA avec Yubikey peut être délicate (on pensait qu'il existe un patch openssh pour U2F ), mais le moyen le plus simple est probablement celui décrit sur le site officiel de Yubico .

C'est essentiellement la façon de stocker votre clé privée sur le Yubikey et de la protéger avec un code PIN. Ce n'est pas exactement le 2FA que vous êtes décrit (mais c'est quelque chose que vous avez et ce que vous savez ), mais cela augmente encore la sécurité (Yubikey se verrouille après quelques tentatives infructueuses).

TL: DR;

OPENSC_LIBS=`locate opensc-pkcs11.so`
yubico-piv-tool -s 9a -a generate -o public.pem
yubico-piv-tool -a verify-pin -P 123456 -a selfsign-certificate -s 9a \
  -S "/CN=SSH key/" -i public.pem -o cert.pem
yubico-piv-tool -a import-certificate -s 9a -i cert.pem
ssh-keygen -D $OPENSC_LIBS/opensc-pkcs11.so -e
ssh -I $OPENSC_LIBS/opensc-pkcs11.so [email protected]
Jakuje
la source
" Je crois que le module pam est capable d'authentifier uniquement les Yubikeys locaux, pas ceux sur ssh " - je ne suis pas tout à fait sûr de ce que vous entendez par là. Voulez-vous dire qu'un Yubikey ne peut pas être utilisé pour s'authentifier auprès d'un serveur ssh distant via PAM?
MadHatter
Oui. Parce qu'il a besoin du moyen de communiquer avec le yubikey et c'est probablement fait en utilisant une bibliothèque locale. Il n'y a pas de code pour cela dans ssh.
Jakuje
C'est vraiment faux. J'ai configuré mes serveurs distants pour accepter l'authentification basée sur yubikey en mode natif yubikey et en mode OATH . L'intérêt d'un yubikey est de fournir une chaîne courte (ish) à transmettre sur un canal potentiellement non sécurisé, pour agir comme un mot de passe à usage unique. Si le yubikey devait être physiquement attaché au système sur lequel il s'authentifiait, ce serait beaucoup moins utile. Je pense que vous vous trompez également sur le verrouillage yubikey en mode PKCS.
MadHatter
OK tu as raison. Pour le mode OTP, c'est possible. Mais le verrouillage fait partie de la norme PKCS11.
Jakuje
1
Merci pour cela - je pense que votre réponse est bien meilleure pour les améliorations et supprimera mon downvote.
MadHatter