15 de enero de 2012

Profundizando en PAM: Passwd sobre PAM (2/2)


conjuntoEntradas() {
 Profundizando en PAM: Passwd sobre PAM (1/2)
 Profundizando en PAM: Passwd sobre PAM (2/2)
}


La luz del final del túnel

Hace unas tres semanas tuve que cambiar el password porque estaba a punto de caducarse y como no el diablo que me perseguía apareció; harto de él y con ganas de enfrentarme a él, nos metimos en el lío.

Preguntando al Sr. Google, encontré un post de un tal Jason Howk, que habla de aplicar una política fuerte de contraseñas bajo Linux donde se explica cosas que ya sabía y otras no, concretamente lo del PAM; así que en el post encontré la madre del cordero.

PAM (Pluggable authentication module), permite definir un proceso de autenticación asociado a un ejecutable/proceso a modo de plugin, es decir que se integra sin la necesidad de alterar el binario o código fuente que lo requiere.

Así que una vez tener a partir de la definición como actúa y después de haber leído el post del tal Jason Howk entendí que con un fichero de configuración se puede definir el modo de autorización totalmente externa, llamando al servicio PAM, evitando que tengas que implementarlo, y encima puedes amoldarlo a tus necesidades, siempre y cuando haya un módulo PAM que haga lo que quieres, y sino lo hay, ya sabes que te toca implementarte uno.

Tirando del hilo

Cuando ya me había enterado que con un fichero de configuración de PAM se puede definir como se comporta el cambio del password de acceso al sistema a través comando passwd, concretamente el fichero /etc/pam.d/passwd, me fui a ver que había ahí dentro para ver porque sucedía lo de solicitar el cambio de password por duplicado y encontré esto

#%PAM-1.0
auth       sufficient   pam_rootok.so
auth       include system-auth
account    include system-auth
password   include system-auth

Como podemos ver en el fichero no se define nada, se delega cada grupo (auth, account, password), al fichero /etc/pam.d/system-auth, el cual tiene el siguiente contenido

auth  required pam_env.so 
auth  required pam_unix.so try_first_pass likeauth nullok 
auth  optional pam_permit.so
 
account  required pam_unix.so 
account  optional pam_permit.so
 
password required pam_cracklib.so difok=2 minlen=8 lcredit=1 ucredit=1 dcredit=2 ocredit=2 retry=3
password required pam_passwdqc.so min=8,8,8,8,8 retry=3
password required pam_unix.so try_first_pass use_authtok nullok sha512 shadow 
password optional pam_permit.so
 
session  required pam_limits.so 
session  required pam_env.so 
session  optional pam_mktemp.so
session  required pam_unix.so 
session  optional pam_permit.so

El fichero llama a varios modulos PAM en cada fase, y como no tenía ni idea que hacía cada uno de ellos me fui a buscar la documentación para tener una idea de lo que hace cada uno, bueno solo de los que he encontré de manera rápida, y poder definir el flujo de del servicio PAM que deseaba sobre el comando passwd.

Después de tener más o menos claro lo que hace cada módulo que aparecía en el fichero /etc/pam.d/system-auth, me puse a definir el flujo que deseaba sobre el comando passwd. No obstante, no alteré el fichero /etc/pam.d/system-auth, que es el que se referenciaba en todos los ficheros de configuración de los procesos/comandos que usan PAM, es decir como hacía el fichero /etc/pam.d/passwd, que delegaba la definición del flujo al fichero /etc/pam.d/system-auth, sino que modifque directamente el fichero /etc/pam.d/passwd.

El juicio final: definiendo el flujo PAM sobre passwd

Con la documentación y viendo el contenido del fichero /etc/pam.d/system-auth, me puse definir el contenido de /etc/pam.d/passwd, desde 0.
  1. Quité todos los modules pam_permit porque solo con ver en la documentación la siguiente frase “PAM module that always permit access” a uno ya le queda bastante claro que no puede ser muy bueno, no obstante, por sino queda claro, la propia documentación te le deja más claro con la siguiente frase “This module is very dangerous. It should be used with extreme caution”.
  2. Mantuve los módulos pam_env aunque actualmente en el fichero /etc/security/pam_env.conf está todo comentado, pero para un posible futuro puede ser útil que al meter configuraciones en él, se apliquen a las configuraciones existentes.
  3. De los dos módulos de verificación de complejidad de contraseña, pam_passwdqc y pam_cracklib, para esta situación, opté por utilizar el pam_passwdqc.
  4. Mantuve el módulo pam_unix, para sincronizarlo con el sistema tradicional de autenticación de los sistemas Unix, pero me cargué el parámetro nullok para dejar de permitir el acceso a usuarios sin password.
  5. Al igual que pensé con lo que hacer con el módulo pam_env, pensé lo mismo con pam_limits, es decir lo mantuve a pesar de que el directorio /etc/security/limits.d/ esté vacío, para si establezco configuraciones futuras dentro de éste.
  6. Mantuve pam_mktemp, a pesar de que en mi caso no se vaya a dar el caso de tener directorio home en sistemas de ficheros compartidos por la red, pero creí que no estaba de más mantenerlo.
