/etc/passwd y /etc/shadow en Linux: estructura y seguridad
En este post les voy a explicar cómo Linux gestiona la información de usuarios a través de los archivos /etc/passwd y /etc/shadow, y vamos a analizar al detalle su formato.
Los usuarios en Linux son aquellas entidades con cuyos privilegios pueden ejecutar programas. Iba a decir «pueden loguearse en el sistema», pero resulta que podemos tener usuarios creados para gestionar servicios, como el usuario www-data
para Apache, que no pueden loguearse en el sistema, y sin embargo, pueden ejecutar scripts y binarios.
La importancia de entender cómo se almacenan los usuarios en los archivos /etc/passwd y /etc/shadow
Una de las razones principales para aprender y entender bien cómo se almacenan los usuarios en Linux es la seguridad del sistema.
Los archivos /etc/passwd y /etc/shadow almacenan información crítica de cada cuenta de usuario, si alguien logra acceder a dicho contenido podría modificar esta información, o incluso suplantar la identidad de los usuarios con fines maliciosos.
Comprender la estructura de estos archivos ayuda a detectar configuraciones inseguras e intentos de intrusión.
Otro punto importante es la gestión de las cuentas de usuario. Al usar comandos como adduser
, passwd
, usermod
, etc, estamos alterando el contenido de estos archivos, y es menester saber qué cambios estamos aplicando.
También ofrecen un punto de partida para aprender, luego, otras formas de autenticación más avanzadas, como los módulos PAM, LDAP, NIS, etc.
Finalmente, entender cómo se estructuran estos archivos, que no son más que archivos de texto, y cómo se modifican mediante comandos externos, nos ayuda a entender, en el fondo, que todo el sistema operativo se basa en las mismas mecánicas: configuraciones en archivos de texto plano 🙂
El archivo /etc/passwd
El archivo /etc/passwd
contiene la información básica de cada usuario, a saber:
- username: nombre de usuario de login.
- x: indica que el usuario tiene contraseña almacenada en /etc/shadow.
- UID: ID del usuario.
- GID: ID del grupo primario del usuario.
- Comentario: un comentario para añadir info al usuario, nombre completo, domicilio, cargo, etc.
- Home: directorio home del usuario.
- Shell: shell predeterminada del usuario.
Estos datos se almacenan en el siguiente formato:
usuario:x:uid:gid:comentario:home:shell
Se ve que cada usuario se representa en una línea de texto de archivo, y cada campo de datos del mismo se separa de los demás con el caracter «:
«.
Veamos un ejemplo:

El archivo /etc/shadow
Este archivo almacena la información de la validez de las cuentas de usuario, y su contraseña hasheada y encriptada.
Los campos en este archivo mantienen el formato de /etc/passwd, datos separados por «:
«. Aquí cambian los datos, obviamente 😛
- username: nombre de login del usuario, debe coincidir con el del archivo /etc/passwd para el mismo usuario.
- contraseña encriptada: aquí se almacena la contraseña encriptada del usuario.
- Fecha del último cambio de la contraseña, en días desde el 1 de enero de 1970 (Unix epoch)
- Edad mínima de la contraseña: si un usuario cambia su contraseña, debe esperar esta cantidad de días antes de cambiarla nuevamente.
- Edad máxima de la contraseña: es la cantidad de días que deben transcurrir antes de que la contraseña expire y deba ser cambiada. El usuario debe cambiar su contraseña dentro de esta cantidad de días. Si se supera, el siguiente login se le requerirá cambio de contraseña.
- Período de aviso: cantidad de días, antes de la fecha de expiración de password, en la que el sistema le avisará al usuario que su contraseña está pronta a caducar.
- Período de inactividad: cantidad de días desde que la contraseña expiró hasta que se desactiva la cuenta del usuario. Una vez que se ha desactivado su cuenta, el usuario deberá contactar al administrador del sistema.
- Fecha de expiración de la contraseña: en días desde el 1 de enero de 1970.
- Reservado para uso futuro.
¿Cómo se encripta la contraseña? -> Password de usuario: cómo funciona en GNU/Linux
Veamos un ejemplo concreto para entenderlo mejor:
diego:$6$PmLE1Jrk9oLnacKL$aSRMmaxrkCMvxfK2I9Y80:18118:0:99999:7:::
Aquí he reducido el tamaño del campo de contraseña para verlo en una sola línea (y para que no me hackeen la cuenta xD).
Se ven los datos:
- username:
diego
- contraseña:
$6$PmLE1Jrk9oLnacKL$aSRMmaxrkCMvxfK2I9Y80
- Fecha del último cambio de contraseña:
18118
(*) - Edad mínima de la contraseña:
0
, esto indica que puedo cambiarla en cualquier momento sin restricción. - Edad máxima de la password:
99999
, es decir, no caduca (bah, caduca en poco más de 273 días xD). - Período de aviso de caducidad:
7
días. - Los últimos tres campos no tienen datos.
(*) esta cantidad de días, sabiendo que se trata de días desde el 1 de enero de 1970, podemos convertirla en fecha de esta forma:

Sí, la cambié por última vez el sábado 10 de agosto de 2019 :S
Seguridad en /etc/passwd y /etc/shadpw
Como vimos, los dos archivos están relacionados, uno almacena la información del usuario, como su home, shell y nombre, mientras que el otro almacena su contraseña y demás datos de validez de la cuenta.
Y si te preguntas ¿por qué no poner toda la info dentro del mismo archivo?
Esto tiene que ver con la seguridad del sistema.
Muchas aplicaciones, incluso el sistema operativo, necesitan saber cosas del usuario, como su shell, o directorio home, pero no requerirían saber su contraseña, por ejemplo.
Si estuviera todo dentro del mismo archivo, al darle acceso a ciertos datos se le da también acceso a otros más críticos.
Es por esto que, en lugar de colocar la contraseña dentro del archivo /etc/passwd, se coloca una «x
» indicando que el usuario tiene contraseña, pero la password cifrada, y otros datos críticos, se almacenan en otro archivo, /etc/shadow, restringido a todos los usuarios del sistema.
Veamos los permisos de cada uno:

Aquí puede verse que el archivo /etc/passwd tiene permisos de lectura y escritura para el usuario root (por esto es que, para añadir o modificar usuarios en el sistema, debemos ser root, o usar sudo), y tiene permisos de lectura para todos los demás usuarios, por lo que cualquier usuario o servicio podría obtener info de un usuario particular.
El archivo /
etc/shadow, por su parte, tiene permisos de lectura y escritura solamente para el usuario root, por lo que ningún otro usuario o servicio del sistema va a poder ver, por ejemplo, la contraseña de cualquier usuario.
Y ahora dirás «Pero si yo con el comando passwd, sin ser root, puedo cambiar mi contraseña, o sea estoy modificando el contenido del archivo /etc/shadow… ¿cómo es posible?«.
Eso es porque el binario del comando passwd
tiene un permiso especial llamado Set-UID, pero eso ya es otro tema que explico en Administrador Linux – Curso completo 😛
Ah, antes de olvidarme, una recomendación final: No modifiquen los archivos /etc/passwd y /etc/shadow manualmente!
Linux se presta mucho para editar configuraciones manualmente, muchas veces es necesario, pero otras, como esta particular, no es recomendable, y debemos hacerlo por medio de herramientas especiales, como el comando usermod
, o el comando passwd
.
¿Qué cómo se usan?
man usermod
man passwd
Ya publicaré algo al respecto si les interesa, aquí o en Youtube.
Hasta la próxima!