1 PAM (Pluggable Authentication Modules)

1.1 Concepto y arquitectura modular

El PAM (Pluggable Authentication Modules) es un mecanismo flexible y modular que permite integrar diferentes métodos de autenticación en GNU/Linux sin necesidad de modificar las aplicaciones.

Actúa como una capa intermedia entre las aplicaciones que requieren autenticación (login, sudo, sshd, passwd, etc.) y los módulos de autenticación que se pueden integrar dinámicamente.

1.1.1 Ventajas principales

1.1.2 Arquitectura general

Figura 1. Imagen de Linux Journal

Descripción del flujo general:

  1. La aplicación llama a la biblioteca libpam.
  2. PAM lee la configuración del servicio (por ejemplo /etc/pam.d/login).
  3. Carga los módulos definidos, en el orden especificado.
  4. Cada módulo devuelve éxito o error, y PAM decide el resultado final.
  5. La aplicación recibe una respuesta global (acceso concedido o denegado).

1.2 Tipos de módulos

Existen cuatro tipos principales de módulos PAM, cada uno correspondiente a una fase del proceso de autenticación: auth, account, password y session.

Tipo Cuándo se ejecuta Función principal Ejemplos de módulos
auth Al iniciar sesión Comprueba la identidad del usuario (contraseña, token, huella, etc.) pam_unix.so, pam_faillock.so, pam_google_authenticator.so
account Después de autenticar Verifica si la cuenta puede usarse (vigencia, horario, terminal, etc.) pam_unix.so, pam_access.so, pam_time.so
password Al cambiar contraseñas Controla la actualización y complejidad de contraseñas pam_pwquality.so, pam_cracklib.so
session Al iniciar/cerrar sesión Ejecuta acciones al abrir o cerrar sesión (montar recursos, registrar accesos, aplicar límites) pam_limits.so, pam_env.so, pam_lastlog.so

Cada tipo tiene su propia pila de módulos que se ejecuta de forma independiente.


1.3 Fases de ejecución del proceso PAM

Cuando un usuario intenta iniciar sesión en un sistema Linux, el mecanismo PAM (Pluggable Authentication Modules) se encarga de gestionar todo el proceso de autenticación.

PAM no realiza la autenticación por sí mismo, sino que coordina distintos módulos que verifican la identidad del usuario, comprueban el estado de su cuenta y preparan su sesión.

PAM evalúa las reglas en orden y por fases, pasando por cuatro etapas principales. Cada fase utiliza módulos específicos (auth, account, password, session) que cumplen funciones diferentes.

1.3.1 Ejemplo del proceso PAM cuando un usuario inicia sesión

Supongamos que un usuario llamado maria inicia sesión desde la terminal:

  1. auth. PAM verifica su nombre de usuario y contraseña (pam_unix.so). También comprueba si el sistema está en mantenimiento (pam_nologin.so).

  2. account. Revisa si la cuenta de maria está activa y no ha caducado (pam_unix.so). Si la contraseña está expirada, se pedirá un cambio.

  3. password. Si maria decide cambiar su contraseña, este módulo aplica las reglas de complejidad (pam_pwquality.so).

  4. session. Si la autenticación fue correcta, PAM crea la sesión, carga las variables de entorno (pam_env.so), muestra el mensaje del día (pam_motd.so) y registra el acceso (pam_lastlog.so).


1.4 Archivos de configuración de PAM

El funcionamiento de PAM se define mediante archivos de configuración que especifican qué módulos se ejecutan, en qué orden y cómo debe actuar el sistema ante el éxito o el fallo de cada uno.

Hay dos formatos principales para estos archivos:

Ejemplo:

$ ls /etc/pam.d/
chfn      chsh            common-auth      common-session                 cron   newusers  passwd   runuser-l  su    sudo    vmtoolsd
chpasswd  common-account  common-password  common-session-noninteractive  login  other     runuser  sshd       su-l  sudo-i

Cada archivo contiene una serie de reglas, una por línea, con la siguiente estructura general:

tipo   control   módulo   [argumentos]

1.4.1 Elementos principales de una regla

