¿Qué es Pluggable Authentication Modules (PAM)?

Pluggable Authentication Modules, Módulos Externos de Autenticación, abreviado como PAM se ha convertido en el estándar para la autenticación, autorización y control de recursos en sistemas NIX.

Originalmente fue diseñado por Sun Microsystems para proporcionar servicios de autenticación a aplicaciones que carecían de esta funcionalidad. Y posteriormente, dentro del mundo Linux, PAM se convirtió en un modo de unificar y ampliar los mecanismos de autenticación. En este tutorial se hará una pequeña introducción a Linux-PAM.

Tabla de contenidos

1.- ¿Qué es PAM?
PAM es una jerarquía de comprobaciones de autenticación y autorizaciones. Estas comprobaciones están distribuidas en grupos de administración. Los grupos de administración están compuesto por uno o más módulos PAM apilados, cada uno de los cuales realiza una función de comprobación determinada; algunas de estas comprobaciones pueden ser obligatorios (como la existencia del usuario) y otras opcionales.

Tradicionalmente se ha usado un único archivo de configuración localizado en /etc/pam.conf, sin embargo desde hace tiempo se ha optado por archivos de configuración independientes para cada servicio/aplicación. Estos archivos de configuración se localizan en /etc/pam.d/. Si un servicio/aplicación no tiene su respectivo archivo de configuración PAM, se utilizarán las políticas definidas en /etc/pam.d/other.

Por seguridad los parámetros por defecto de other se establecen todos como denegación del servicio. Además es normal incluir un módulo PAM que registre todos estos eventos de denegación.


2.- Sintaxis de configuración de PAM
Los archivos de configuración de PAM no distinguen mayúsculas de minúsculas, salvo en las rutas de acceso a los módulos así como en los argumentos, que siguen las propias reglas de cada módulo. Si el módulo PAM se encuentra en la ruta predeterminada (/lib/security/), no es necesario especificar la ruta; sin embargo si el módulo a cargar se encuentra en otra ruta, deberá ser indicada.

La estructura de las entradas en los archivos de configuración de /etc/pam.d/ es la siguiente: Grupo    Indicador    Módulo    Argumentos.
  • Grupo de administración, representa las distintas partes configurables del proceso de autenticación y autorización
  • Indicador de control, indica a PAM como debe de tratar el resultado (acierto o fallo) del módulo.
  • Módulo PAM, solo es necesaria en caso de que el módulo no se encuentre alojado en la ruta por defecto (/lib/security/).
  • Argumentos, son directivas que se pasan al módulo PAM.


2.1.- Grupos de administración
En PAM existen cuatro grupos de administración:
  • auth Realiza tareas de autenticación de usuarios, es decir, determina si el cliente es quien dice ser a través de una contraseña u otro medio de identificación. Además permite propiedades otorgadas mediante credenciales, como por ejemplo la pertenencia a un grupo determinado (independiente al archivo /etc/groups).
  • account Realiza gestiones no basadas en autenticación. Como por ejemplo confirmar que la cuenta del usuario no esté bloqueada, permitir/restringir el acceso a un recurso en función de la hora o los recursos disponibles del sistema.
  • password Realiza tareas de verificación de contraseñas. Por ejemplo comprueba que la contraseña sea suficientemente segura
  • session Realiza tareas de administración, comprobación y configuración de sesiones de usuarios; como por ejemplo el registro de acciones (logs) llevadas a cabo por el usuario al abrir o cerrar un recurso, montar un directorio...


2.2.- Indicador de control
Indica a PAM como debe de tratar el resultado (acierto o fallo) del módulo, es decir, indican a PAM que hacer con el resultado y como repercute en el proceso global de autenticación. Existen cuatro indicadores de control:
  • required: debe devolver éxito para que la autenticación siga su curso. Un fallo en este módulo no para la ejecucción del resto de módulos.
  • requisite: un fallo para el proceso de autenticación inmediatamente. Se suele usar para evitar que un atacante pueda introducir contraseñas a través de un medio inseguro, sin embargo este sistema también informa al atacante de cuentas válidas en el sistema.
  • sufficient: el éxito del módulo será suficiente para obtener una autenticación satisfactoria.
  • optional: el resultado del módulo no afectara al resultado de la autenticación.

