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)
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
[die@debian ~]$ man 3 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.
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!