Autenticación de dos factores OpenSSH combinada con Kerberos/clave pública

Autenticación de dos factores OpenSSH combinada con Kerberos/clave pública

Estoy intentando implementar la autenticación de dos factores para OpenSSH. El entorno es Centos 7 (kernel: 3.10.0-229.1.2.el7.x86_64) con OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips el 11 de febrero de 2013. Tenemos implementado Active Directory (LDAP) + Kerberos. La especificación es la siguiente:

  • A un usuario con un ticket Kerberos válido y existente solo se le debe solicitar el segundo factor
  • A un usuario sin un ticket Kerberos válido y existente se le debe solicitar su contraseña y un segundo factor.
  • Los usuarios locales (sin cuenta LDAP) deberían poder autenticarse con sus contraseñas locales
  • El segundo factor no debe ofrecerse antes que el primero.
  • Además de Kerberos, la autenticación de clave pública también debe aceptarse como primer factor si está disponible.
  • La función debería poder limitarse a un conjunto de usuarios; a otros simplemente se les permite ingresar con sus contraseñas.

Para realizar el proceso de autenticación del segundo factor, hay disponible un módulo PAM de terceros que no sabe nada sobre Kerberos. Así que esto es lo que hice:

Coloque estas líneas en /etc/ssh/sshd_config:

# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes

# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes

# Enable public key authentication
PubkeyAuthentication yes

# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes

# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)

La sección de autenticación de la configuración PAM para sshd (/etc/pam.d/sshd)

auth       [success=ignore default=1] pam_localuser.so
auth       substack     password-auth
auth       [success=1 default=ignore] pam_localuser.so
auth       required     pam_2fa.so [...some arguments...]
auth       include      postlogin

El módulo pam_2fa.so es responsable de solicitar y validar el segundo factor.

Ahora bien, en el caso de Kerberos, esto hace casi todo lo que quería lograr. Sin embargo, para las cuentas locales, se generan dos solicitudes de contraseña posteriores. Este es mi principal problema aquí. Esto se debe a que en este caso se utiliza la ruta "contraseña, teclado interactivo: pam", como se esperaba. (Necesito esta ruta de autenticación para que alguien con una cuenta de Kerberos pero sin un ticket válido pueda obtener un ticket ingresando la contraseña y luego la OTP). Si elimino completamente la subpila de autenticación de contraseña de la configuración de PAM, las cuentas de Kerberos siguen funcionando. y las cuentas locales siguen sin funcionar. A mí me parece que la declaración KerberosOrLocalPasswd yes se ignora, porque UsePAM yes también está presente. Sin embargo, sshd realmente sigue usando KDC para la validación de contraseñas, porque de lo contrario tampoco funcionaría para cuentas LDAP.

Nuevamente, para aclarar aún más lo que deseo implementar aquí es el pseudocódigo que describe la lógica de autenticación deseada:

if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
  return second_factor_auth(user, read_otp())
else:
  if is_local_account(user):
    if local_passwd_auth(user, read_password()):
      return second_factor_auth(user, read_otp())
    else:
      return AUTH_ERR
  else:
    if krb5_auth(principal, read_password()):
      return second_factor_auth(user, read_otp())
    return AUTH_ERR

Entonces, creo que mi escenario no es demasiado complejo ni ambicioso de ninguna manera, pero todavía no pude encontrar una manera clara de implementarlo a pesar de que pasé días investigando y experimentando. ¿Podrías ayudarme a encontrar una solución?

¡Muchas gracias por adelantado!

Respuesta1

No conozco ninguna manera de hacer lo que quieres con PAM sin escribir un nuevo módulo pam. PAM es relativamente complejo y, según mi experiencia, la forma en que sshd interactúa con PAM y Kerberos ha sido tal que siempre hay un caso límite que simplemente no funciona.

Lo que quieres puede ser posible, simplemente no sé cómo hacerlo. Si solo necesita proteger ssh, lo que sugeriría es usar

ForceCommand  /path/to/2fa_executable 

en su sshd_config. Esto le permitiría implementar la lógica que desea, el inconveniente es que 2fa_executable debe estar configurado para leer cualquier secreto de 2fa.

Hay un ejemplo y un código en el sitio web de Duo Security. Puede usar el contenedor duo setuid y cualquier código 2fa que esté usando.

Configuración de Duo Unix

Respuesta2

  • A un usuario con un ticket Kerberos válido y existente solo se le debe preguntar el segundo factor.

Esto no se puede lograr a través de PAM.

La autenticación basada en claves exitosa realizada contra sshd evita la authpila de PAM. Esto incluye GSSAPI, que es un requisito para la autenticación Kerberos basada en tickets. No tiene más remedio que hacerlo, ya que PAM simplemente no fue diseñado teniendo en cuenta este tipo de autenticación.

La configuración UsePAM yeshace lo siguiente:

  • ChallengeResponseAuthenticationy PasswordAuthenticationenganchará la authpila de PAM para validar la contraseña. Cualquier forma de autenticación distinta de estos dos métodosnotoca la authpila.
  • Tras una autenticación exitosa, accountse llamará a la pila de PAM para determinar si el usuario autenticado tiene permiso de acceso. (siempre)
  • sessionSe llamará a la pila de PAM para manejar las tareas de configuración de la sesión.

Resumen: No hay absolutamente ninguna manera de que se authactive un mensaje de autenticación de dos factores ubicado dentro de la pila para alguien que se ha autenticado con una clave GSSAPI o ssh. Puede usar accounty sessionapilar junto con esos métodos de autenticación, pero hasta ahí llegará PAM.

Respuesta3

Aquí tienes una explicación de cómo hacerlo.https://cern-cert.github.io/pam_2fa/

  • La base: autenticación de 2 factores con pam
  • Un módulo pam que comprende más sobre los métodos de autenticación ssh:

    autenticación [éxito = 2 ignorar = ignorar valor predeterminado = morir] pam_ssh_user_auth.so

  • OpenSSH reciente o parcheado para exponer esto a pam

    Métodos de autenticación gssapi-con-micrófono, teclado-interactivo: pam clave pública, teclado-interactivo: pam teclado-interactivo: pam

información relacionada