Cómo configurar y usar PAM en Linux


Linux-PAM (abreviatura de Pluggable Authentication Modules que evolucionó a partir de la arquitectura Unix-PAM) es un poderoso conjunto de bibliotecas compartidas que se utilizan para autenticar dinámicamente a un usuario en aplicaciones (o servicios) en un sistema Linux.

Integra múltiples módulos de autenticación de bajo nivel en una API de alto nivel que proporciona soporte de autenticación dinámica para aplicaciones. Esto permite a los desarrolladores escribir aplicaciones que requieren autenticación, independientemente del sistema de autenticación subyacente.

Muchas distribuciones modernas de Linux son compatibles con Linux-PAM (en lo sucesivo, "PAM") de forma predeterminada. En este artículo, explicaremos cómo configurar PAM avanzado en sistemas Ubuntu y CentOS.

Antes de continuar, tenga en cuenta que:

  • Como administrador del sistema, lo más importante es dominar cómo los archivos de configuración de PAM definen la conexión entre las aplicaciones (servicios) y los módulos de autenticación conectables (PAM) que realizan las tareas de autenticación reales. No es necesario que comprenda el funcionamiento interno de PAM.
  • PAM tiene el potencial de alterar seriamente la seguridad de su sistema Linux. Una configuración errónea puede deshabilitar el acceso a su sistema parcial o completamente. Por ejemplo, una eliminación accidental de un archivo de configuración en /etc/pam.d/* y/o /etc/pam.conf puede bloquearlo de su propio sistema.

Cómo comprobar que un programa es compatible con PAM

Para emplear PAM, una aplicación/programa debe ser "consciente de PAM"; debe haber sido escrito y compilado específicamente para usar PAM. Para saber si un programa es "compatible con PAM" o no, verifique si ha sido compilado con la biblioteca PAM usando el comando ldd.

Por ejemplo sshd:

$ sudo ldd /usr/sbin/sshd | grep libpam.so

	libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007effddbe2000)

Cómo configurar PAM en Linux

El archivo de configuración principal para PAM es /etc/pam.conf y el directorio /etc/pam.d/ contiene los archivos de configuración de PAM para cada aplicación/servicio compatible con PAM. PAM ignorará el archivo si el directorio existe.

La sintaxis del archivo de configuración principal es la siguiente. El archivo se compone de una lista de reglas escritas en una sola línea (puede extender las reglas usando el carácter de escape “\” ) y los comentarios están precedidos por “#” marcas y se extienden hasta el siguiente final de la línea.

El formato de cada regla es una colección de tokens separados por espacios (los tres primeros no distinguen entre mayúsculas y minúsculas). Explicaremos estos tokens en secciones posteriores.

service type control-flag module module-arguments 

dónde:

  • servicio: nombre real de la aplicación.
  • tipo: tipo de módulo/contexto/interfaz.
  • control-flag: indica el comportamiento de la PAM-API en caso de que el módulo no tenga éxito en su tarea de autenticación.
  • módulo: el nombre de archivo absoluto o la ruta relativa del PAM.
  • argumentos del módulo: lista de tokens separados por espacios para controlar el comportamiento del módulo.

La sintaxis de cada archivo en /etc/pam.d/ es similar a la del archivo principal y se compone de líneas de la siguiente forma:

type control-flag module module-arguments

Este es un ejemplo de una definición de regla (sin argumentos de módulo) que se encuentra en el archivo /etc/pam.d/sshd, que no permite inicios de sesión no root cuando existe/etc/nologin:

account required pam_nologin.so

Comprensión de los grupos de administración de PAM y los indicadores de control

Las tareas de autenticación PAM se dividen en cuatro grupos de administración independientes. Estos grupos gestionan diferentes aspectos de la solicitud de un usuario típico de un servicio restringido.

Un módulo está asociado a uno de estos tipos de grupos de gestión:

  • cuenta: proporciona servicios para la verificación de la cuenta: ¿ha expirado la contraseña del usuario ?; ¿Este usuario tiene permiso para acceder al servicio solicitado?
  • autenticación: autentica a un usuario y configura sus credenciales.
  • contraseña: son responsables de actualizar las contraseñas de los usuarios y trabajan junto con los módulos de autenticación.
  • sesión: gestiona las acciones realizadas al principio y al final de una sesión.

Los archivos de objetos cargables PAM (los módulos) deben ubicarse en el siguiente directorio:/lib/security/o/lib64/security, según la arquitectura.

Los indicadores de control admitidos son:

  • requisito: la falla devuelve instantáneamente el control a la aplicación indicando la naturaleza de la falla del primer módulo.
  • requerido: todos estos módulos son necesarios para que libpam devuelva el éxito a la aplicación.
  • suficiente: dado que todos los módulos anteriores han tenido éxito, el éxito de este módulo conduce a un retorno inmediato y exitoso a la aplicación (se ignora la falla de este módulo).
  • opcional: el éxito o el fracaso de este módulo generalmente no se registra.

Además de las palabras clave anteriores, hay otras dos banderas de control válidas:

  • incluir: incluir todas las líneas de un tipo determinado del archivo de configuración especificado como argumento para este control.
  • subcubierta: incluye todas las líneas del tipo dado del archivo de configuración especificado como argumento para este control.

Cómo restringir el acceso de root al servicio SSH a través de PAM

Como ejemplo, configuraremos cómo usar PAM para deshabilitar el acceso del usuario root a un sistema a través de SSH y programas de inicio de sesión. Aquí, queremos deshabilitar el acceso del usuario root a un sistema, restringiendo el acceso a los servicios de inicio de sesión y sshd.

Podemos usar el módulo /lib/security/pam_listfile.so que ofrece una gran flexibilidad para limitar los privilegios de cuentas específicas. Abra y edite el archivo para el servicio de destino en el directorio /etc/pam.d/ como se muestra.

$ sudo vim /etc/pam.d/sshd
OR
$ sudo vim /etc/pam.d/login

Agregue esta regla en ambos archivos.

auth    required       pam_listfile.so \
        onerr=succeed  item=user  sense=deny  file=/etc/ssh/deniedusers

Explicando los tokens en la regla anterior:

  • auth: es el tipo de módulo (o contexto).
  • requerido: es un indicador de control que significa que si se usa el módulo, debe pasar o el resultado general fallará, independientemente del estado de otros módulos.
  • pam_listfile.so: es un módulo que proporciona una forma de denegar o permitir servicios basados en un archivo arbitrario.
  • onerr u003d success: argumento del módulo.
  • item u003d user: argumento del módulo que especifica lo que se enumera en el archivo y se debe verificar.
  • sense u003d deny: argumento del módulo que especifica la acción a realizar si se encuentra en el archivo, si el elemento NO se encuentra en el archivo, se solicita la acción opuesta.
  • file u003d/etc/ssh/pressedusers: argumento del módulo que especifica el archivo que contiene un elemento por línea.

A continuación, debemos crear el archivo/etc/ssh/pressedusers y agregarle el nombre raíz:

$ sudo vim /etc/ssh/deniedusers

Guarde los cambios y cierre el archivo, luego configure los permisos requeridos en él:

$ sudo chmod 600 /etc/ssh/deniedusers

A partir de ahora, la regla anterior le indicará a PAM que consulte el archivo/etc/ssh/denigradousers y niegue el acceso a SSH y a los servicios de inicio de sesión para cualquier usuario de la lista.

Cómo configurar PAM avanzado en Linux

Para escribir reglas PAM más complejas, puede usar indicadores de control válidos en la siguiente forma:

type [value1=action1 value2=action2 …] module module-arguments

Donde valorN corresponde al código de retorno de la función invocada en el módulo para el que se define la línea. Puede encontrar valores admitidos en la Guía del administrador de PAM en línea. Un valor especial es el predeterminado, lo que implica que todos los valores N no se mencionan explícitamente.

La acciónN puede adoptar una de las siguientes formas:

  • ignorar: si esta acción se usa con una pila de módulos, el estado de retorno del módulo no contribuirá al código de retorno que obtiene la aplicación.
  • malo: indica que el código de retorno debe considerarse como indicativo de la falla del módulo. Si este módulo es el primero en la pila en fallar, su valor de estado se usará para el de toda la pila.
  • morir: equivalente a malo, pero puede terminar la pila de módulos y PAM regresa inmediatamente a la aplicación.
  • ok: esto le indica a PAM que el administrador del sistema cree que este código de retorno debería contribuir directamente al código de retorno de la pila completa de módulos.
  • hecho: equivalente a ok, pero puede terminar la pila de módulos y PAM regresa inmediatamente a la aplicación.
  • N (un entero sin signo): equivalente a ok, pero puede saltar sobre los siguientes N módulos de la pila.
  • Restablecer: esta acción borra toda la memoria del estado de la pila de módulos y reinicia con el siguiente módulo apilado.

Cada una de las cuatro palabras clave: obligatorio; requisito; suficiente; y opcional, tienen una expresión equivalente en términos de la sintaxis [...] , que le permiten escribir reglas más complicadas y son:

  • obligatorio: [éxito u003d ok new_authtok_reqd u003d ok ignore u003d ignorar predeterminado u003d malo]
  • requisito: [éxito u003d ok new_authtok_reqd u003d ok ignore u003d ignore default u003d die]
  • suficiente: [éxito u003d hecho new_authtok_reqd u003d hecho predeterminado u003d ignorar]
  • opcional: [éxito u003d ok new_authtok_reqd u003d ok predeterminado u003d ignorar]

El siguiente es un ejemplo de un sistema CentOS 7 moderno. Consideremos estas reglas del archivo PAM /etc/pam.d/postlogin:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
session     [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session     [default=1]   pam_lastlog.so nowtmp showfailed
session     optional      pam_lastlog.so silent noupdate showfailed

Aquí hay otro ejemplo de configuración del archivo PAM /etc/pam.d/smartcard-auth:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        [success=done ignore=ignore default=die] pam_pkcs11.so nodebug wait_for_card
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    required      pam_pkcs11.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

Para obtener más información, consulte la página de manual de pam.d:

$ man pam.d 

Por último, se puede encontrar una descripción completa de la sintaxis del archivo de configuración y todos los módulos PAM en la documentación de Linux-PAM.

PAM es una poderosa API de alto nivel que permite a los programas que dependen de la autenticación de usuarios auténticos para aplicaciones en un sistema Linux. Es poderoso pero muy difícil de entender y usar.

En este artículo, explicamos cómo configurar funciones avanzadas de PAM en Ubuntu y CentOS. Si tiene alguna pregunta o comentario para compartir, utilice el formulario de comentarios a continuación.