Password de usuario: cómo funciona en GNU/Linux

Publicado por Diego Córdoba en

passwordHoy hablaremos brevemente sobre, ni más ni menos, que la seguridad en la autenticación de un sistema GNU/Linux, la password de usuario y sus mecanismos de seguridad.

Como sabemos, la base de datos de usuarios de Linux se encuentra distribuida en dos archivos:

  • /etc/passwd (información de usuario)
  • /etc/shadow (información de validez de la cuenta, y password)

Si quieres conocer más sobre la base de datos de usuarios en Linux visita este artículo.

En el archivo /etc/passwd tenemos la información del usuario en cuanto a su username de login, su nombre completo, su directorio home, o su shell por defecto, entre otros.

El archivo /etc/shadow es el que almacena las contraseñas cifradas de dichos usuarios, y la información de validez de la cuenta, caducidad de cuenta y password, tiempos entre recambios, avisos, etc.

Los permisos del archivo /etc/shadow

Como primera medida de seguridad, veamos los permisos que tiene éste archivo:

[die@debian ~]$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1641 Nov 25 20:33 /etc/shadow

Como vemos, el archivo solo puede ser modificado por el súper usuario root del sistema operativo, y solo puede ser leído por root, y por quienes pertenezcan al grupo shadow, que por defecto, no tiene integrantes.shadow

De esta forma, si un usuario trata de siguiera obtener el contenido cifrado de una password, se encontrará con un mensaje de permiso denegado, es decir, nadie, salvo root, nadie puede acceder al contenido de dicho archivo directamente.

[die@debian ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

Este archivo, en conclusión, solo puede ser accedido por el súper usuario, y además, por cualquier usuario que utilice algún binario cuyo dueño sea root, y además tenga el permiso especial SUID (set user id), como lo es, por ejemplo, el comando passwd (/usr/bin/passwd).

Documentación sobre la generación de la contraseña

La contraseña de cada usuario no se almacena, como se podrá imaginar, en texto plano, sino que se cifra y «hashea» en base a un algoritmo basado en DES (Data Encryption Standard). Esta información la podemos obtener a través de las páginas de manuales del archivo shadow, que referencia a la función de código C crypt, veamos unos extractos:

[die@debian ~]$ man 5 crypt

shadow

[die@debian ~]$ man 3 crypt

crypt

La cadena de la password

Ahora analicemos la cadena de password. Supongamos una password de ejemplo:

$6$6V4rEdEV$emVTa9UfACi2pmWeoJ6LVzosmXW0g5znIMfEuQguMUPT4b5rqd66dK46WxbH/pPH94KeW273FQ.rRpKOSBAbT1

Esta password se compone de varios campos separados por símbolos ‘$’:

$ 6
$ 6V4rEdEV
$ emVTa9UfACi2pmWeoJ6LVzosmXW0g5znIMfEuQguMUPT4b5rqd66dK46WxbH/pPH94KeW273FQ.rRpKOSBAbT1

El primer campo, 6 en este caso, es el método de hash utilizado. El 6 representa un SHA-512, la cadena de hash más larga y «segura» dentro de la función SHA. Otras cadenas posibles son MD5(1) y SHA-256 (5) por ejemplo.

El segundo campo es un «salt», o dato aleatorio agregado a la función criptográfica para aumentar su «aleatoriedad», o entropía, y así disminuir los ataques de diccionario sobre la password.

El tercer campo es el hash de la password y su salt. La longitud de ésta cadena corresponde con la función hash utilizada. Por ejemplo, si la password hubiese sido calculada con un hash MD5, la cadena sería mucho más corta, puesto que un hash MD5 cuenta con 128 bits, comparado con los 512 bits de un SHA-512.

Generando la password a mano

La tarea de la generación de esta línea es, por lo general, tarea del comando passwd, el comando que utilizamos para cambiar las contraseña de nuestro usuario, o el que puede utilizar el usuario root para cambiar la password de cualquier otro usuario del sistema.20971563620_c63878ed00_b

No obstante, podríamos generar la cadena de password manualmente utilizando un comando llamado mkpasswd. Éste comando recibe como argumentos al tipo de hash utilizado, la cadena en texto plano de la contraseña, y un salt, que en el caso del comando passwd, se genera de manera aleatoria.

Veamos un ejemplo:

[die@debian ~]$ mkpasswd -m md5 secretisimo 12345678
$1$12345678$uurolZS5BsGs5rSWEzlw60

El modificador «-m» permite especificar el tipo de hash, luego debemos colocar la cadena de contraseña, y por último el salt elegido, y el resultado será nuestra cadena de contraseña. Como se ve, el primer campo es un 1, lo que indica la función hash md5; el segundo es el salt 12345678, y por último,la cadena de password generada.

Otro ejemplo, supongamos que la password en texto plano es «1234» sin comillas, que el hash es un sha-512, y el salt aleatorio es «6V4rEdEV«… calculemos:

[die@debian ~]$ mkpasswd -m sha-512 1234 6V4rEdEV
$6$6V4rEdEV$emVTa9UfACi2pmWeoJ6LVzosmXW0g5znIMfEuQguMUPT4b5rqd66dK46WxbH/pPH94KeW273FQ.rRpKOSBAbT1

Como se ve en la salida, el 6 indica sha-512, luego vemos el salt, y por último la cadena de password, que corresponde, en este caso particular, con la que teníamos almacenada en el archivo /etc/shadow, y que listamos más arriba 🙂

¡Esperamos que les sea de utilidad!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador