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.so
tener é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.so
y 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.so
mó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.so
mó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 su
para iniciar sesión en su cuenta de usuario; debe realizar el proceso de autenticación de tres pasos.
pam_succeed_if.so
Puede encontrar la documentación completa del módulo en http://linux.die.net/man/8/pam_succeed_if