Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

domingo, 3 de abril de 2016

Linux PAM. Qué es y qué importancia tiene

Hoy quiero veniros con una de las funcionalidades más importantes y al mismo tiempo menos "conocidas" dentro del mundo de Linux... Se trata de PAM (Pluggable Authentication Modules), funcionalidad de la que ya he hablado muy brevemente en mi último articulo. Esta funcionalidad está presente en todos los sistemas operativos basados en Linux y se trata de un mecanismo de autenticación que determina qué tareas realizar o qué método de autenticación usar sin tener que modificar absolutamente nada en los ficheros de configuración. Si bien este mecanismo puede ser configurado de forma global para que actué de una determinada forma para TODAS las autenticaciones; lo más normal es realizar una configuración modular (configuración que afortunadamente ya tiene por defecto), es decir que tenga una configuración determinada para cierto tipo de autenticaciones. No es lo mismo una autenticación vía ssh que una autenticación cuando se realiza sudo o su.


Si bien entender todos los entresijos de PAM junto con todos sus módulos es una locura, es conveniente conocer cómo funciona PAM; es decir cómo funciona, qué estructura y qué sintaxis tiene. Para empezar hay que saber que cuando se ejecuta un programa o comando que requiere autenticación, éste ejecuta una librería llamada libpam.so. Esta librería lee un fichero de configuración, que bien puede ser uno especifico alojado en /etc/pam.d/ o puede leer directamente la configuración global de pam en /etc/pam.conf. Para saber si un programa ejecuta pam, se puede consultar o bien comprobando los ficheros de configuración o, más fácil, ejecutando el comando ldd sobre el binario que deseemos. Por ejemplo podemos ejecutar la orden sobre /bin/su:

ldd /bin/su

Si quisiésemos modificar el comportamiento de PAM sobre alguno de los programas que tenemos instalados en el sistema; lo primero y más importante sería entender la estructura de las líneas que componen los ficheros de configuración. En este caso en concreto todas las líneas de los ficheros de configuración de de PAM tienen exactamente la misma estructura que sería:

Tipo_de_módulo control módulo


Tipo de módulo

El tipo de módulo es bastante sencillo; significaría el tipo de acción que haría PAM. No es lo mismo hacer tareas realizadas con la autenticación que con tareas realizadas con la comprobación de contraseña... Exactamente existen 4 tipos módulos:

  • auth: El tipo módulo más común de todos. Es el encargado de la autenticación (como por ejemplo la petición de usuario y contraseña).
  • account: Este tipo de módulo se encarga de la gestión de las cuentas y de la comprobación de la validez de éstas. Comprueba entre otras cosas que una cuenta de usuario no ha expirado.
  • password: Un tipo parecido al anterior, si bien en este caso se encarga de la gestión de contraseñas.
  • session: Este tipo de módulo se encarga de establecer el tipo de sesión que tendrá el usuario. También puede hacer tareas extra como montar carpetas (entre otras cosas).


Control

Como su propio nombre indica, se encarga de controlar qué hacer con el módulo que ejecutará a continuación; puede hacer que sea un requisito que se ejecute siempre el módulo o que sea opcional... Los controles disponibles serían:

  • required: El módulo tiene que ejecutarse exitosamente para que sea posible la autenticación; no importa si el resto de módulos se ejecutan exitosamente, si este (por el motivo que fuese) no pudiese ejecutar, no dejaría que el usuario se autenticase. 
  • requisite: Muy parecido al anterior control, con la diferencia de que en caso de fallar la ejecución del módulo, no se molestará en ejecutar los siguientes, sino que detendrá la ejecución de la autenticación.
  • sufficient: Si el módulo que tiene que ejecutar, tiene el control sufficient y falla su ejecución, no impedirá que PAM se ejecute. En otras palabras, uno puede autenticarse aún cuando un módulo que tenga el control sufficient falle.
  • optional: Como su propio nombre indica, el módulo se ejecutará de forma opcional; es decir que solo se ejecutará en caso de que no haya otra alternativa.


Módulos:

Esta es la parte más complicada y abstracta. No solo por su complejidad para usarlos sino porque además existen más módulos que, si bien solamente se instalan al instalar aplicaciones de terceros, están ahí.  Aún así existen algunos módulos que están instalados por defecto en Linux y a los que les podemos sacar partido; Los módulos disponibles serían los siguientes:
  • pam_unix.so: El módulo de autenticación estándar.
  • pam_env.so: En caso de ejecutar este módulo, se definirían las variables de entorno necesarias para el sistema.
  • pam_securetty.so: Este módulo es muy útil a nivel de seguridad, ya que no permite que root pueda conectarse desde una terminal "insegura". Una terminal se consideraría seguro por PAM en caso de existir en el fichero /etc/securetty. Por defecto ese fichero permite el acceso de root de todas las terminales virtuales existentes en el equipo (tty1, tty2...). Si se quisiese hacer un fichero más restrictivo, siempre podemos borrar terminales virtuales en dicho fichero, pero habría que ser cuidadosos con el fin de no quedarnos sin acceso accidentalmente.
  • pam_stack.so: Llama a otro servicio PAM que ejecute módulos extra. No es una opción muy usada pero está ahí.
  • pam_nologin.so: Prohibe la conexión de usuarios en caso de que exista el fichero /etc/nologin; aún así root es inmune a dicho módulo con lo que aún usándolo, root podrá "pasar".
  • pam_deny.so: Deniega el acceso al usuario que intenta usar el programa.
  • pam_console.so: En caso de que el usuario se autentique de forma exitosa; éste tendrá permisos adicionales.
Para entender mejor estos conceptos, nada mejor que ver el contenido de uno de los ficheros alojados en /etc/pam.d; en este caso su:

  1. session       required   pam_env.so readenv=1 envfile=/etc/default/locale
  2. session    optional   pam_mail.so nopen
  3. @include common-auth
  4. @include common-account
  5. @include common-session

Si observais bien el contenido de este documento, vereis dos cosas que os llamarán la atención. La primera es el uso de argumentos en la primera línea. Esto es debido a que se le pueden pasar unos argumentos especiales al módulo que queramos ejecutar, si bien estos argumentos son opcionales y son muy complejos. Generalmente en caso de observar argumentos en una línea de PAM, lo mejor es no tocarlos.

Por otro lado veréis que las tres últimas líneas constan de @include; dichos "includes" llaman a otros ficheros pam, alojados también en/etc/pam.d. Estos ficheros empiezan por common y suelen estar incluidos en todos los ficheros pam incluidos en la carpeta pam.d, ya que contienen de una serie de módulos y controles comunes para casi todas las autenticaciones.

Espero que con esto os haya aclarado un poco el concepto del complicado mundo de PAM. En caso de querer profundizar en dicha materia, os recomiendo que visiteis la página oficial de ésta que sería: http://www.linux-pam.org/


Espero que os haya resultado útil.

Saludos.

No hay comentarios :

Publicar un comentario