El resultado de todo esto fue este

#%PAM-1.0

auth  required pam_env.so 
auth  required pam_unix.so try_first_pass nullok
 
account  required pam_unix.so 
 
password required pam_passwdqc.so min=disabled,disabled,15,10,8 passphrase=3 retry=3 ask_oldauthtok check_oldauthtok
password required pam_unix.so try_first_pass use_authtok sha512 shadow 
 
session  required pam_limits.so 
session  required pam_env.so 
session  optional pam_mktemp.so
session  required pam_unix.so

Final de la pesadilla

Y a aquí termino todo, una vez definido esto, comprobé que el comando passwd funcionaba correctamente y que solo me pedía el password (y claro está, su verificación) una sola vez.

Aunque seguro que está muy claro, menciono explicitamente el porque ahora no se pide el password más de una vez; básicamente es porque si nos fijamos en el fichero /etc/pam.d/system-auth, se realiza dos llamadas al proceso de verificación de complejidad, una sobre al módulo pam_cracklib y otra pam_passwdqc.

Para finalizar solo quiero decir que para realizar las distintas pruebas antes de definir por completo el flujo PAM sobre passwd cree un nuevo usuario en el sistema, para evitar que probando no me vaya a cargar el acceso de mi usuario habitual, y cuando todo funcionó, me lo cargué.


Hasta la próxima enfermos.

1 de enero de 2012

Profundizando en PAM: Passwd sobre PAM (1/2)


conjuntoEntradas() {
 Profundizando en PAM: Passwd sobre PAM (1/2)
 Profundizando en PAM: Passwd sobre PAM (2/2)
}

Introducción

En varias ocasiones leo o oigo hablar de algo que en un primer momento no conozco, en algunas de ellas tengo la oportunidad de preguntarle a la persona que está hablando que me explique lo que es, otras no tengo esa oportunidad y es cuando entonces decido preguntarle a Mr. Google, si puedo en ese mismo momento y sino en otro momento, es lo que tiene que siempre esté a tu disposición.
Una vez que he tenido una breve descripción de lo que es, entonces ya estoy en contexto, y normalmente (hablando de temas focalizados en el mundo de la informática) puedo comprender, lamentablemente no siempre al 100%, lo que estoy leyendo o lo que me están contando, si es el caso la problemática y la posible solución o mitigación.

Una de estas situaciones, aunque no recuerdo ni cuando ni donde, fue lo que me pasó con PAM; en ese momento me enteré de lo que era y luego cuando me hablado en otras ocasiones de algo donde PAM se siente involucrado no tengo problema en entender lo que me están contando.
Dejando de banda de como voy dando mis primeros pasos en este mundo tan amplio, me centro un poco en lo que es la entrada en sí.

Los inicios

Cuando decidí meter Gentoo en la mi máquina de casa, lo hice, intentando enterarme, de para que sirve y porque se hace todo lo que el handbook explica paso a paso, así consideré que era una manera de aprender aspectos que hasta el momento desconocía y añadir algún granito más al monto de conocimientos que voy almacenando sobre este enorme mundo; además, como el handbook en ciertos puntos deja abiertas indicaciones que se puede hacer esto y esto otro, en algunas de ellas me fui informando para hacerlo en un futuro o directamente me informé y me puse a configurarlo como me gustaría tenerlo, por eso que dicen de “no dejes para mañana lo que puedes hacer hoy”.

Una de esas cosas, fue securizar la configuración de acceso de las cuentas de usuarios del SO (/etc/login.defs), es decir meter un mínimo de valores en los parámetros necesarios para garantizar un password con longitud mínima y con una caducidad para, básicamente, auto-obligarme a cambiarlo de vez en cuando.

Con esto yo ya creía que todo estaba, de hecho en parte no porque no había puesto la mínima complejidad requerida, algo que me preocupaba poco porque by default me complico la vida en el momento de asignar passwords de acceso a cualquier sistema.

El día a día

Después de tener el sistema listo, el empacho me duró un tiempo, además empecé a liarme con otras cosas, demasiadas, que me ocuparon y me ocupan el tiempo para dedicarme, de nuevo, con mente y cuerpo a trabajar para el SO, eso sí, sin tener en cuenta las incidencias de actualizaciones, de despliegue de nuevos servicios/aplicaciones, etc., que me han ido surgiendo y algunas de ellas ya he ido comentando en alguna que otra entada de este blog.

Una de las cosas que me ha ido persiguiendo desde entonces es que cada vez que cambio el password, el SO me solicitaba dos veces, más bien dos pares de veces, el nuevo password.

Ejecución de passwd para cambiar el password de acceso al SO; se ve como se pregunta el password dos veces

¿El motivo? Ni idea, sino lo hubiese solucionado desde un primer momento; el hecho es que no me importaba mucho, ya que metiendo las dos veces el mismo se cambiaba y como estaba perezoso en googlear para buscar un poco para saber que puñetas pasaba, la cosa se ha quedado así hasta hace un par o tres de semanas.


Hasta la próxima enfermos.