PAM

De Astillas.net


Enlaces y referencias

Introducción

PAM (Pluggable Authentication Modules) es un mecanismo que permite ampliar enormemente el control de acceso de un usuario a una aplicación sin necesidad de tocar ésta. Si la aplicación incluye soporte para PAM basta con cambiar la configuración del sistema para que existan formas nuevas de controlar el acceso, incluyendo la ejecución de tareas cuando una sesión comienza ó acaba.

La configuración de PAM se realiza mediante un archivo de texto que define un juego de reglas (la normativa de acceso) situado en el directorio /etc/pam.d; si éste no existe se intentan utilizar el archivo /etc/pam.conf.

Generalmente una aplicación buscará primero un archivo con el mismo nombre que ella y, si no lo encuentra, irá a consultar el genérico llamado /etc/pam.d/other que debería rechazar cualquier acceso por principio, ó emplear un mecanismo aplicable a todo el mundo.

Cada uno de los archivos puede ó no incluir a otros, y termina formando una pila de acciones a llevar a cabo para dar por satisfactorio el acceso al servicio.

Los módulos que conforman el sistema de control de acceso están situados normalmente en /lib/security como bibliotecas de carga dinámica.

Áreas de actuación

PAM cubre varias áreas distintas y es importante saber cuáles son y cuándo se aplican, dada la naturaleza de pila de su funcionamiento.

auth

Abarca dos aspectos en la autorización de acceso:

  • Identificar al usuario, garantizando que es quien dice ser, para lo cual pide a la aplicación que solicite una contraseña ó algún mecanismo similar de control.
  • Asignar grupos al usuario una vez superado el paso anterior.

Algunos de los módulos que se aplican en este área:

  • pam_env: cambia variables de entorno.
  • pam_faildelay: establece el retraso que se impone al usuario tras un fallo de acceso en una aplicación dada.
  • pam_filter: es un tanto marginal, puesto que sólo se puede emplear en un terminal ó en un programa que emplee la entrada y salida estándar, y tiene como fin filtrar todo lo que pase entre el usuario y la aplicación, tal y como cambiar mayúsculas por minúsculas.

account

Referente a las limitaciones de una cuenta de usuario, esto es, si el usuario está identificado, ¿ qué es lo que puede hacer ?

Útil para restringir accesos basados en aspectos como la hora del día, la carga del sistema ó el origen del acceso, como por ejemplo, sólo se permite entrar como root desde la consola.

Algunos de los módulos que se aplican:

session

Aplicable a la gestión de conexiones y se invoca cuando se deben realizar tareas al comienzo ó al final de la sesión, como por ejemplo:

  • Registrar el acceso.
  • Montar unidades remotas.
  • Crear directorios si no existen.

Algunos de los módulos que se aplican son:

  • pam_env: cambia variables de entorno.
  • pam_exec: llama a un programa externo.
  • pam_xauth: traslada autorizaciones X entre usuarios.

password

Todo lo referido a las contraseñas, bien en su actualización, bien en su cambio, y extensible a todos los datos identificativos.

  • pam_unix: identificación tradicional por contraseñas, normalmente empleando los archivos /etc/passwd y /etc/shadow.
  • pam_echo: muestra mensajes especiales en el terminal del usuario, leyendo de un determinado archivo y sustituyendo secuencias especiales como el nombre de la máquina remota, el terminal ó el nombre del servicio.
  • pam_cracklib: verifica la fortaleza de las contraseñas verificando cosas como que no esté en un diccionario, que no sea un palíndromo y que no sea demasiado parecida ó incluso igual a una antigua contraseña.

Síntaxis de archivos de configuración

Los archivos que definen el mecanismo a utilizar con PAM consisten en líneas de reglas, con la característica de que admiten comentarios (usando el carácter #) y pueden extenderse utilizando una barra como carácter de escape del fin de línea. Vamos, lo habitual en las configuraciones UNIX.

Cada regla es una colección de elementos sintácticos (tokens) separados por espacios en blanco, siendo únicamente los tres primeros insensibles a maýusculas y minúsculas.

servicio tipo control ruta-al-modulo parametros-del-modulo

Si el archivo se encuentra bajo /etc/pam.d el primer elemento, el servicio, puede omitirse ya que se toma del nombre de dicho archivo; por contra, la síntaxis completa es obligatoria en el archivo /etc/pam.conf. Como ya he dicho, existe el servicio other que actúa como comodín para todos los demás.

Como ya hemos comentado los módulos son apilables y el orden es importante, de tal manera que es posible la combinación de varios archivos para una única tarea de control de acceso.

servicio
Típicamente es el nombre familiar con el que se conoce a la aplicación; login y su son dos buenos ejemplos de ello. Sólo las líneas que incluyen el nombre del servicio se aplican a la aplicación dada.
tipo
Este elemento es el grupo de gestión al que corresponde la acción y que hemos descrito antes como áreas que cubre PAM.
control
Determina cómo comportarse ante el éxito ó el fracaso del módulo en sus tareas de autenticación; para ello existen dos tipos de síntaxis: una simple y otra compleja.
Para el tipo simple existen las siguientes palabras clave:
  • required: indica que si el módulo falla se denegará el acceso, aunque se deberán invocar el resto de la pila de módulos (para este servicio y tipo).
  • requisite: igual que el anterior, si falla se deniega el acceso, pero no se ejecuta ningún módulo más y se retorna inmediatamente.
  • sufficient: el éxito de este módulo es suficiente para garantizar el acceso, a menos que algún módulo de tipo required haya fallado antes, en cuyo caso se ignora el resultado. En caso de fallo no se considera algo fatal para autorizar el acceso.
  • optional: el fallo de este módulo sólo es significativo si es el único de la pila para su tipo.
ruta-al-modulo
Puede ser tanto relativa como absoluta. En el primer caso suele serlo respecto a /lib/security aunque es posible que existan otros lugares dependiendo de la arquitectura y la distribución.
parametros-del-modulo
Lista de elementos separados por espacios en blanco que pueden usarse para modificar el comportamiento del módulo, y que dependen totalmente de él, por lo que la documentación sobre los mismos estará junto al módulo en sí.

Módulos

pam_userdb

Este módulo permite emplear una base de datos en formato Berkeley DB para almacenar las cuentas de usuarios por lo que puede crearse una estructura paralela a /etc/passwd. Esta base de datos es indexada por el nombre del usuario y los valores de los campos corresponden a las contraseñas.

Las opciones principales que he empleado son las siguientes:

db=/path_database
Indica la localización del archivo que sirve como base de datos
crypt=[crypt|none]
Modo de almacenamiento de contraseñas: en claro (none) o cifradas (crypt) con la herramienta crypt.
icase
Indica que las contraseñas se validararán sin distinguir mayúsculas de minúsculas aunque sólo es válido si las contraseñas se almacenan en claro.

Para crear una base de datos de usuarios podemos crear primero un archivo de texto plano (usuarios.txt por ejemplo) donde se van alternando en líneas los nombres de los usuarios y sus contraseñas.

victor
123456
pedro
654321

y luego emplear la herramienta db_load para crear la base de datos final:

$ db_load -T -t hash -f usuarios.txt vsftpd_login.db

Si es necesario añadir nuevas cuentas se puede repetir el paso anterior con un archivo de carga diferente y la base de datos contendrá las nuevas cuentas añadidas a las existentes. El problema puede aparecer cuando se necesita eliminar alguna cuenta de usuario; no he encontrado referencias claras para hacerlo con programas ya incluídos en el paquete por lo que sería más aconsejable mantener la lista de usuarios en algún sitio seguro y emplearla para reconstruir la base de datos desde el principio.