Archivo de la etiqueta: Linux

Micropíldora – Sistema autenticación en GNU/Linux

Autenticación en Linux

Autenticación en Linux
Fuente imagen: AcercaDeUbuntu

En esta micropíldora explicaré el funcionamiento tradicional, y su evolución actual, del sistema de autenticación en local de los sistemas basados en GNU/Linux (Debia, RedHat, IOS, etc.). Aunque hoy en día existen múltiples posibilidades de autenticación remota (LDAP, Kerberos, etc.), la autenticación local sigue operativa en la gran mayoría de instalaciones. No profundizaré en los diferentes algoritmos utilizados, cosa que da para un artículo más extenso, sino en las estrategias elegidas así como sus motivaciones para elegirlas.

Aunque es un artículo básico se presupone un mínimo conocimiento de la estructura  del sistema operativo GNU/Linux.

Sistema de autenticación tradicional

Desde su definición el sistema GNU/Linux ha sido desarrollado teniendo en mente un sistema multiusuario, cosa no muy extendida en la época, por lo que desde el principio contaba con un sistema de autenticación de los diferentes usuarios que podían utilizar el sistema. Así pues se creó un fichero de sistema (/etc/passwd) en el cual se almacena la información del usuario que es necesaria para que el sistema pueda trabajar con normalidad.

Veamos un ejemplo de una línea de este fichero público:

andreu:S1p7e8INZ512o:1011:1000:Andres Adrover:/home/andreu:/bin/sh

Donde separados por el símbolo de dos puntos (:) podemos ver los siguientes valores:

  1. andreu: El nombre de usuario al que hace referencia esta información.
  2. S1p7e8INZ512o: Información para validar la contraseña. Por norma se trata del resultado obtenido al pasar la contraseña real por una función hash. Permite pues comparar que la contraseña introducida sea la misma (si da el mismo resultado) que la elegida anteriormente.
  3. 1011: Identificador numérico de usuario. Debe ser único en el equipo y es utilizado por el sistema de forma interna (control de permisos de acceso, gestión de procesos lanzados, etc.)
  4. 1000: Identificado numérico del grupo al que pertenece el usuario. Al igual que el campo anterior es utilizado por el sistema operativo.
  5. Andres Adrover: Este campo es de libre escritura aunque se definió para indicar los datos completos del usuario, dirección, teléfono, etc.
  6. /home/andreu: Identifica el directorio raíz de ese usuario
  7. /bin/sh: Indica qué programa debe ejecutarse nada más autenticarse el usuario. Para usuarios humanos siempre será un intérprete de comandos (sh, bash, ksh…)

Como se puede observar no se guarda la contraseña en claro en este fichero, sino el resultado de aplicarle una función hash, por lo que en su momento se consideró que era un sistema suficientemente seguro. La idea es que, aunque el fichero /etc/passwd es de acceso libre y cualquiera puede obtener el valor hash de las contraseñas de todos los usuarios no sería factible obtener las contraseñas de dichos valores.

Sistema actual de autenticación en Linux

Estas apreciaciones de seguridad fueron válidas durante décadas, pero la aparición de debilidades en las funciones hash usadas (MD5, SHA1, Blowfish…) hizo que la obtención de contraseñas válidas a partir de los valores almacenados en el fichero /etc/passwd pasara a ser factible.

Así se generó una nueva estrategia:

  • Se mantiene el fichero público /etc/passwd con toda la información útil del usuario pero en el campo contraseña (el segundo) sólo habrá el valor ‘x’.
  • Se crea un nuevo fichero /etc/shadow sólo visible por el usuario root para gestionar la información de contraseña

El mero hecho de separar la gestión de credenciales y llevarla a un fichero no público ya es una importante mejora, pero además se añadieron nuevas funcionalidades criptográficas para dificultar, aún más, la obtención de contraseñas válidas aunque se obtuviera el acceso al nuevo fichero.

El formato de este neuvo fichero podría ser el siguiente:

andreu:$1$S1p7e8INZ512o:13054:0:365:7:10:99999:

Donde:

  1. andreu: el nombre de usuario
  2. $1$S1p7e8INZ512o: Resultado de la función hash de la contraseña
  3. 13054: El días, contado desde 1 de enero de 1970, en el que se cambió la contraseña por última vez
  4. 0: Mínimo número de días que deben pasar entre cambios de contraseña
  5. 365: Número máximo de días en el que una contraseña es válida
  6. 7: Número de días antes de que caduque en el que nos avisa el sistema
  7. 10: Número de días en el que la cuenta se expirará una vez caducada la contraseña
  8. 99999: Fecha, contada desde el 1 de enero de 1970, en el que la cuenta caducará

Como se puede observar este nuevo fichero abre un mayor abanico de posibilidades para la gestión de usuarios y contraseñas en los sistemas basados en Linux.

Otro punto importante es la elección de las funciones hash posibles y el uso, obligatorio, de expresiones «Salt» que dificultan en gran medida los posibles ataques por diccionario.


Obviamente mi contraseña no tiene ese hash 😉