Campo Descripción
tipo Indica la fase del proceso de autenticación en la que se aplica la regla. Puede ser auth, account, password o session.
control Determina la acción que realizará PAM según el resultado del módulo (éxito o fallo).
módulo Especifica el nombre o la ruta del módulo que se ejecutará (por ejemplo, pam_unix.so, pam_nologin.so).
argumentos Define los parámetros adicionales que modifican el comportamiento del módulo (por ejemplo, retry=3, use_authtok, debug).

1.5 El campo control. Cómo se evalúan las reglas

El campo control define cómo afecta el resultado de cada módulo al resultado final de la pila:

Control Significado Comportamiento
required Obligatorio Si falla, se sigue ejecutando el resto, pero el resultado global será fallo.
requisite Obligatorio e inmediato Si falla, se detiene la ejecución inmediatamente y se devuelve error.
sufficient Suficiente Si tiene éxito y no hay fallos previos, PAM considera la pila exitosa y no ejecuta los módulos siguientes.
optional Opcional Su éxito o fallo no afecta el resultado global, salvo que sea el único módulo del tipo.

1.6 Ejemplo de evaluación de reglas

1.6.1 Versión simplificada del archivo /etc/pam.d/login

A continuación se muestra un ejemplo simplificado del archivo de configuración de PAM utilizado por el servicio login. Este archivo define los módulos que se ejecutarán durante el proceso de autenticación local del sistema:

auth required   pam_securetty.so
auth requisite  pam_nologin.so
auth sufficient pam_unix.so
auth required   pam_deny.so

Evaluación paso a paso

  1. pam_securetty.so

    • Comprueba si el usuario root intenta iniciar sesión desde una terminal segura (definida en /etc/securetty).
    • Si la verificación falla, el acceso no será finalmente concedido, pero PAM seguirá evaluando el resto de las reglas, ya que el control es de tipo required.
  2. pam_nologin.so

    • Verifica si existe el archivo /etc/nologin.
    • Si el archivo está presente, el acceso se bloquea inmediatamente para todos los usuarios excepto root y el proceso de autenticación se detiene, porque el control es requisite.
    • Si el archivo no existe, la evaluación continúa con la siguiente regla.
  3. pam_unix.so

    • Valida el nombre de usuario y la contraseña frente a los datos almacenados en /etc/passwd y /etc/shadow.
    • Si la autenticación tiene éxito y no se han producido fallos previos en módulos required, el control sufficient hace que PAM detenga la pila con éxito (ya no se evalúan más módulos).
    • Si la autenticación falla, el proceso continúa hacia la siguiente regla.
  4. pam_deny.so

    • Este módulo falla siempre, y su propósito es denegar el acceso en caso de que todos los módulos anteriores no hayan autenticado correctamente al usuario.
    • Actúa como una medida de seguridad final para garantizar que no se conceda acceso de manera accidental.

1.7 Módulos más comunes

A continuación, se presentan dos tablas con algunos de los módulos PAM más utilizados. La primera tabla muestra módulos para realizar autenticación y administración general, mientras que la segunda tabla muestra módulos más avanzados para realizar hardening del sistema.

Nivel Básico: Módulos para autenticación y administración general

Módulo Tipo Función principal / Propósito de seguridad Archivo o contexto habitual
pam_unix.so auth / account / password / session Implementa la autenticación clásica UNIX validando contraseñas en /etc/passwd y /etc/shadow. /etc/pam.d/common-auth, /etc/pam.d/common-password
pam_pwquality.so password Refuerza la fortaleza de contraseñas (longitud, complejidad, diccionarios). Sustituye a pam_cracklib.so. /etc/security/pwquality.conf
pam_nologin.so auth / account Bloquea el acceso a usuarios normales si existe /etc/nologin (modo mantenimiento). /etc/pam.d/login, /etc/nologin
pam_securetty.so auth Restringe el acceso de root solo a terminales seguras definidas en /etc/securetty. /etc/pam.d/login, /etc/securetty
pam_limits.so session Aplica límites de uso de recursos (CPU, procesos, memoria) según /etc/security/limits.conf. /etc/pam.d/common-session
pam_env.so session Carga variables de entorno del usuario desde /etc/environment o /etc/security/pam_env.conf. /etc/pam.d/common-session
pam_lastlog.so session Muestra el último inicio de sesión y actualiza el registro lastlog. /etc/pam.d/login
pam_motd.so session Muestra el “mensaje del día” (MOTD) al iniciar sesión. /etc/pam.d/login, /etc/pam.d/sshd
pam_deny.so auth / account / password / session Deniega siempre el acceso; se usa al final de las pilas como medida de seguridad. Al final de cualquier pila de reglas
pam_permit.so auth / account / password / session Siempre concede acceso; se usa solo para pruebas o configuraciones por defecto. Configuraciones básicas del sistema

