Ir al contenido

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.


PAM organiza la autenticación en cuatro tipos de gestión, cada uno con su propia pila de módulos:

TipoQué gestiona
authVerifica la identidad (¿eres quien dices ser?)
accountVerifica condiciones de cuenta (¿puede entrar ahora?, ¿está bloqueada?)
passwordGestiona el cambio de contraseñas (complejidad, historial)
sessionConfigura 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/:

ventana terminal
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.


Cada línea de un fichero PAM sigue este formato:

<tipo> <control> <módulo.so> [argumentos]
FlagComportamiento
requiredDebe pasar. El fallo se notifica al final (continúa evaluando)
requisiteDebe pasar. El fallo detiene la evaluación inmediatamente
sufficientSi pasa (y ningún required anterior falló), concede acceso
optionalEl resultado no afecta al resultado final
ventana terminal
# Ejemplo de /etc/pam.d/common-auth
auth required pam_faillock.so preauth
auth [success=1 default=ignore] pam_unix.so nullok
auth [default=die] pam_faillock.so authfail
auth required pam_permit.so

3. pam_pwquality — Política de contraseñas

Sección titulada “3. pam_pwquality — Política de contraseñas"

Instalación:

ventana terminal
sudo apt install libpam-pwquality

Configuración en /etc/security/pwquality.conf:

# Longitud mínima
minlen = 12
# Requisitos de caracteres (negativo = mínimo obligatorio)
dcredit = -1 # al menos 1 dígito
ucredit = -1 # al menos 1 mayúscula
lcredit = -1 # al menos 1 minúscula
ocredit = -1 # al menos 1 carácter especial
# Máximo de caracteres consecutivos iguales
maxrepeat = 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 = 3

Verifica que el módulo está activo en /etc/pam.d/common-password:

ventana terminal
grep pwquality /etc/pam.d/common-password
# password requisite pam_pwquality.so retry=3

Prueba la política:

ventana terminal
# 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 characters

4. 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 bloqueo
deny = 3
# Ventana de tiempo en la que se cuentan los fallos (segundos)
fail_interval = 300
# Tiempo de bloqueo (segundos). 0 = bloqueo permanente hasta unlock manual
unlock_time = 600
# Registrar intentos en el log de auditoría
audit
# No mostrar mensajes informativos al atacante
silent

Verificar el estado de una cuenta:

ventana terminal
# Ver intentos fallidos registrados
sudo faillock --user usuario
# Desbloquear manualmente una cuenta (soporte sysadmin)
sudo faillock --user usuario --reset

5. 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>
DominioSignifica
usuarioUsuario concreto
@grupoTodos los miembros del grupo
*Todos los usuarios
TipoEfecto
softLímite que el usuario puede aumentar hasta el hard
hardTecho absoluto que solo root puede superar

Ítems más usados en LFCS:

/etc/security/limits.conf
# 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_user
app_user soft nofile 4096
app_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 60

También se pueden crear ficheros en /etc/security/limits.d/ (misma sintaxis, mejor organización):

ventana terminal
sudo nano /etc/security/limits.d/99-webdevs.conf

Verificar los límites de la sesión actual:

ventana terminal
# Ver todos los límites de la sesión activa
ulimit -a
# Ver el límite de ficheros abiertos
ulimit -n
# Cambiar temporalmente (solo soft limit, sin sudo)
ulimit -n 8192

6. 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.

ventana terminal
# /etc/environment — se carga para TODOS los usuarios en login
LANG=es_ES.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
EDITOR=nano
# También funciona para variables de aplicación
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

Además de PAM, hay varios ficheros que configuran el entorno de shell para todos los usuarios:

FicheroCuándo se carga
/etc/environmentVariables globales (no es un script, solo CLAVE=valor)
/etc/profileScript para todos los usuarios en shells de login
/etc/profile.d/*.shScripts modulares cargados por /etc/profile
/etc/bash.bashrcPara shells interactivos (no de login)
/etc/skel/Plantilla de ficheros que se copian al crear un usuario nuevo
ventana terminal
# Añadir un alias global para todos los usuarios
sudo nano /etc/profile.d/00-aliases.sh
/etc/profile.d/00-aliases.sh
alias ll='ls -lh --color=auto'
alias la='ls -lAh --color=auto'
ventana terminal
# /etc/skel/ — qué tiene un usuario nuevo al crearse
ls -la /etc/skel/
# .bash_logout .bashrc .profile