Además existe una nueva sintaxis [valor=acción] que proporciona un mayor control sobre como se autentica un usuario. Algunos de los posibles valores son: success, open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd, acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, authtok_recover_err, authtok_lock_busy, authtok_disable_aging, try_again, ignore, abort, authtok_expired, module_unknown, bad_item y default. Puede obtener una lista completa en /usr/include/security/_pam_types.h

Los posibles valores de acción pueden ser:
  • ignore: Cuando se usa en una pila de módulos, el estado devuelto por el módulo no contribuirá al código de retorno que obtiene la aplicación.
  • bad: Esta acción indica que el código de retorno debe ser considerado como indicativo de fallo del módulo. Si este módulo es el primero que falla en una pila, su valor de estado se usa para toda la pila de módulos.
  • die: Equivalente a bad con el efecto secundario de terminar la pila de módulos inmediatemente, devolviendo el control a la aplicación.
  • ok: Esta acción indica que el código de retorno debe contribuir al código devuelto por la pila de módulos completa
  • done: Equivalente a ok con el efecto secundario de terminar la pila de módulos inmediatamente, devolviendo el control a la aplicación.
  • reset: Borra toda la memoria del estado de la pila de módulos e inicia de nuevo con el siguiente módulo apilado.

Los grupos de administración required, requisite, sufficient y optional, tienen su expresión equivalente en esta nueva sintaxis [valor=acción]:
  • required: [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
  • requisite: [success=ok new_authtok_reqd=ok ignore=ignore default=die]
  • sufficient: [success=done new_authtok_reqd=done default=ignore]
  • optional: [success=ok new_authtok_reqd=ok default=ignore]

2.3.- Módulo PAM
Indica el módulo PAM que se usará. Si solo especifica el módulo PAM, sin ruta, se utilizará la ruta por defecto del sistema para los módulos PAM (/lib/security/). En caso de que el módulo se encuentre alojado en otra ruta debe hacer referencia a él indicando la ruta absoluta hasta el módulo.


2.4.- Argumentos
Son directivas que pueden ser pasadas a los módulos PAM. Los argumentos son específicos de cada módulo, si pasa un argumento no válido, el módulo lo ignorará.


3.- Lista de Módulos PAM
Puede obtener una lista de los módulos PAM disponibles en su sistema simplemente listando el contenido de /lib/security/ [+/-] Ver ejemplo. A continuación describiremos algunos de los módulos PAM.

pam_access
Se encargada de la gestión de accesos al sistema basado en nombres de usuario, de host, de dominio o de direcciones de internet o de red. Usa el archivo de configuración /etc/security/access.conf para determinar que usuarios, grupos, dirección de red o terminal tienen acceso al sistema, de tal forma que cuando alguien trata de acceder al sistema, pam_access.so, busca en el archivo de configuración access.conf si existe alguna política que determine si debe ser aceptada o rechazada la conexión. Puede leer más en pam_access - The Linux-PAM System Administrators' Guide.

pam_cracklib
Se encarga de comprobar el nivel de seguridad de una contraseña. Básicamente lo que hace es pasar la contraseña a través de cracklib para determinar si es una contraseña débil. Puede leer más en pam_cracklib - The Linux-PAM System Administrators' Guide.

pam_debug
Esta pensado para la depuración de PAM, por lo cual proporciona información de los códigos de retorno de cada módulo de la pila PAM. Puede leer más en pam_debug - The Linux-PAM System Administrators' Guide.

pam_deny
Este módulo puede ser utilizado para denegar el acceso. Es conveniente usarlo para denegar la entrada a otros (other) servicios no configurados. [+/-] Ver ejemplo.

pam_echo
Está ideado para informar al usuario sobre eventos especiales. Las secuencias que comienzan con el símbolo de porcentaje (%) son expandidas siguiendo las siguientes reglas: %H: nombre de la máquina remota, %h: nombre de la máquina local, %s: nombre del servicio, %t: nombre del terminal, %U: usuario remoto y %u: nombre del usuario local.

pam_env
Configura las variables de entorno. El archivo de configuración por defecto es /etc/security/pam_env.conf. Puede leer más en pam_env - The Linux-PAM System Administrators' Guide.

pam_exec
Este módulo PAM permite ejecutar un comando externo. Puede leer más en pam_exec - The Linux-PAM System Administrators' Guide.

pam_group
Este módulo no autentica al usuario, sino que le otorga pertenencia a grupos de acuerdo a lo definido en el archivo de configuración /etc/security/group.conf. La funciones de este módulo PAM son paralelas e independientes a las del archivo de configuración /etc/group. Puede leer más en pam_group - The Linux-PAM System Administrators' Guide.

pam_lastlog
Permite mostrar información sobre la última conexión del usuario. Puede leer más en pam_lastlog - The Linux-PAM System Administrators' Guide.

pam_limits
Permite fijar los límites de los recursos del sistema que se puede obtener en una sesión de usuario. Estos límites están recogidos en el archivo de configuración /etc/security/limits.conf. Puede leer más en pam_limits - The Linux-PAM System Administrators' Guide.

pam_nologin
Impide a los usuarios iniciar sesión en el sistema cuando /var/run/nologin o /etc/nologin existe. El contenido del archivo nologin se muestra al usuario al intentar ingresar al sistema. Este mmóduolo no tiene efectos sobre la capacidad del usuario root para acceder al sistema.

pam_permit
Es un módulo que siempre permite el acceso. Si en el proceso de autenticación no se ofrece un nombre de usuario, este se ajustará a nobody.

pam_rootok
Autentica al usuario si su UID es 0. Tenga en cuenta que algunas aplicaciones pueden tener activo el bit setuid, el cual permite ejecutar la aplicación con los privilegios del propietario del ejecutable. Con pam_rootok podrá verificar si el usuario que ejecuta la aplicación es realmente el usuario root.

pam_securitty
Este módulo solo permite la entrada de root sólo si el intento de inicio de sesión se hace desde una terminal segura, de acuerdo a lo definido en /etc/securetty. [+/-] Ver ejemplo. Este módulo no afecta a usuarios no root.

pam_shells
Este módulo solo permite el acceso al sistema si la shell del usuario está listada en el archivo /etc/shells. [+/-] Ver ejemplo.

pam_tally2
Este módulo mantiene un recuento de los intentos de acceso, y deniega el acceso en caso de que demasiados accesos fracasen. Un intento exitoso reinicia el contador a cero. Puede leer más en pam_tally2 - The Linux-PAM System Administrators' Guide.

pam_unix
Es el módulo PAM estándar de autenticación en UNIX. Utiliza llamadas estándar para recuperar y establecer información de la cuenta, así como la autenticación, generalmente de los archivos /etc/passwd y /etc/shadow. Puede leer más en pam_unix - The Linux-PAM System Administrators' Guide.

pam_warn
Este módulo permite el registro del servicio, terminal, usuario y máquina a través de las herramientas de registro del sistema. [+/-] Ver ejemplo.

pam_wheel
Este módulo se utiliza para exigir la pertenencia al grupo wheel para obtener una escalada de privilegios hacia root. Por defecto solo se permite el acceso a root si el usuario solicitante pertenece al grupo wheel, en caso de que no exista dicho grupo el usuario solicitante deberá pertenecer al grupo con gid 0. Puede leer más en pam_wheel - The Linux-PAM System Administrators' Guide.

pam_xauth
Este módulo permite el reenvío de las claves xauth (cookies) entre usuarios. Esto significa que, por ejemplo, puede configurar su sistema para poder ejecutar programas X desde una sesión xterm logeado como otro usuario como por ejemplo root.


4.- Ejemplos de configuración
El primer ejemplo de configuración que se verá es system-auth, el cual es un servicio artificial usado para englobar políticas comunes a muchos otros servicios tales como login, passwd o su, entre otros muchos servicios.
agd-desktop # cat /etc/pam.d/system-auth
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 retry=3 
password required pam_unix.so try_first_pass use_authtok sha512 shadow 
password optional pam_permit.so
 
session  required pam_limits.so 
session  required pam_env.so 
session  required pam_unix.so 
session  optional pam_permit.so
  • Línea 2: Se requiere la inicialización de las variables de entorno definidas en /etc/security/pam_env.conf
  • Línea 3: Se requiere autenticar al usuario al estilo unix (/etc/passwd y /etc/shadow); además se le pasan los parámetros:
    • try_first_pass, si algún módulo apilado anterior ha recibido una contraseña, la usará para la autenticación.
    • likeauth, pam_sm_setcred() devuelve lo mismo que pam_sm_authenticate().
    • nullok, permite contraseñas en blanco
  • Línea 4: De forma opcional, y en caso de que no se ofrezca un nombre de usuario, el proceso de autenticación continua pero mapeado hacia el usuario nobody.
  • Línea 6: Se requiere la comprobación del estado de la cuenta, como por ejemplo si aun está vigente, si la contraseña ha caducado...
  • Línea 7: De forma opcional se comprueba el estado de la cuenta nobody.
  • Línea 9: Se requiere comprobar el nivel de seguridad de la clave mediante un ataque simple basado en diccionario, además se le pasa las siguiente opciones:
    • difok=2, indica el número de caracteres en la nueva contraseña que no puede estar presente en la antigua contraseña. En este caso solo pueden existir dos caracteres, en la nueva contraseña, iguales a la vieja contraseña.
    • minlen=8, indica el tamaño mínimo aceptable para la nueva contraseña.
    • retry=3, máximo número de intentos para cambiar la contraseña, por defecto 1.
  • Línea 10: Se requiere para actualizar la contraseña, se le pasa las siguientes opciones:
    • try_first_pass, antes de preguntar al usuario por la contraseña intenta usar la contraseña del módulo apilado anterior.
    • use_authtok, toma como nueva contraseña la proporcionado por el módulo apilado anterior; en el ejemplo pam_ctracklib
    • sha512, se utiliza el algoritmo SHA512 para cifrar la contraseña.
    • shadow, guarda las contraseñas cifradas en /etc/shadow.
  • Línea 11: De forma opcional, si en el proceso no se especifica ningún usuario, este se ajustará a nobody.
  • Línea 13: Fuerza que se limiten los recursos de la sesión del usuario de acuerdo al contenido de /etc/security/limits.conf
  • Línea 14: Se requiere la inicialización de las variables de entorno definidas en /etc/security/pam_env.conf
  • Línea 15: Se requiere autenticar al usuario al estilo unix (/etc/passwd y /etc/shadow).
  • Línea 16: De forma opcional, se permite el inicio de sesión como usuario nobody.

A continuación se verá un ejemplo de login, el cual permite a los usuarios iniciar una sesión en el sistema. Puesto que este módulo PAM es responsable de permitir, o denegar, el acceso al sistema, es uno de los puntos más sensibles y de mayor riesgo por ello deberá ser cuidadoso cuando edite la configuración.
agd-desktop # cat /etc/pam.d/login 
auth       required     pam_securetty.so
auth       include      system-local-login

account    include      system-local-login
password   include      system-local-login
session    include      system-local-login
  • Línea 2: Solo se permite la entrada, al usuario root, si el acceso se produce desde una terminal segura de acuerdo a lo definido en /etc/securetty
  • Línea 3, 5, 6 y 7: se incluyen las políticas definidas por el módulo system-local-login.

En el caso del módulo PAM passwd, tan solo se incluyen las políticas definidas por el módulo artificial system-auth.
agd-desktop # cat /etc/pam.d/passwd 
#%PAM-1.0

auth       sufficient   pam_rootok.so
auth       include      system-auth

account    include      system-auth

password   include      system-auth

Por último revisaremos las políticas del módulo su;
agd-desktop # cat /etc/pam.d/su
#%PAM-1.0

auth       sufficient   pam_rootok.so

# If you want to restrict users begin allowed to su even more,
# create /etc/security/suauth.allow (or to that matter) that is only
# writable by root, and add users that are allowed to su to that
# file, one per line.
#auth       required     pam_listfile.so item=ruser sense=allow onerr=fail file=/etc/security/suauth.allow

# Uncomment this to allow users in the wheel group to su without
# entering a passwd.
#auth       sufficient   pam_wheel.so use_uid trust

# Alternatively to above, you can implement a list of users that do
# not need to supply a passwd with a list.
#auth       sufficient   pam_listfile.so item=ruser sense=allow onerr=fail file=/etc/security/suauth.nopass

# Comment this to allow any user, even those not in the 'wheel'
# group to su
auth       required     pam_wheel.so use_uid

auth       include      system-auth

account    include      system-auth

password   include      system-auth

session    include      system-auth
session    required     pam_env.so
session    optional     pam_xauth.so
  • Línea 4: Permite al usuario root cambiar de usuario, a través de su, sin suministrar la contraseña del usuario.
  • Línea 22: Tan solo los usuarios pertenecientes al grupo wheel pueden usar su para logearse como root.
  • Línea 32: De forma opcional, se carga el módulo xauth para que el usuario al que se ha cambiado pueda lanzar aplicaciones X-Window en la sesión del usuario original.

0 comentarios:

Publicar un comentario

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.