Nivel Avanzado: Módulos para hardening del sistema

Módulo Tipo Función principal / Propósito de seguridad Archivo o contexto habitual
pam_faillock.so auth / account Previene ataques de fuerza bruta bloqueando cuentas tras varios intentos fallidos. /etc/pam.d/common-auth, /etc/security/faillock.conf
pam_google_authenticator.so auth Implementa autenticación multifactor (2FA) basada en códigos TOTP. /etc/pam.d/sshd
pam_access.so account Controla el acceso según usuario, grupo, TTY o dirección IP (según /etc/security/access.conf). /etc/pam.d/login, /etc/security/access.conf
pam_time.so account Restringe el acceso de usuarios en función del horario o día de la semana. /etc/pam.d/login, /etc/security/time.conf
pam_selinux.so session Configura el contexto de seguridad de SELinux al iniciar sesión. /etc/pam.d/login, /etc/pam.d/sshd
pam_mkhomedir.so session Crea automáticamente el directorio /home/usuario si no existe (útil con LDAP/NIS). /etc/pam.d/common-session
pam_loginuid.so session Asigna un identificador único de sesión, útil para auditoría y trazabilidad. /etc/pam.d/login, /etc/pam.d/sshd
pam_systemd.so session Integra la sesión del usuario con systemd-logind para una gestión moderna de sesiones. /etc/pam.d/common-session
pam_keyinit.so session Crea un nuevo keyring de sesión del kernel para almacenamiento seguro de claves o tokens. /etc/pam.d/common-session
pam_access.so account Refuerza las políticas de acceso combinando restricciones por IP, grupo o usuario. /etc/security/access.conf

1.8 Depuración y análisis

La depuración en PAM permite analizar el flujo de ejecución de los módulos y detectar posibles errores de autenticación o configuración.

Es una herramienta muy útil durante tareas de auditoría o bastionado de sistemas.

Para ver cómo se ejecutan los módulos, se puede activar el modo debug en la línea correspondiente del archivo PAM.

Ejemplo:

auth required pam_unix.so debug

Con esta opción, el módulo registrará información adicional sobre cada paso del proceso de autenticación (inicio, verificación, resultado, errores, etc.).

Los mensajes generados por PAM se almacenan en los registros del sistema, que pueden consultarse con el comando:

sudo tail -f /var/log/auth.log

o con el comando:

sudo journalctl -xe | grep pam

Nota: Las opciones -xe en journalctl permiten ver mensajes detallados y de error relacionados con PAM.

-x: Muestra explicaciones adicionales para los mensajes.

-e: Salta al final del registro para ver los mensajes más recientes.


1.9 Integración de PAM con políticas de seguridad

PAM permite implementar políticas de seguridad avanzadas que refuerzan la autenticación y reducen riesgos:

Política de seguridad Módulo / Archivo Descripción
Bloqueo tras intentos fallidos pam_faillock.so Bloquea temporalmente la cuenta después de varios intentos fallidos.
Contraseñas seguras pam_pwquality.so o pam_cracklib.so Exige contraseñas con longitud, mezcla de caracteres y sin coincidencias con diccionarios.
Expiración de contraseñas /etc/login.defs, chage Define la validez y caducidad de las contraseñas.
Restricciones de horario o terminal pam_time.so, pam_securetty.so Limita accesos según hora o dispositivo.
Límites de recursos pam_limits.so Controla el uso de CPU, procesos o memoria por usuario.
Segundo factor de autenticación (2FA) pam_google_authenticator.so Añade verificación adicional mediante códigos TOTP.

Estas políticas suelen combinarse dentro de los archivos comunes (/etc/pam.d/common-auth, common-password, etc.) para aplicarse a múltiples servicios del sistema.


