Autenticación de tres pasos?


9

Estoy usando Ubuntu

Me pregunto si es posible tener libpam-google-authenticator (que le permite iniciar sesión usando un código generado por su teléfono) Y la autenticación de certificado configurada para funcionar en conjunto, y si es posible, cómo lo haría. configurarlo Por lo tanto, para iniciar sesión en mi cuenta, debe tener mi contraseña, mi teléfono (y su código de acceso) Y mi certificado / clave privada y su contraseña.

He conseguido que ambos trabajen de forma independiente, pero nunca he podido hacer que trabajen juntos. Sin embargo, estoy seguro de que de alguna manera es posible.

Gracias.


Por lo general, no gana mucho por factores duplicados. Un certificado y un generador de código se ajustan al factor 'algo que tienes'. Una contraseña se ajusta al 'algo que sabes'. El otro factor común es 'algo que eres' (biometría).
Zoredache

Respuestas:


8

Es posible hacer esto encadenando módulos PAM. Pero antes de entrar en detalles:

La configuración incorrecta de PAM puede y LE impedirá iniciar sesión en su sistema

Afortunadamente, siempre puede arrancar en modo de usuario único y solucionar el problema, pero tenga en cuenta que PAM no es algo con lo que quiera meterse más de lo necesario.

De todos modos, la idea detrás de esto es que es posible utilizar módulos PAM de apilamiento para asegurarse de que pam-google-authenticator, pam_unix(esto comprueba la contraseña) y el módulo certificado todos tienen que tener éxito para permitirle el acceso. De manera predeterminada, PAM está configurado para permitir que cualquier módulo de autenticación lo autentique, omitiendo los demás.

En /etc/pam.d/common-auth, verá cerca de la parte superior una línea similar a la siguiente:

auth    [success=2 default=ignore]  pam_unix.so nullok_secure try_first_pass

Esto le dice a PAM que debería pam_unix.sotener éxito, omitirá las siguientes dos reglas (que generalmente son otro módulo de autenticación y luego pam_deny.so) y pasará a los módulos opcionales. Sin embargo, si el módulo falla, se ignorará y el control pasará al siguiente módulo de la cadena. Esto continúa hacia abajo en cada módulo de autenticación hasta que el control salta al bloque opcional o PAM llega a pam_deny.so y falla allí mismo.

Esto se puede aprovechar para garantizar eso pam-google-authenticator, pam_unix.soy su módulo PAM certificado debe tener éxito para permitirle el acceso. No sé el nombre del módulo de autenticación de Google o el módulo de certificado que está utilizando, pero debería poder encontrarlos en su archivo de autenticación común. Entonces, al poner algo como esto en la parte superior:

auth    requisite   pam_unix.so nullok_secure
auth    requisite   pam_google_authenticator.so
auth    requisite   pam_certificate_auth.so
auth    [success=<n>]   pam_permit.so

Reemplazar <n>con el número de módulos entre el módulo pam_permit.so aquí y el siguiente pam_permit.somódulo; en otras palabras, esto debe establecerse en el código [éxito = n predeterminado = ignorar] del módulo de autenticación más alto + 1. Esta sintaxis es un poco funky , pero esencialmente omite los módulos de autenticación después de que los módulos anteriores hayan tenido éxito.

Por supuesto, puede que se pregunte cómo limitar esta autenticación de tres pasos solo a su cuenta de usuario. Esto se puede hacer con un pam_succeed_if.somódulo y se debe insertar sobre el bloque de autenticación de tres pasos descrito anteriormente:

auth    [success=ignore default=4]  pam_succeed_if.so user = <username>

Donde <username>se reemplaza por su nombre de usuario. Esta línea simplemente dice que pam_succeed_if.so tiene éxito (también conocido como su nombre de usuario coincide con el nombre de usuario en esa línea), luego PAM debe continuar con los siguientes módulos, que son los módulos de autenticación de tres pasos. De lo contrario, PAM debería saltar a los módulos reales, que están a 4 módulos de distancia de este.

Para hacer coincidir varias cosas, por ejemplo, pertenecer a un grupo junto con un nombre de usuario determinado, se deben usar varias líneas, por ejemplo:

auth    [success=1 default=ignore]  pam_succeed_if.so user = <username>
auth    [success=ignore default=4]  pam_succeed_if.so user ingroup <group>

Antes de hacer nada de esto, haría una copia de seguridad del archivo de autenticación común, y también me familiarizaría con el modo de usuario único y cómo restaurar el archivo antiguo en caso de emergencia. Esta configuración no ha sido probada por mí, pero debería funcionar.

Para probar esto la primera vez, abra uno o dos shell raíz y déjelos en paz. Estos actúan como retrocesos en caso de que algo salga mal, ya que puede reemplazar fácilmente la autenticación común con la copia de seguridad. Luego, haga estos cambios. A continuación, intente usar supara iniciar sesión en su cuenta de usuario; debe realizar el proceso de autenticación de tres pasos.

pam_succeed_if.soPuede encontrar la documentación completa del módulo en http://linux.die.net/man/8/pam_succeed_if


Excelente respuesta! Si pudiera votar esto más de una vez, lo haría.
Aaron Miller

¡Gracias! Aunque: para el inicio de sesión del certificado, estoy agregando mi clave pública en .ssh / Authorizedkeys (usando la configuración RSAAuthentication y PubkeyAuthentication en sshd_config) y para el código OTP estoy usando pam_google_authenticator - google-authenticator.googlecode.com/hg . Entonces, ¿cómo funcionaría eso?
Jesse W

@JesseW Para que esto funcione, debe configurar SSHD para usar PAM, así como una clave pública. Aunque no estoy seguro de los detalles, sin duda tendrá que configurar ChallengeResponseAuthenticationy UsePAM'sí', luego configure las líneas detalladas en mi respuesta anterior en /etc/pam.d/sshd o /etc/pam.d/common -auth, dependiendo de si desea realizar esto para todos los inicios de sesión o solo SSH. Recuerde eliminar la línea de relleno 'pam_certificate_auth.so' y modificar la línea [success = <n> como resultado.
Xenopático

2

Leí esta publicación y pensé que sonaba genial: así es como conseguí que funcione la autenticación de tres factores. Escribí una publicación de blog al respecto aquí .

Básicamente, configuré Google Authenticator y la contraseña en PAM, luego configuré la autenticación de clave pública en OpenSSH (esto pasa por alto a los otros dos), y finalmente OpenSSH también requiere que se autentique a través de PAM (la última línea)

Desde / etc / ssh / sshd_conf

PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive

1

Solo Pubkey + GoogleAuth debe agregar a la parte superior de su /etc/pam.d/sshd

#auth    requisite    pam_unix.so nullok_secure #if you want password, too :)
auth    requisite    pam_google_authenticator.so
auth    [success=2]  pam_permit.so

Supongo que tienes OpenSSH> = 6.2 y sshd_config editado

Para mayor seguridad paranoica, agregue algunas configuraciones adicionales: D

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.