4.7 PAM — Autenticación Modular
Cuando escribes tu contraseña para hacer sudo, SSH o iniciar sesión en consola, no es el programa en cuestión quien verifica tu identidad: todos delegan esa responsabilidad en PAM. PAM actúa como un portero modular entre cualquier servicio y el sistema de autenticación del kernel.
1. La arquitectura de PAM
Sección titulada “1. La arquitectura de PAM"PAM organiza la autenticación en cuatro tipos de gestión, cada uno con su propia pila de módulos:
| Tipo | Qué gestiona |
|---|---|
auth | Verifica la identidad (¿eres quien dices ser?) |
account | Verifica condiciones de cuenta (¿puede entrar ahora?, ¿está bloqueada?) |
password | Gestiona el cambio de contraseñas (complejidad, historial) |
session | Configura el entorno al abrir/cerrar sesión (montar home, límites) |
Cada servicio (sshd, sudo, login, su) tiene su propio fichero de configuración en /etc/pam.d/:
ls /etc/pam.d/# common-auth common-account common-password common-session# sshd sudo login su passwd ...Los ficheros common-* son incluidos por la mayoría de servicios con @include, por lo que cambiarlos afecta a todo el sistema.
2. Sintaxis de un fichero PAM
Sección titulada “2. Sintaxis de un fichero PAM"Cada línea de un fichero PAM sigue este formato:
<tipo> <control> <módulo.so> [argumentos]Flags de control
Sección titulada “Flags de control"| Flag | Comportamiento |
|---|---|
required | Debe pasar. El fallo se notifica al final (continúa evaluando) |
requisite | Debe pasar. El fallo detiene la evaluación inmediatamente |
sufficient | Si pasa (y ningún required anterior falló), concede acceso |
optional | El resultado no afecta al resultado final |
# Ejemplo de /etc/pam.d/common-authauth required pam_faillock.so preauthauth [success=1 default=ignore] pam_unix.so nullokauth [default=die] pam_faillock.so authfailauth required pam_permit.so3. pam_pwquality — Política de contraseñas
Sección titulada “3. pam_pwquality — Política de contraseñas"Instalación:
sudo apt install libpam-pwqualityConfiguración en /etc/security/pwquality.conf:
# Longitud mínimaminlen = 12
# Requisitos de caracteres (negativo = mínimo obligatorio)dcredit = -1 # al menos 1 dígitoucredit = -1 # al menos 1 mayúsculalcredit = -1 # al menos 1 minúsculaocredit = -1 # al menos 1 carácter especial
# Máximo de caracteres consecutivos igualesmaxrepeat = 3
# Comprobar que la contraseña no contiene el nombre del usuario (campo GECOS)gecoscheck = 1
# Número de intentos antes de error (en programas que usan retry)retry = 3Verifica que el módulo está activo en /etc/pam.d/common-password:
grep pwquality /etc/pam.d/common-password# password requisite pam_pwquality.so retry=3Prueba la política:
# Intenta asignar una contraseña débil (debe fallar)sudo passwd usuario_prueba# BAD PASSWORD: The password is too short# BAD PASSWORD: it does not contain enough DIFFERENT characters4. pam_faillock — Bloqueo por intentos fallidos
Sección titulada “4. pam_faillock — Bloqueo por intentos fallidos"pam_faillock registra los intentos de autenticación fallidos y bloquea la cuenta temporalmente cuando se supera un umbral. Reemplaza al antiguo pam_tally2.
Configuración en /etc/security/faillock.conf:
# Número de fallos antes del bloqueodeny = 3
# Ventana de tiempo en la que se cuentan los fallos (segundos)fail_interval = 300
# Tiempo de bloqueo (segundos). 0 = bloqueo permanente hasta unlock manualunlock_time = 600
# Registrar intentos en el log de auditoríaaudit
# No mostrar mensajes informativos al atacantesilentVerificar el estado de una cuenta:
# Ver intentos fallidos registradossudo faillock --user usuario
# Desbloquear manualmente una cuenta (soporte sysadmin)sudo faillock --user usuario --reset5. pam_limits — Límites de recursos por usuario
Sección titulada “5. pam_limits — Límites de recursos por usuario"pam_limits aplica los límites definidos en /etc/security/limits.conf a cada sesión de usuario. Esto controla cuántos procesos, ficheros abiertos o memoria puede usar cada usuario o grupo.
Formato de /etc/security/limits.conf:
<dominio> <tipo> <ítem> <valor>| Dominio | Significa |
|---|---|
usuario | Usuario concreto |
@grupo | Todos los miembros del grupo |
* | Todos los usuarios |
| Tipo | Efecto |
|---|---|
soft | Límite que el usuario puede aumentar hasta el hard |
hard | Techo absoluto que solo root puede superar |
Ítems más usados en LFCS:
# Máximo de procesos simultáneos para el grupo webdevs@webdevs soft nproc 100@webdevs hard nproc 150
# Máximo de ficheros abiertos para el usuario app_userapp_user soft nofile 4096app_user hard nofile 8192
# Tamaño máximo de ficheros core dump (0 = sin dumps)* hard core 0
# Tiempo máximo de CPU (minutos) para todos los usuarios* hard cpu 60También se pueden crear ficheros en /etc/security/limits.d/ (misma sintaxis, mejor organización):
sudo nano /etc/security/limits.d/99-webdevs.confVerificar los límites de la sesión actual:
# Ver todos los límites de la sesión activaulimit -a
# Ver el límite de ficheros abiertosulimit -n
# Cambiar temporalmente (solo soft limit, sin sudo)ulimit -n 81926. pam_env — Variables de entorno de sesión
Sección titulada “6. pam_env — Variables de entorno de sesión"pam_env carga variables de entorno al iniciar sesión, configuradas en /etc/security/pam_env.conf o /etc/environment.
# /etc/environment — se carga para TODOS los usuarios en loginLANG=es_ES.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binEDITOR=nano
# También funciona para variables de aplicaciónJAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd647. Perfiles de entorno del sistema
Sección titulada “7. Perfiles de entorno del sistema"Además de PAM, hay varios ficheros que configuran el entorno de shell para todos los usuarios:
| Fichero | Cuándo se carga |
|---|---|
/etc/environment | Variables globales (no es un script, solo CLAVE=valor) |
/etc/profile | Script para todos los usuarios en shells de login |
/etc/profile.d/*.sh | Scripts modulares cargados por /etc/profile |
/etc/bash.bashrc | Para shells interactivos (no de login) |
/etc/skel/ | Plantilla de ficheros que se copian al crear un usuario nuevo |
# Añadir un alias global para todos los usuariossudo nano /etc/profile.d/00-aliases.shalias ll='ls -lh --color=auto'alias la='ls -lAh --color=auto'# /etc/skel/ — qué tiene un usuario nuevo al crearsels -la /etc/skel/# .bash_logout .bashrc .profile