1.10 /etc/nologin y control de mantenimiento

El archivo /etc/nologin es un mecanismo que permite bloquear temporalmente el acceso de los usuarios normales. Cuando este archivo existe, el módulo pam_nologin.so deniega el acceso a todos los usuarios excepto al superusuario root, mostrando el contenido del archivo como mensaje informativo.

Ejemplo de uso:

echo "El sistema está en mantenimiento. Inténtelo más tarde." | sudo tee /etc/nologin > /dev/null

Para reactivar los logins:

sudo rm /etc/nologin

Este mecanismo se utiliza habitualmente durante tareas de mantenimiento o reinicios planificados.


1.11 Buenas prácticas de seguridad con PAM

  1. Restringir accesos de root a terminales seguras mediante pam_securetty.so.
  2. Bloquear cuentas tras varios intentos fallidos con pam_faillock.so.
  3. Evitar contraseñas débiles con pam_pwquality.so o pam_cracklib.so.
  4. Aplicar límites de recursos a usuarios con pam_limits.so.
  5. Implementar autenticación multifactor (2FA) en servicios críticos (sshd, sudo).
  6. Auditar accesos con pam_lastlog.so y revisar /var/log/auth.log.
  7. Proteger archivos sensibles de PAM con permisos adecuados (chmod 644, propiedad root).
  8. Probar la configuración antes de aplicarla globalmente (para evitar bloqueos).

1.12 Bastionado del sistema PAM en Ubuntu según las recomendaciones del CIS

¿Qué es el CIS?

El CIS (Center for Internet Security) es una organización sin fines de lucro que proporciona directrices y mejores prácticas para la seguridad informática.

¿Qué son los CIS Benchmarks?

Los CIS Benchmarks son conjuntos de mejores prácticas de seguridad para sistemas y aplicaciones. Estos benchmarks son desarrollados mediante un proceso de consenso entre expertos en seguridad y son utilizados por organizaciones para evaluar y mejorar su postura de seguridad.

Bastionado de PAM según el CIS Benchmark para Ubuntu Linux 24.04

Consulte la guía oficial del CIS Benchmark for Ubuntu Linux 24.04 para obtener recomendaciones detalladas sobre el bastionado de PAM en sistemas Ubuntu.


1.13 Ejercicios prácticos

Ejercicio
1 Aplicación Python con autenticación PAM
2 Configuración de bloqueo de usuarios con pam_faillock.so
3 Política de contraseñas con pam_cracklib y pam_pwquality
4 Habilitar 2FA con Google Authenticator

1.13.1 Ejercicio 1. Crea una aplicación en Python que utilice PAM para autenticación

En esta práctica tendrá que desarrollar una aplicación sencilla en Python que integre la autenticación del sistema mediante PAM (Pluggable Authentication Modules), permitiendo validar usuarios y contraseñas del sistema Linux de forma segura.

En esta unidad hemos visto que PAM (Pluggable Authentication Modules) es una capa de autenticación modular que permite a las aplicaciones usar distintos métodos de validación (contraseña, biometría, 2FA, etc.) sin necesidad de modificar su código.

El paquete python-pam actúa como interfaz entre Python y la biblioteca PAM del sistema, permitiendo autenticar usuarios directamente contra la configuración definida en /etc/pam.d/.

Paso 1. Crea un entorno virtual de Python

En primer lugar, asegúrate de tener instalado el paquete python3-venv para crear entornos virtuales en Python:

sudo apt install python3-venv

Luego, crea un entorno virtual y actívalo:

python3 -m venv venv
source venv/bin/activate

Paso 2. Instala las dependencias necesarias

Instala las librerías requeridas para usar PAM desde Python:

pip install python-pam
pip install six

Paso 3. Crea el script de Python

Crea el archivo app.py con el siguiente contenido:

#!/usr/bin/env python3
import pam
import getpass

def autenticar_usuario():
    p = pam.pam()
    usuario = input("Usuario: ")
    password = getpass.getpass("Contraseña: ")  # El texto no se muestra al escribir

    if p.authenticate(usuario, password):
        print(f"Autenticación correcta. Bienvenido, {usuario}.")
    else:
        print("Error de autenticación. Usuario o contraseña incorrectos.")

