Autenticación SSH de dos factores (2FA) con un yubikey

12

Así que tengo este pequeño y elegante truco y quiero agregar una capa adicional de seguridad al autenticar sesiones ssh. En el lado del servidor, ya he deshabilitado la autenticación de contraseña y solo permito el uso de claves ssh al iniciar sesión.

El problema es que, después de configurar sshd y PAM para yubikey auth, sshd solo requiere una clave ssh, nunca se me pide que responda desde yubikey.

¿Cómo necesito tanto la clave ssh como la 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
fuente
Por cierto, si no obtiene una respuesta satisfactoria en un par de días, hágame un ping y le daré una recompensa saludable por la pregunta. Tengo un representante para quemar, y también estoy interesado en esta respuesta. :)
EEAA

Respuestas:

4

Ok, seguí y creo que he encontrado una solución razonable. Lo principal que me faltaba anteriormente era sshd's AuthenticationMethods publickey,password. Esto exige el requisito tanto de una clave pública como de una contraseña: las "contraseñas" ahora están siendo manejadas por PAM->auth-yubi. También se necesitaban cambios adicionales, ver a continuación:

(ubuntu 14.04 - confiable):

/etc/pam.d/yubi-auth

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

Nota: puede obtener su ID de acceso y clave secreta aquí

/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

Verificación

SSH desde un host remoto sin una clave pública

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 desde un host remoto con una clave pública

$ 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)

Mejora

Sería bueno ver "Yubikey Auth:" en lugar de "contraseña:" desde el servidor ssh remoto al autenticar.

¿Qué sucede cuando el servidor ssh no puede contactar con el sistema de verificación de autenticación de yubico? Una solución ideal sería totalmente autónoma.

Comentarios y sugerencias apreciados.

ben lemasurier
fuente
2

Configurar 2FA con Yubikey puede ser complicado (aunque hay un parche openssh para U2F ), pero la forma más fácil es probablemente la que se describe en el sitio web oficial de Yubico .

Básicamente es la forma de almacenar su clave privada en el Yubikey y protegerla con un PIN. No se describe exactamente el 2FA (pero es algo que tiene y lo que sabe ), pero aumenta aún más la seguridad (Yubikey se bloquea después de algunos intentos fallidos).

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
fuente
" Creo que el módulo pam es capaz de autenticar solo los Yubikeys locales, no los que están sobre ssh ". No estoy completamente seguro de lo que quieres decir con eso. ¿Quiere decir que un Yubikey no se puede utilizar para autenticarse en un servidor ssh remoto a través de PAM?
MadHatter
Si. Porque necesita la forma de comunicarse con el yubikey y probablemente se haga usando alguna biblioteca local. No hay código para esto en ssh.
Jakuje
Eso definitivamente está mal. He configurado mis servidores remotos para aceptar la autenticación basada en YubiKey tanto en el modo YubiKey nativa y el modo JURAMENTO . El objetivo de un yubikey es proporcionar una cadena corta (ish) para transmitir a través de un canal potencialmente inseguro, para actuar como una contraseña de un solo uso. Si el yubikey tuviera que estar físicamente conectado al sistema al que se estaba autenticando, sería mucho menos útil. Creo que también te equivocas con el bloqueo de yubikey en modo PKCS.
MadHatter
Esta bien, tienes razón. Para el modo OTP es posible. Pero el bloqueo es parte del estándar PKCS11.
Jakuje
1
Gracias por eso. Creo que su respuesta es mucho mejor para las mejoras y eliminará mi voto negativo.
MadHatter