Cómo configurar y usar PAM en Linux


Linux-PAM (abreviatura de módulos de autenticación conectables que evolucionaron de la arquitectura Unix-PAM) es un potente conjunto de bibliotecas compartidas que se utiliza 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 admiten Linux-PAM (en adelante, " PAM ") de forma predeterminada. En este artículo, explicaremos cómo configurar los sistemas avanzados PAM en Ubuntu y CentOS

Antes de continuar, tenga en cuenta que:

  • As a system administrator, the most important thing is to master how PAM configuration file(s) define the connection between applications (services) and the pluggable authentication modules (PAMs) that perform the actual authentication tasks. You don’t necessarily need to understand the internal working of PAM.
  • PAM has the potential to seriously alter the security of your Linux system. Erroneous configuration can disable access to your system partially, or completely. For instance an accidental deletion of a configuration file(s) under /etc/pam.d/* and/or /etc/pam.conf can lock you out of your own system!

Cómo verificar que un programa es compatible con PAM

Para emplear PAM , una aplicación/programa debe estar “ PAM informado “; debe haber sido escrito y compilado específicamente para usar PAM. Para saber si un programa es o no PAM reconocido », compruebe si se ha compilado con la biblioteca PAM mediante 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 para el 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 “#” Marca y extiende hasta el próximo final de línea.

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

service type control-flag module module-arguments 

dónde:

  • service: actual application name.
  • type: module type/context/interface.
  • control-flag: indicates the behavior of the PAM-API should the module fail to succeed in its authentication task.
  • module: the absolute filename or relative pathname of the PAM.
  • module-arguments: space separated list of tokens for controlling module behavior.

La sintaxis de cada archivo en /etc/pam.d/ es similar a la del archivo principal y está formada por líneas del siguiente formulario:

type control-flag module module-arguments

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

account required pam_nologin.so

Entendiendo los grupos de gestió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 para un servicio restringido.

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

  • account: provide services for account verification: has the user’s password expired?; is this user permitted access to the requested service?.
  • authentication: authenticate a user and set up user credentials.
  • password: are responsible for updating user passwords and work together with authentication modules.
  • session: manage actions performed at the beginning of a session and end of a session.

Los archivos de objeto cargables PAM (los módulos) se ubicarán en el siguiente directorio: /lib/security/ o /lib64/security dependiendo de la arquitectura.

Los indicadores de control admitidos son:

  • requisite: failure instantly returns control to the application indicating the nature of the first module failure.
  • required: all these modules are required to succeed for libpam to return success to the application.
  • sufficient: given that all preceding modules have succeeded, the success of this module leads to an immediate and successful return to the application (failure of this module is ignored).
  • optional: the success or failure of this module is generally not recorded.

Además de lo anterior, están las palabras clave, hay otras dos marcas de control válidas:

  • include: include all lines of given type from the configuration file specified as an argument to this control.
  • substack: include all lines of given type from the configuration file specified as an argument to this 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í, deseamos deshabilitar el acceso del usuario root a un sistema, al restringir 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

Agrega 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: is the module type (or context).
  • required: is a control-flag that means if the module is used, it must pass or the overall result will be fail, regardless of the status of other modules.
  • pam_listfile.so: is a module which provides a way to deny or allow services based on an arbitrary file.
  • onerr=succeed: module argument.
  • item=user: module argument which specifies what is listed in the file and should be checked for.
  • sense=deny: module argument which specifies action to take if found in file, if the item is NOT found in the file, then the opposite action is requested.
  • file=/etc/ssh/deniedusers: module argument which specifies file containing one item per line.

A continuación, debemos crear el archivo /etc/ssh/deniedusers y agregar el nombre root en él:

$ sudo vim /etc/ssh/deniedusers

Guarde los cambios y cierre el archivo, luego establezca los permisos necesarios en él:

$ sudo chmod 600 /etc/ssh/deniedusers

De ahora en adelante, la regla anterior le indicará a PAM que consulte el archivo /etc/ssh/deniedusers y le deniegue el acceso a SSH y los servicios de inicio de sesión para cualquier usuario incluido.

Cómo configurar PAM avanzado en Linux

Para escribir reglas PAM más complejas, puede utilizar indicadores de control válidos en el siguiente formulario:

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

Donde valueN 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 los valores admitidos en la Guía del administrador de PAM en línea. Un valor especial es el valor predeterminado, lo que implica que todos los valores N no se mencionan explícitamente.

El actionN puede tomar una de las siguientes formas:

  • ignore: if this action is used with a stack of modules, the module’s return status will not contribute to the return code the application obtains.
  • bad: indicates that the return code should be thought of as indicative of the module failing. If this module is the first in the stack to fail, its status value will be used for that of the whole stack.
  • die: equivalent to bad but may terminate the module stack and PAM immediately returning to the application.
  • ok: this instructs PAM that the system administrator thinks this return code should contribute directly to the return code of the full stack of modules.
  • done: equivalent to ok but may terminate the module stack and PAM immediately returning to the application.
  • N (an unsigned integer): equivalent to ok but may jump over the next N modules in the stack.
  • Reset: this action clears all memory of the state of the module stack and restart with the next stacked module.

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

  • required: [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
  • requisite: [success=ok new_authtok_reqd=ok ignore=ignore default=die]
  • sufficient: [success=done new_authtok_reqd=done default=ignore]
  • optional: [success=ok new_authtok_reqd=ok default=ignore]

El siguiente es un ejemplo de un moderno sistema de CentOS 7 . 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, 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 potente API de alto nivel que permite a los programas que dependen de la autenticación para autenticar a los usuarios en aplicaciones en un sistema Linux. Es poderoso pero muy difícil de entender y usar.

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