if __name__ == "__main__":
    autenticar_usuario()

Paso 4. Ejecuta la aplicación

python app.py

Verifica que el programa reconoce las credenciales del sistema y no acepta contraseñas incorrectas.

1.13.2 Ejercicio 2: Configuración de bloqueo de usuarios con pam_faillock.so

En esta práctica vamos a implementar una política de seguridad en el sistema GNU/Linux mediante el módulo pam_faillock.so, de forma que:

El módulo pam_faillock.so forma parte del sistema PAM (Pluggable Authentication Modules) y se utiliza para:

Los bloqueos se registran en el directorio: /var/run/faillock/.

Paso 1. Instalar el paquete necesario

Comprueba que el módulo PAM está instalado:

sudo apt install libpam-modules -y

Paso 2. Hacer copia de seguridad de los archivos PAM

Antes de modificar los archivos, es una buena práctica guardar una copia:

sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.bak
sudo cp /etc/pam.d/common-account /etc/pam.d/common-account.bak

Paso 3. Configurar el archivo /etc/pam.d/common-auth

Edita el archivo con privilegios de root:

sudo nano /etc/pam.d/common-auth

Añade las siguientes líneas al principio del archivo, antes de cualquier otra regla auth:

auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900

La primera línea se ejecuta antes de pedir la contraseña, en esta línea PAM revisa si el usuario está bloqueado. Si lo está, deniega el acceso inmediatamente sin perdir la contraseña.

Los parámetros utilizados en la primera línea son:

Parámetro Significado
auth Indica que esta regla pertenece a la fase de autenticación.
required Si este módulo falla, el resultado global será fallo (aunque se sigan ejecutando los demás).
pam_faillock.so Módulo que gestiona los intentos fallidos de login.
preauth Comprueba si el usuario ya está bloqueado antes de autenticarlo.
silent No muestra mensajes adicionales al usuario.
audit Envía registros de auditoría al sistema (/var/log/auth.log o journalctl).
deny=5 Bloquea la cuenta tras 5 intentos fallidos consecutivos.
unlock_time=900 Desbloquea automáticamente después de 900 segundos (15 minutos).

La segunda línea se ejecuta el módulo clásico pam_unix.so, que valida la contraseña del usuario frente al archivo /etc/shadow.

Los parámetros utilizados en la segunda línea son:

Parámetro Significado
success=1 Si la autenticación tiene éxito, se salta una línea, es decir, pasa a la siguiente regla después de la siguiente.
default=bad Si la autenticación falla, se marca el resultado como fallido.

La tercera línea se ejecuta si la autenticación ha fallado. Registra el intento fallido y, si se alcanza el límite, bloquea la cuenta.

Los parámetros utilizados en la tercera línea son:

Parámetro Significado
authfail Indica que esta ejecución se produce tras un intento fallido.
audit Registra el intento fallido en los logs.
deny=5 Bloquea la cuenta tras 5 intentos consecutivos fallidos.
unlock_time=900 Desbloquea después de 15 minutos.
[default=die] Si el módulo falla, se detiene la pila de autenticación inmediatamente.

Paso 4. Configurar el archivo /etc/pam.d/common-account

Edita el archivo /etc/pam.d/common-account y asegúrate de incluir la siguiente línea al principio del archivo:

account required pam_faillock.so

Esta línea garantiza que se compruebe el estado de bloqueo del usuario antes de permitir el acceso.

Paso 5. Crear un usuario de prueba

Crea un usuario normal para probar la configuración:

sudo adduser prueba

Paso 6. Probar el bloqueo de cuenta

Inicia sesión con el usuario creado:

su - prueba

Introduce una contraseña incorrecta 5 veces seguidas y en el sexto intento deberías ver un mensaje indicando que la cuenta está bloqueada.

Nota: Puede ejecutar el comando journalctl -f en otra terminal para ver los mensajes de PAM en tiempo real.

Paso 7. Verificar el bloqueo

Consulta la información del bloqueo:

sudo faillock --user prueba

Paso 8. Desbloquear manualmente al usuario

Si necesitas desbloquear al usuario antes de los 15 minutos puedes ejecutar este comando:

sudo faillock --user prueba --reset

