Password de usuario: cómo funciona en GNU/Linux
Hoy 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)
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:
$ ls -l /etc/shadow
-rw------- 1 root root 2143 oct 16 2024 /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
$ 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». Originalmente se basaba a un algoritmo derivado de DES (Data Encryption Standard). Esta información podía obtenerse 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:
$ man 5 shadow

$ man 3 crypt
No obstante, hoy en día no se utiliza esta implementación. crypt (3) es en la actualidad es un framework modular. No es un algoritmo fijo… es una especie de selector de algoritmos.
Cuando el sistema llama a crypt, lo primero que hace es mirar el prefijo de la cadena que le pasamos:
- Si ve que empieza por nada (o formato antiguo): Intenta usar DES (ya casi ninguna distro lo permite por defecto).
- Si ve
$1$: Cambia internamente a MD5. - Si ve
$6$: Activa el motor de SHA-512. - Si ve
$y$: Activa el motor de Yescrypt.
Y así sucesivamente. La lista completa de los algoritmos que soporta cyrpt() se encuentra documentada en man 5 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), SHA-256 (5) o Yescrypt (y), 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.
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:
$ mkpasswd -m md5 'secretisimo' '12345678'
$1$12345678$uurolZS5BsGs5rSWEzlw60
El modificador «-m» permite especificar el tipo de algoritmo, 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:
$ 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 🙂
Yescrypt: la evolución de los algoritmos de hash y cifrado
Yescrypt no es una función de hash más, es una función de derivación de clave, o KDF, diseñada para complicar la existencia de quienes intenten romper una contraseña matemáticamente con potencia de cálculo.
La función SHA-512, una de las más seguras antes de yescrypt, requería mucha potencia de cálculo para encontrar un valor que colisionara con el mismo hash. Es una función hash matemática que se calcula a gran velocidad y tiene alta resistencia a colisiones.
No obstante, hoy en día, una o varias tarjetas gráficas (GPU) pueden llevar a un atacante a encontrar la contraseña mediante un ataque de fuerza bruta en un tiempo relativamente corto.
Así es que surgió yescrypt, un nuevo algoritmo de cálculo de fingerprint o hash. A diferencia de SHA-512, el cálculo de yescrypt es lento, y obliga a la computadora a usar mucha memoria RAM para calcular el hash.
Es resistente a ataques de fuerza bruta basados en GPU, y fue diseñado específicamente para cálculo de contraseñas.
Y cómo se vería una password en /etc/shadow usando yescrypt?
$ mkpasswd -m yescrypt '1234' -s '$y$j9T$2zF1n9QiA.YeWXUSl99fR1'
$y$j9T$2zF1n9QiA.YeWXUSl99fR1$wyOybswy0etpuyctf7X8ogklezy0ToLX0nSowZx7Pp.
El hash incluso es más corto que el SHA-512, pero más difícil de romper.
En esta salida podemos ver que el código del método yescrypt es $y.
Además, un detalle particular para mkpasswd: el salt especificado no solamente es una cadena de caracteres cualquiera, como ocurría con SHA-512, sino que debe incluir un parámetro adicional:
$y: indica algoritmo yescrypt$j9T: parámetros de cálculo de yescrypt (esto lo dejaremos para otra oportunidad).$salt
Luego todos estos datos se incorporan a la línea de contraseña generada por mkpasswd, y que será almacenada en el archivo /etc/shadow.
Eso sí, el comando passwd calcula un salt aleatorio cada vez que genera un hash usando yescrypt, lo cual es súper recomendable. De esta forma complicamos más el trabajo del atacante, dado que la misma password calculada con dos salt’s distintos generará dos cadenas shadow diferentes… veamos un ejemplo con mkpasswd:

Como se ve, he ejecutado el mismo comando dos veces, utilizando yescrypt y la misma contraseña, y las salidas son distintas, debido al cambio del salt aleatorio.
Recomendación: siempre utilicen salts aleatorios para la generación de las contraseñas (lo anterior fue para mostrar cómo se puede hacer, nada más :P).
Y hemos llegado al final! Espero que les haya gustado y les haya sido de utilidad!
Quedan varios puntos en el tintero, entre los que destaco los parámetros de yescrypt para el cálculo del hash… ese «$j9T» que vimos antes. Estos parámetros pueden configurarse en Linux, y su cambio puede afectar la seguridad de la password generada.
Si les interesaría saber más sobre esto, y profundizar un poquito más, no tienen más que comentarme! 👇
Será hasta la próxima!