Paso 9. Revisar los archivos de log del sistema

Para analizar los eventos generados por PAM puede ejecutar el comando:

sudo grep pam_faillock /var/log/auth.log

O bien:

sudo journalctl -f | grep pam_faillock

Cuestiones para reflexionar

  1. ¿Qué ocurre si cambias unlock_time=0?
  2. ¿Dónde se almacenan los archivos de bloqueo de pam_faillock?
  3. ¿Qué ventajas tiene usar este módulo frente a herramientas externas como fail2ban?

1.13.3 Ejercicio 3. Definición y aplicación de la política de contraseñas con pam_pwquality

En esta práctica vamos a configurar el módulo pam_pwquality.so para exigir contraseñas con los siguientes requisitos mínimos:

El módulo pam_pwquality.so, que sustituye al antiguo pam_cracklib.so, verifica la fortaleza de las contraseñas cuando un usuario las crea o modifica. Forma parte de la fase password del sistema PAM.

El archivo principal de configuración de este módulo se encuentra en la ruta:

/etc/security/pwquality.conf

La función principal de pam_pwquality.so es:

Paso 1. Instalar el paquete necesario

Asegúrate de tener instalado el paquete correspondiente:

sudo apt install libpam-pwquality -y

Paso 2. Editar el archivo /etc/pam.d/common-password

Abre el archivo con privilegios de administrador:

sudo nano /etc/pam.d/common-password

Busca una línea similar a esta:

password requisite pam_pwquality.so retry=3

Tenga en cuenta que pueda variar ligeramente según la distribución o versión de Linux.

Si no existe, añádela al principio del bloque de contraseñas, justo antes de pam_unix.so:

password requisite pam_pwquality.so retry=3
password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512

Los parámetros utilizados en la línea que hemos añadido son:

Elemento Descripción
password Indica que la regla pertenece al módulo de gestión de contraseñas dentro de PAM.
requisite Si la verificación falla, PAM aborta el cambio de contraseña inmediatamente.
pam_pwquality.so Módulo que verifica la complejidad y fortaleza de las contraseñas nuevas.
retry=3 Permite hasta tres intentos de introducir una contraseña válida antes de cancelar el proceso.

Paso 3. Editar las reglas en /etc/security/pwquality.conf

Abre el archivo de configuración:

sudo nano /etc/security/pwquality.conf

Y añade o modifica las siguientes líneas:

# --- Política de contraseñas seguras ---
minlen = 12
minclass = 3
maxrepeat = 3
maxsequence = 3
usercheck = 1
enforce_for_root

A continuación se explica el significado de cada parámetro.

Parámetro Significado
minlen = 12 Longitud mínima de la contraseña.
minclass = 3 Exige al menos 3 clases de caracteres entre: mayúsculas, minúsculas, dígitos y símbolos.
maxrepeat = 3 No permite más de 3 caracteres idénticos consecutivos.
maxsequence = 3 Evita secuencias como “abcd” o “1234”.
usercheck = 1 Rechaza cualquier contraseña que contenga el nombre de usuario completo.
enforce_for_root Aplica la política incluso al superusuario (root).

Paso 4. Cambia la contraseña de un usuario

Cambia la contraseña del usuario actual o de un usuario de prueba:

sudo passwd prueba

Intenta establecer contraseñas inseguras y observa los mensajes de error.

Después, prueba con una contraseña que cumpla los requisitos.

Paso 5. Verificación y logs

Los intentos de cambio de contraseña quedan registrados en:

/var/log/auth.log

Puedes revisar los fallos o rechazos con el comando:

sudo grep pwquality /var/log/auth.log

Cuestiones para reflexionar

  1. ¿Qué ocurre si estableces minclass = 4?
  2. ¿Por qué es útil la opción reject_username en entornos corporativos?
  3. ¿Debería aplicarse esta política también a root? ¿Por qué?
  4. ¿Dónde se almacena la configuración global de las políticas de contraseñas?

1.13.4 Ejercicio 4. Habilitar 2FA con Google Authenticator

Siga los pasos de este tutorial para configurar la autenticación de dos factores (2FA) en su servidor Ubuntu utilizando Google Authenticator y PAM:

Referencias:


1.14 Recursos

Videos

PDFs

Web