1 Bloque 2. Administración básica de usuarios y contraseñas
1.1 La importancia del control de acceso
El control de acceso constituye uno de los pilares fundamentales de la seguridad del sistema operativo Linux. En un entorno multiusuario, cada acción, proceso o recurso está asociado a una identidad digital representada por un usuario. Estos usuarios pueden ser personas, servicios o procesos del sistema.
Linux gestiona el acceso a recursos bajo el principio DAC (Discretionary Access Control) o Control de Acceso Discrecional, en el cual el propietario de un objeto (archivo, directorio, dispositivo, etc.) decide qué permisos se otorgan a otros usuarios o grupos. Este modelo es flexible, pero puede ser peligroso si no se combina con políticas estrictas de seguridad.
Principio de mínimo privilegio: Todo usuario o proceso debe tener únicamente los permisos necesarios para realizar su función, y nada más. Este principio limita el impacto de un error o compromiso de cuenta.
1.1.1 Tipos de usuarios en Linux
En Linux, los usuarios se clasifican en tres grandes grupos:
Superusuario o root (UID 0): Tiene acceso total al sistema. Puede leer, modificar o eliminar cualquier archivo, y ejecutar cualquier comando sin restricciones.
- El UID 0 identifica al superusuario.
- Cualquier cuenta de usuario que tenga el UID 0 tiene los mismos
privilegios que
root, aunque se llame distinto. Por ejemplo,admincon UID 0. - Es un comportamiento que está programado a nivel de kernel y no es configurable, esto quiere decir que un usuario con el UID 0 siempre tendrá control total.
- Es recomendable evitar el acceso directo en el sistema como
rooty usarsudopara tareas administrativas puntuales.
Usuarios del sistema (UID < 1000): Esos usuarios son creados automáticamente por el sistema o por servicios instalados como
mysql,www-data,daemon.- No tienen acceso interactivo, por lo tanto, su shell suele ser
/usr/sbin/nologin. - Se usan para aislar procesos y evitar que un servicio comprometido afecte a todo el sistema.
- Aunque la convención actual es utilizar un UID entre 0 y 999, cada distribución Linux puede utilizar un rango diferente. A continuación se muestra una tabla de los valores utilizados en algunas distribuciones.
- No tienen acceso interactivo, por lo tanto, su shell suele ser
| Distribución / Familia | Rango de UID reservados para el sistema | Descripción |
|---|---|---|
| Debian / Ubuntu | 0 - 999 |
A partir de UID 1000 son usuarios normales. |
| Red Hat / CentOS / Fedora | 0 - 499 |
En sistemas antiguos, los usuarios normales empiezan partir del UID 500. Ahora usan a partir del UID 1000. |
| Arch Linux / Manjaro | 0 - 999 |
Siguen la convención moderna. |
| SUSE / openSUSE | 0 - 999 |
Igual que Debian. |
| Unix BSD / Solaris antiguos | 0 - 99 o 0 - 499 |
Varía según versión. Algunos sistemas usan 100 para empezar los usuarios normales. |
Usuarios normales (UID ≥ 1000): Son las cuentas de personas que interactúan con el sistema.
- Disponen de un directorio personal
(
/home/usuario). - Solo pueden acceder y modificar los recursos que les pertenecen.
- Pueden hacer uso de un shell interactivo como
/bin/bash,/bin/zsh, etc. - Tienen un grupo principal con el mismo nombre que el usuario y un GID igual al UID.
- No tienen privilegios administrativos a menos que se les otorgue
mediante
sudo.
- Disponen de un directorio personal
(
Los valores del UID_MIN y UID_MAX se
configuran en el archivo /etc/login.defs. Puede consultar
cuáles son los valores actuales de sistema con el siguiente comando:
grep -E 'UID_MIN|UID_MAX' /etc/login.defsNota: El parámetro
-Epermite usar expresiones regulares con elgrep. En este caso, usamos el operador OR lógico|para buscar dos patrones.
En Ubuntu 24.04.2 LTS, la salida del comando anterior devolvería los siguientes valores:
UID_MIN 1000
UID_MAX 60000
1.2 Archivos del sistema relacionados con usuarios
Linux utiliza varios archivos de texto plano, ubicados en el
directorio /etc, que contienen la información esencial para
la gestión de usuarios y contraseñas. Estos archivos son el núcleo del
sistema de autenticación local.
| Archivo | Función principal |
|---|---|
/etc/passwd |
Contiene información básica sobre los usuarios (nombre, UID, GID, descripción, home, shell). |
/etc/shadow |
Almacena contraseñas cifradas y datos sobre caducidad. Solo
accesible por root. |
/etc/group |
Lista los grupos y los usuarios que pertenecen a cada uno. |
/etc/gshadow |
Contiene contraseñas de grupos encriptadas y miembros con privilegios administrativos sobre los grupos. |
/etc/login.defs |
Define los parámetros por defecto para las nuevas cuentas (UID mínimo, días de validez, longitud de contraseñas). |
1.2.1 Archivo
/etc/passwd
Contiene información básica sobre cada usuario del sistema. Cada vez que un usuario inicia sesión, el sistema consulta este archivo para obtener sus atributos.
Estructura:
Cada línea del archivo representa un usuario y tiene siete campos
separados por ::
usuario:x:UID:GID:comentario:/home/usuario:/bin/bash
Campos principales:
| Campo | Descripción | Ejemplo | Explicación técnica |
|---|---|---|---|
usuario |
Nombre de la cuenta (login). | maria |
Identificador alfanumérico único usado para iniciar sesión y para referirse al usuario en comandos y ficheros del sistema. Debe ser único en el sistema. |
x |
Indica que el hash de la contraseña se guarda en
/etc/shadow (lectura sólo por root). |
x |
Campo reservado históricamente para la contraseña. La x
indica que el hash real está en /etc/shadow. Otros valores
(*, !, !!) se usan para bloquear
o indicar ausencia de contraseña. |
UID |
Identificador numérico único del usuario (User ID). | 1001 |
Entero que el kernel y los servicios usan internamente para identificar al usuario. |
GID |
Identificador numérico del grupo principal (Group ID). | 1001 |
Entero que apunta al grupo principal (definido en
/etc/group). Determina permisos de grupo predeterminados en
archivos creados por el usuario. |
comentario |
Información descriptiva opcional sobre la cuenta. | María Pérez |
Descripción opcional o campo
GECOS (General Electric Comprehensive Operating
Supervisor). Muchas herramientas muestran el Full Name
desde aquí. Los campos están separados por comas (nombre, oficina,
teléfono, otros). |
home |
Ruta al directorio personal del usuario. | /home/maria |
Directorio donde se almacenan ficheros personales y configuración
del usuario. Usado como ~ en shells y por muchos programas
para ubicar archivos de configuración. |
shell |
Intérprete de comandos asignado a la cuenta (login shell). | /bin/bash |
Programa que se ejecuta al iniciar sesión (Ejemplo:
/bin/bash, /bin/sh,
/usr/sbin/nologin). Si se usa
/usr/sbin/nologin o /bin/false se impide shell
interactivo. Esto es útil para cuentas de servicio. |
Ejemplo:
Podemos ver el contenido del archivo /etc/passwd con el
comando:
cat /etc/passwdSe han omitido algunas líneas del archivo, pero deberíamos obtener una salida similar a esta:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
...
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
maria:x:1000:1000:María Pérez:/home/maria:/usr/bin/zsh
📘 Nota: Antiguamente los hashes de las contraseñas se almacenaban directamente en el archivo
/etc/passwd, pero se trasladaron a/etc/shadowpara evitar fugas de información, porque este archivo tiene permisos más restrictivos y solo es accesible porroot.
1.2.2 Archivo
/etc/shadow
El archivo /etc/shadow es uno de los
archivos más sensibles del sistema Linux, ya que
almacena la información relacionada con las contraseñas
cifradas y las políticas de caducidad de cada
cuenta de usuario.
A diferencia de /etc/passwd, que es de lectura pública,
solo el superusuario (root) o los procesos
del sistema que lo requieran (por ejemplo, login,
su, passwd o sshd) pueden acceder
a este archivo.
Esto evita que un atacante pueda leer los hashes de las contraseñas y realizar ataques de fuerza bruta o de diccionario.
Permisos y seguridad
Podemos comprobar sus permisos con el siguiente comando:
ls -l /etc/shadowObtendremos una salida similar a esta:
-rw-r----- 1 root shadow 1534 Oct 17 10:45 /etc/shadow
- Propietario:
root - Grupo:
shadow(solo procesos del sistema o administradores con privilegios pueden acceder). - Permisos: lectura para root y el grupo
shadow, sin permisos para otros usuarios.
⚠️ Atención:
Si este archivo fuera legible por todos los usuarios, el sistema quedaría gravemente comprometido. Con los hashes de contraseñas, un atacante podría intentar romperlas offline con herramientas como John the Ripper o hashcat.
Estructura:
Cada línea corresponde a un usuario y contiene varios campos
separados por dos puntos (:):
usuario:contraseña:lastchange:min:max:warn:inactive:expire:reserved
Explicación de los campos:
| Campo | Descripción | Ejemplo | Explicación técnica |
|---|---|---|---|
usuario |
Nombre del usuario | maria |
Identifica la cuenta a la que pertenecen los valores de la línea.
Debe coincidir con una entrada en /etc/passwd. |
contraseña |
Hash cifrado de la contraseña | $6$iP0B5yrxRxRX... |
Contiene el hash generado con un algoritmo seguro (SHA-512, bcrypt,
yescrypt…). Si el valor es ! o *, la cuenta
está bloqueada. |
lastchange |
Fecha del último cambio de contraseña | 19500 |
Número de días desde el 1 de enero de 1970 (epoch
time). Puede consultarse con
date -d "1970-01-01 +19500 days". |
min |
Días mínimos entre cambios de contraseña | 7 |
Evita que un usuario cambie la contraseña demasiadas veces en poco tiempo para eludir políticas de reutilización. |
max |
Días máximos de validez | 90 |
Establece el periodo tras el cual la contraseña debe cambiarse obligatoriamente. |
warn |
Días de aviso antes de la caducidad | 14 |
Define cuándo el sistema comienza a mostrar advertencias al usuario. |
inactive |
Días de inactividad tras la expiración | 0 o vacío |
Si la contraseña ha caducado, este campo indica cuántos días pueden pasar antes de desactivar la cuenta. |
expire |
Fecha de expiración absoluta de la cuenta | vacío (:) |
En formato epoch (días desde 1970). Si se completa, la cuenta deja de funcionar a partir de esa fecha. |
reserved |
Campo no utilizado | vacío | Reservado para futuras implementaciones. Normalmente está vacío. |
Formatos de cifrado del campo
contraseña:
El campo de contraseña contiene el hash y la información del algoritmo utilizado. La estructura general es:
$id$params$salt$hash
Donde:
$id: Identifica el algoritmo de cifrado.$params: Es opcional y cuando aparece representa un parámetro específico del algoritmo.$salt: Es una cadena aleatoria (sal) que evita que dos contraseñas iguales produzcan el mismo hash.$hash: Es el resultado cifrado final.
| Algoritmo | Identificador | Descripción |
|---|---|---|
| DES | (sin prefijo) | Muy antiguo, inseguro. Se considera obsoleto. |
| MD5 | $1$ |
Obsoleto, no recomendado. |
| SHA-256 | $5$ |
Cifrado seguro, más rápido que SHA-512. |
| SHA-512 | $6$ |
Algoritmo por defecto en la mayoría de distribuciones modernas (Ubuntu, Debian). |
| yescrypt | $y$ |
Más moderno, resistente a ataques de fuerza bruta. Soportado en versiones recientes de PAM. |
| bcrypt | $2a$,$2b$,$2y$ |
Familia de algoritmos bcrypt (Blowfish) |
Lecturas recomendadas:
Los siguientes artículos le ayudarán a entender mejor el uso de “sal” para mejorar la seguridad de las contraseñas almacenadas.
Ejemplo:
Podemos ver el contenido del archivo /etc/shadow con el
comando:
sudo cat /etc/shadowEn la salida, veremos líneas similares a esta:
root:*:20134:0:99999:7:::
daemon:*:20134:0:99999:7:::
bin:*:20134:0:99999:7:::
sys:*:20134:0:99999:7:::
...
maria:$6$iP0B5yrxRxRXd8as$o94T...:20267:0:99999:7:::
Bloqueo de cuentas mediante el campo de contraseña
El campo contraseña también puede reflejar el estado de
una cuenta:
| Valor | Significado | Efecto |
|---|---|---|
* |
Cuenta bloqueada sin contraseña | El usuario no puede iniciar sesión. |
!$6$JfQ4sa8K$... |
Hash precedido de ! |
Bloqueo temporal de cuenta. |
vacío (:) |
Sin contraseña | Peligroso: permite acceso sin autenticación. |
!! |
Usuario recién creado sin contraseña asignada | Necesita establecerse manualmente. |
Ejemplo:
bob:!$6$32hT9g4z$E5JZb1...:19500:7:90:14:::
El prefijo ! bloquea el acceso hasta que el
administrador lo desbloquee con:
sudo passwd -u bobVisualización de información útil
Mostrar la línea completa de un usuario en
/etc/shadow:sudo grep maria /etc/shadowComprobar el último cambio de contraseña:
sudo chage -l mariaEl parámetro
-llista la información de caducidad de la cuenta.Ejemplo de salida:
Last password change : Oct 17, 2025 Password expires : Dec 16, 2025 Password inactive : never Account expires : never Minimum number of days between password change : 7 Maximum number of days between password change : 90 Number of days of warning before password expires : 14Convertir el campo
lastchangeen fecha legible:date -d "1970-01-01 +19500 days"El parametro
-dpermite especificar una fecha que queremos convertir.Resultado:
Wed Oct 17 00:00:00 UTC 2025
Herramientas relacionadas con
/etc/shadow
| Comando | Descripción | Ejemplo | Parámetros utilizados |
|---|---|---|---|
passwd |
Cambia o bloquea contraseñas. | sudo passwd -l juan |
-l (lock): bloquea la cuenta
del usuario sustituyendo el hash de contraseña por un valor que impide
el acceso (!). Se usa junto al nombre del usuario. |
chage |
Modifica la caducidad y los parámetros de expiración de la contraseña. | sudo chage -M 60 -W 10 juan |
-M 60: establece 60 días como el
máximo de validez de la contraseña. -W 10: avisa al usuario 10 días antes de
que la contraseña caduque. |
pwck |
Comprueba la coherencia y permisos de los archivos
/etc/passwd y /etc/shadow. |
sudo pwck -r |
-r (read-only): realiza la
comprobación sin efectuar cambios. Muestra errores pero no corrige
nada. |
vipw -s |
Edita de forma segura el archivo /etc/shadow
bloqueándolo para evitar accesos simultáneos. |
sudo vipw -s |
-s: indica que se va a editar el
archivo /etc/shadow en lugar de
/etc/passwd. |
Buenas prácticas para /etc/shadow
Nunca modificarlo manualmente. Utilice los comandos
passwd,chageovipw -s.Verificar permisos periódicamente:
sudo chmod 640 /etc/shadow sudo chown root:shadow /etc/shadowEvitar contraseñas vacías o cuentas sin expiración definida.
Habilitar contraseñas cifradas con SHA-512 o yescrypt editando
/etc/login.defs:ENCRYPT_METHOD SHA512Auditar cuentas bloqueadas o inseguras:
sudo awk -F: '$2 ~ /^(\*|!)+$/ {print $1 " -> Cuenta bloqueada"}' /etc/shadow
A continuación, se explica cada elemento del comando anterior:
| Parte | Significado |
|---|---|
sudo |
Ejecuta el comando con privilegios de superusuario.
Es necesario porque /etc/shadow solo puede ser leído por el
root. |
awk |
Es una herramienta de filtrado y procesamiento de texto. Permite analizar columnas, aplicar condiciones y realizar acciones. |
-F: |
Define el delimitador de campos como :
(dos puntos). En /etc/shadow, cada línea tiene campos
separados por :. Ejemplo de línea:
juan:$6$xyz123...:19500:0:99999:7:::. |
$2 |
Hace referencia al segundo campo de cada línea. En
/etc/shadow, este campo contiene la contraseña
cifrada o su estado. |
~ |
Este operador indica “coincide con”. Su sintaxis es
expresión ~ /patrón. Si la condición es cierta entonces se
ejecuta la acción que está entre paréntesis. |
/^(\*|!)+$/ |
Es una expresión regular (regex) aplicada al campo
$2. Vamos a descomponerla: |
🔹 ^. Inicio de la cadena.🔹Los paréntesis indican un grupo de opciones, en este caso hay dos opciones. 🔹 \*. Busca un asterisco literal (*). Se escapa
con \ porque * tiene significado especial en
regex.🔹 |. Es el operador “o”
lógico.🔹 ! Indica el carácter !.
🔹 + Indica que los elementos del grupo anterior deben
aparecer uno o más veces.🔹 $. Fin de la cadena. |
|
En resumen, esta expresión selecciona las líneas cuyo segundo campo
solo contiene *, !,
!*, etc., es decir, cuentas bloqueadas o sin
contraseña válida. |
|
{print $1 " -> Cuenta bloqueada"} |
Acción que realiza awk si se cumple la condición
anterior: imprime el primer campo ($1,
nombre del usuario) seguido del texto
" -> Cuenta bloqueada". |
/etc/shadow |
Archivo de entrada. Contiene los registros de usuarios del sistema con sus contraseñas cifradas y parámetros de caducidad. |
Referencias:
En los siguientes enlaces puedes encontrar más información sobre la utilidad
awky expresiones regulares:
- Introducción a AWK. Guillem Lluch Moll.
- Guía del comando AWK. Sysadmin Blog.
- Regex101.
- Expresiones Regulares. José Miguel Sánchez Alés.
1.2.3 Archivo
/etc/group
El archivo /etc/group define todos los
grupos de usuarios del sistema Linux, así como los
miembros asociados a cada grupo. Cada línea del archivo
representa un grupo y sigue el formato:
grupo:x:GID:usuario1,usuario2,...
| Campo | Descripción |
|---|---|
grupo |
Nombre simbólico del grupo (por ejemplo: sudo,
adm, students). Se usa en comandos y
configuraciones. |
x |
Indica que la contraseña del grupo (si existe) está almacenada de
forma cifrada en /etc/gshadow. En la práctica, casi nunca
se usa una contraseña de grupo. |
GID |
Group ID — número identificador único del grupo. Lo usa el sistema internamente para asignar permisos. |
miembros |
Lista opcional de usuarios secundarios (separados por comas) que pertenecen al grupo además de su grupo principal. |
Ejemplo sencillo
admins:x:1002:juan,maria
En este ejemplo tenemos los siguientes campos:
admins: Nombre del grupo.x: Indica que el hash de la contraseña (si existiera) está en/etc/gshadow.1002: Identificador numérico del grupo.juan,maria: Lista de usuarios que son miembros secundarios del grupoadmins.
Tipos de grupos
Linux distingue entre dos tipos de pertenencia a grupos:
| Tipo de grupo | Descripción | Definido en |
|---|---|---|
| Principal | Asociado al usuario en su línea de /etc/passwd (campo
GID). Cada archivo nuevo creado por el usuario hereda este grupo. |
/etc/passwd |
| Secundario | Grupos adicionales a los que pertenece el usuario. Permiten acceder a recursos compartidos. | /etc/group |
Un usuario puede pertenecer a uno principal y varios secundarios simultáneamente.
Comandos útiles para la gestión de grupos
| Comando | Descripción | Ejemplo |
|---|---|---|
groupadd |
Crea un nuevo grupo. | sudo groupadd profesores |
groupdel |
Elimina un grupo existente. | sudo groupdel invitados |
groupmod |
Modifica atributos del grupo (nombre, GID). Ejemplo: Con el
parámetro -n cambia el nombre. |
sudo groupmod -n staff empleados |
usermod -aG |
Añade un usuario a uno o varios grupos secundarios. | sudo usermod -aG sudo,adm juan |
id |
Muestra los grupos a los que pertenece el usuario actual. | id |
id usuario |
Muestra los grupos a los que pertenece un usuario. | id juan |
groups |
Lista los grupos del usuario actual. | groups |
groups usuario |
Lista los grupos del usuario de forma resumida. | groups ana |
newgrp grupo |
Cambia el grupo principal de la sesión actual. | newgrp docker |
Permisos relacionados con grupos
Los permisos de grupo son fundamentales para compartir archivos de forma controlada:
- Permiten que varios usuarios accedan a los mismos recursos sin usar la misma cuenta.
- Se pueden asignar permisos específicos de lectura, escritura o ejecución para los miembros del grupo.
- Al combinarse con umask, ACLs o sticky bits, permiten modelos avanzados de control de acceso.
Ejemplo:
sudo chgrp admins /srv/compartido
sudo chmod 770 /srv/compartidoSolo los usuarios del grupo admins (y root) podrán leer,
escribir o acceder al directorio /srv/compartido.
1.2.4 Archivo
/etc/gshadow
Este archivo almacena información sensible relacionada con los grupos, como:
- Hashes de contraseñas de grupo (si las hay).
- Administradores del grupo.
- Miembros.
- Solo root puede leerlo y modificarlo.
- Se gestiona de forma segura mediante el comando
vigr.
1.2.5 Archivo
/etc/login.defs
Contiene políticas globales para la creación y comportamiento de usuarios:
| Parámetro | Descripción | Ejemplo |
|---|---|---|
PASS_MAX_DAYS |
Días máximos antes de caducar la contraseña. | 90 |
PASS_MIN_DAYS |
Días mínimos entre cambios. | 7 |
PASS_WARN_AGE |
Días de aviso antes de caducar. | 14 |
UID_MIN |
UID mínimo asignado a usuarios normales. | 1000 |
UID_MAX |
UID máximo asignado. | 60000 |
📘 Nota: El comando
useraddtoma por defecto los valores definidos en este archivo.
1.3 Creación de usuarios
En los sistemas GNU/Linux, podemos utilizar los comandos
useradd y adduser para crear nuevas cuentas de
usuario.
1.3.1
useradd
Se considera un comando de más bajo nivel. Permite crear usuarios manualmente y configurar sus atributos.
Este comando no crea automáticamente el directorio
personal del usuario (/home/usuario), ni copia
archivos de configuración inicial, a menos que se especifique con la
opción -m.
Tampoco pregunta nada al usuario, hay que darle los parámetros de forma explícita.
Ejemplo:
sudo useradd -m -s /bin/bash mariaLos parámetros que se han utilizado son:
m: Crea el directorio personal/home/maria.-s /bin/bash: Asigna el shell/bin/bash.
Ahora falta asignar una contraseña a la cuenta:
sudo passwd mariaOpciones más importantes del comando
useradd:
| Opción | Descripción |
|---|---|
-m |
Crea el directorio personal del usuario. |
-s |
Especifica el shell asignado. |
-d |
Define un directorio distinto al estándar. |
-u |
Asigna un UID manualmente. |
-G |
Añade el usuario a grupos secundarios. |
1.3.2
adduser
adduser es un script de alto nivel que
facilita la creación de usuarios. Se encarga de tareas adicionales, como
la creación del directorio personal y la configuración de archivos de
inicio.
Este comando llama automáticament a passwd para asignar
una contraseña.
Ejemplo:
sudo adduser mariaEn este caso, el sistema nos pedirá más información:
Adding user `maria' ...
Creating home directory `/home/maria' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
...
1.4 Modificación de usuarios
El comando usermod permite actualizar los parámetros de
una cuenta ya creada sin necesidad de eliminarla o volver a crearla.
Se pueden cambiar datos como la shell, el grupo, el directorio personal o incluso añadir el usuario a nuevos grupos.
Cambiar la shell de un usuario
sudo usermod -s /bin/sh mariaCon el parámetro -s se especifica la nueva shell.
El cambio se reflejará en el archivo /etc/passwd, en la
última columna de su registro.
Añadir un usuario a un grupo adicional
En este ejemplo vamos a añadir a la usuaria maria al
grupo docker:
sudo usermod -aG docker mariaa: Añade el usuario a los grupos especificados sin eliminar los existentes.G: Lista de grupos secundarios separados por comas.
Bloquear una cuenta de usuario
sudo passwd -l mariaEn este ejemplo, se bloquea la cuenta de maria sin
eliminar su contraseña ni su acceso administrativo.
El sistema añade un carácter ! al inicio del hash de la
contraseña en /etc/shadow, lo que impide que el usuario se
autentique.
Comprobación del estado:
sudo passwd -S mariaMuestra un resumen del estado de la contraseña y la cuenta del usuario.
Ejemplo de una posible salida:
maria L 2025-10-17 0 99999 7 -1 (Password locked.)
Vamos a interpretar cada campo de la salida anterior:
| Campo | Significado |
|---|---|
maria |
Nombre del usuario |
L |
Estado: Locked (bloqueada), P (password usable) |
2025-10-17 |
Fecha del último cambio de contraseña |
0 |
Días mínimos antes de poder cambiarla |
99999 |
Días máximos de validez de la contraseña |
7 |
Días de aviso antes de la caducidad |
-1 |
Sin fecha de expiración de la cuenta |
(Password locked.) |
Descripción textual del estado |
1.5 Eliminar usuarios
Para eliminar una cuenta de usuario en Linux, se utiliza el comando
userdel.
Eliminar un usuario sin borrar su directorio personal
sudo userdel mariaEste comando elimina la cuenta de maria, pero no
borra su directorio personal ni sus archivos.
Eliminar un usuario y su directorio personal
sudo userdel -r mariaEl parámetro -r indica que se debe eliminar también el
directorio personal del usuario y su contenido.
1.6 Gestión de contraseñas y caducidad
La herramienta chage (change age) se utiliza
para gestionar la vigencia y las políticas de caducidad de las
contraseñas de los usuarios.
Permite definir cada cuánto tiempo deben cambiar su clave, cuándo serán avisados y si su cuenta expira automáticamente.
Este comando nos puede ayudar a asegurar la rotación periódica de contraseñas.
Algunos de los parámetros más comunes de chage son:
| Parámetro | Uso | Ejemplo | Descripción detallada |
|---|---|---|---|
-l |
Listar información | sudo chage -l maria |
Muestra la configuración actual de caducidad de contraseña y cuenta del usuario. Solo lectura, no modifica nada. |
-M |
Máximo de días | sudo chage -M 60 maria |
Establece el número máximo de días durante los cuales una contraseña es válida. Después de este tiempo, el usuario deberá cambiarla. |
-m |
Mínimo de días | sudo chage -m 1 maria |
Define el número mínimo de días que deben pasar antes de poder cambiar la contraseña de nuevo. Evita cambios consecutivos inmediatos. |
-W |
Aviso previo | sudo chage -W 7 maria |
Define cuántos días antes de la caducidad se avisará al usuario al iniciar sesión. |
-I |
Inactividad tras caducidad | sudo chage -I 5 maria |
Indica el número de días de inactividad después de que la contraseña haya caducado antes de bloquear completamente la cuenta. |
-E |
Fecha de expiración de cuenta | sudo chage -E 2025-12-31 maria |
Fija la fecha exacta en que la cuenta del usuario
expirará (se bloqueará). Usa el formato AAAA-MM-DD. |
-d |
Fecha del último cambio | sudo chage -d 0 maria |
Establece la fecha del último cambio de contraseña.
Usar 0 fuerza al usuario a cambiar su contraseña en el
próximo inicio de sesión. |
--help |
Ayuda rápida | chage --help |
Muestra una lista con todas las opciones disponibles y su descripción. |
Ejemplo:
Vamos a modificar la cuenta de maria para que su
contraseña caduque cada 60 días y reciba un aviso 7 días antes de la
expiración:
sudo chage -M 60 -W 7 mariaM 60: Establece un máximo de 60 días entre cambios de contraseña.W 7: Configura una advertencia 7 días antes de la expiración.
Ejemplo:
Vamos a comprobar la configuración actual de caducidad de la cuenta
de maria:
sudo chage -l mariaLast password change : Oct 19, 2025
Password expires : Dec 18, 2025
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 60
Number of days of warning before password expires : 7
1.7 Creación de grupos
En los sistemas GNU/Linux, la administración de grupos permite organizar usuarios por roles, departamentos o niveles de acceso.
Para ello se utilizan los comandos groupadd y, en
algunas distribuciones, el script de alto nivel
addgroup.
1.7.1
groupadd
El comando groupadd se usa para crear un grupo
nuevo en el sistema. Es un comando de bajo
nivel que actualiza directamente los ficheros
/etc/group y /etc/gshadow.
Ejemplo:
sudo groupadd proyectosEsto crea un grupo llamado proyectos con un GID
(Group ID) asignado automáticamente.
Verificar el grupo creado:
Podemos comprobar que el grupo se ha creado correctamente con el comando:
getent group proyectosSalida de ejemplo:
proyectos:x:1003:
Opciones más importantes del comando
groupadd:
| Opción | Descripción |
|---|---|
-g |
Permite asignar un GID manualmente. |
-r |
Crea un grupo del sistema (GID < 1000). |
-f |
Evita errores si el grupo ya existe. |
Ejemplo con GID personalizado:
sudo groupadd -g 1050 desarrolloEsto crea el grupo desarrollo con GID
1050.
1.7.2
addgroup
En sistemas Debian y Ubuntu, también puede usarse el comando
addgroup, que actúa como una interfaz más
sencilla para groupadd.
Ejemplo:
sudo addgroup soporteEl sistema mostrará una salida más descriptiva:
Adding group `soporte' (GID 1004) ...
Done.
📘 Nota: Recomendado cuando se busca simplicidad o se trabaja en entornos Debian-based.
1.8 Modificación de grupos
El comando groupmod permite actualizar las
propiedades de un grupo existente, como su nombre o su
identificador numérico (GID).
1.8.1 Cambiar el nombre de un grupo
sudo groupmod -n seguridad proyectosEste comando renombra el grupo proyectos a
seguridad.
Verificar el cambio:
grep seguridad /etc/groupSalida de ejemplo:
seguridad:x:1003:
1.8.2 Cambiar el GID de un grupo
sudo groupmod -g 1100 seguridadEsto actualiza el Group ID del grupo
seguridad a 1100.
Importante: Si el GID nuevo ya existe, el sistema mostrará un error. Asegúrate de que no haya conflictos antes de asignar un nuevo valor.
Opciones más importantes del comando
groupmod:
| Opción | Descripción |
|---|---|
-n |
Cambia el nombre del grupo. |
-g |
Cambia el número de GID. |
-o |
Permite usar un GID duplicado (rara vez necesario). |
Comprobación de los cambios:
getent group seguridad1.9 Eliminar grupos
Cuando un grupo deja de ser necesario, se puede eliminar utilizando
el comando groupdel.
1.9.1
groupdel
Este comando elimina el grupo del sistema, eliminando su entrada de
los ficheros /etc/group y /etc/gshadow.
Ejemplo:
sudo groupdel seguridadVerificar que el grupo ha sido eliminado:
grep seguridad /etc/group || echo "Grupo eliminado correctamente"1.9.2 Precauciones antes de eliminar un grupo
Comprueba si aún tiene miembros:
getent group seguridadRevisa si hay archivos en el sistema que pertenezcan a ese grupo:
sudo find / -group seguridad 2>/dev/nullSi aparecen resultados, cambia su grupo antes de borrar el grupo:
sudo chgrp nuevo_grupo archivoNo elimines grupos del sistema (GID < 1000), ya que pueden ser necesarios para servicios.
1.10 Buenas prácticas del administrador
Revisar cuentas con UID 0: Solo debe existir el usuario
root. Cualquier otra cuenta con UID 0 implica un riesgo crítico.Desactivar shells no autorizados: Las cuentas de servicio deben tener
/usr/sbin/nologino/bin/falsepara impedir el acceso interactivo.Auditar regularmente los archivos de autenticación: Usar herramientas como
awk,grep,getent passwdolastlogpara identificar cuentas antiguas o sin uso.Configurar PAM (
/etc/pam.d/common-password): Activar el módulopam_pwquality.sopara aplicar políticas de complejidad (longitud mínima, mezcla de caracteres, etc.).Bloquear cuentas inactivas:
sudo usermod --expiredate 2025-12-31 usuarioo mediante automatización con
faillockopam_tally2.Usar
sudoy noroot: Permite registrar cada comando ejecutado y evita daños accidentales. El registro se almacena en/var/log/auth.log.Realizar auditorías periódicas: Comandos útiles:
sudo lastlog sudo cat /etc/shadow | awk -F: '$2 == "" {print $1}'El segundo identifica usuarios sin contraseña definida (alto riesgo).
1.11 Riesgos comunes en la gestión de usuarios
Contraseñas débiles o sin caducidad: Facilitan ataques de fuerza bruta o reutilización de credenciales. Deben tener una longitud mínima y cumplir con políticas de complejidad (mayúsculas, minúsculas, dígitos y caracteres especiales).
Cuentas inactivas o abandonadas: Son un riesgo porque pueden ser utilizadas por atacantes si permanecen habilitadas.
Uso excesivo del usuario root: Incrementa el riesgo de errores críticos y dificulta la trazabilidad. → Se debe emplear el comando
sudocon configuración específica en/etc/sudoers.Permisos incorrectos en archivos del sistema: Si los archivos
/etc/passwdo/etc/shadowson legibles por usuarios no autorizados, las contraseñas podrían exponerse.
1.12 Medidas de bastionado recomendadas
- Aplicar políticas de contraseñas fuertes y caducidad controlada.
- Usar autenticación multifactor (2FA) cuando sea posible.
- Bloquear cuentas inactivas automáticamente tras un periodo sin uso.
- Mantener un registro de auditoría de los accesos
(con
last,w,who). - Configurar PAM (Pluggable Authentication Modules) para reforzar la autenticación.
IMPORTANTE: Más adelante realizaremos una práctica para resolver cada una de estas medidas de bastionado recomendada.
2 Ejercicios prácticos
| Nº | Ejercicio | Competencia que desarrolla |
|---|---|---|
| 1 | Identificación de usuarios | Distinguir roles y tipos de cuentas en el sistema |
| 2 | Verificación de permisos | Interpretar permisos y seguridad en archivos críticos del sistema |
| 3 | Relación passwd/shadow/group | Comprender la estructura y vínculo entre los ficheros de autenticación |
| 4 | Creación y modificación de usuarios | Aplicar comandos de administración de cuentas de forma segura |
| 5 | Auditoría de cuentas del sistema | Identificar cuentas vulnerables, obsoletas o sin credenciales |
| 6 | Políticas de caducidad | Configurar políticas de rotación y aviso de cambio de contraseñas |
| 7 | Auditoría global de usuarios | Realizar diagnósticos generales de bastionado y configuración de cuentas |
| 8 | Modificación avanzada de cuentas | Gestionar cambios complejos en cuentas sin pérdida de datos |
| 9 | Gestión de grupos del sistema | Administrar grupos y relaciones entre usuarios y roles |
| 10 | Creación de grupos y asignación de usuarios | Organizar usuarios por departamentos o funciones específicas |
| 11 | Auditoría combinada de usuarios y grupos | Detectar inconsistencias y relaciones inseguras entre cuentas y grupos |
| 12 | Eliminación segura de cuentas y limpieza del sistema | Mantener la integridad y limpieza del sistema de cuentas locales |
2.1 Ejercicio 1. Identificación y clasificación de usuarios en Linux
En un sistema multiusuario, la seguridad comienza por conocer quién existe en el sistema y qué privilegios tiene cada cuenta. Un error frecuente en la administración es no controlar las cuentas creadas por servicios o administradores anteriores, lo que puede dejar puertas abiertas.
Realice los siguientes pasos:
Muestra las primeras 10 líneas del archivo
/etc/passwdpara ver las cuentas definidas en el sistema.Lista todos los usuarios que tienen un UID menor que 1000, lo que corresponde a usuarios del sistema.
Muestra la información del superusuario.
Crea un nuevo usuario para tus pruebas llamado
prueba1con directorio personal y shell bash.
2.2 Ejercicio 2. Verificación de la seguridad de los archivos del sistema
Las contraseñas en Linux no se almacenan en texto
plano. Están cifradas y guardadas en el archivo
/etc/shadow, que debe ser accesible únicamente por el
administrador. Verificar los permisos es una de las tareas básicas de
bastionado.
Realice los siguientes pasos:
Comprueba los permisos de los archivos
/etc/passwdy/etc/shadow.Interpreta el significado de cada columna (propietario, grupo, permisos).
Intenta visualizar el contenido de
/etc/shadowsin privilegios de superusuario. Deberías obtener un mensaje de “Permiso denegado”.Visualiza su contenido con
sudopara observar el formato cifrado.
2.3 Ejercicio 3. Exploración de la información de usuarios y grupos
Cada usuario tiene tres componentes principales:
- Información general (
/etc/passwd) - Contraseña cifrada y caducidad (
/etc/shadow) - Pertenencia a grupos (
/etc/group)
Entender esta relación es esencial para administrar cuentas y diagnosticar problemas de acceso.
Realice los siguientes pasos:
Busca la línea del usuario
prueba1en/etc/passwd.Consulta su contraseña cifrada y parámetros de caducidad en
/etc/shadow.Comprueba el grupo principal del usuario.
2.4 Ejercicio 4. Creación y modificación de cuentas de usuario
Una gestión correcta de usuarios es parte esencial del bastionado. Permite aplicar políticas personalizadas de acceso y desactivar temporalmente cuentas comprometidas o en desuso.
Realice los siguientes pasos:
Crea un nuevo usuario llamado
seguridad.Asígnale una contraseña.
Modifica su shell a
/bin/sh.Bloquea su cuenta temporalmente.
Comprueba su estado.
2.5 Ejercicio 5. Auditoría de cuentas del sistema
Los sistemas Linux antiguos o poco mantenidos suelen acumular cuentas obsoletas o no seguras. Una auditoría sencilla puede evitar accesos indebidos o escaladas de privilegios.
Realice los siguientes pasos:
Lista los usuarios con UID 0 (deben ser solo
root).Busca usuarios sin contraseña.
Comprueba qué usuarios nunca iniciaron sesión.
2.6 Ejercicio 6. Configuración de caducidad y rotación de contraseñas
Las normas de seguridad corporativas exigen rotar contraseñas cada cierto tiempo para minimizar el riesgo de exposición.
En este ejercicio se establecerán políticas de caducidad y aviso de
cambio de contraseñas mediante el comando chage.
Realice los siguientes pasos:
Aplica una política de caducidad de 45 días con aviso 5 días antes para el usuario
seguridad.Verifica la configuración.
2.7 Ejercicio 7. Auditoría global de usuarios
Antes de aplicar medidas de bastionado, el administrador debe conocer el estado real de las cuentas y sus configuraciones.
En este ejercicio se realizará un diagnóstico completo de la configuración de usuarios para detectar vulnerabilidades.
Realice los siguientes pasos:
Listar todos los usuarios con shell interactivo.
Mostrar usuarios sin contraseña.
Ver cuentas bloqueadas.
Ver quién tiene permisos de
sudo.
2.8 Ejercicio 8. Modificación avanzada de cuentas
En ocasiones es necesario ajustar cuentas existentes sin recrearlas, por ejemplo, al cambiar su nombre o su directorio personal.
Realice los siguientes pasos:
Renombra el usuario
seguridadaanalista.Cambia su directorio personal a
/home/analistay mueve los archivos automáticamente.Verifica los cambios en
/etc/passwd.Comprueba que los permisos del nuevo directorio sean correctos.
Añade al usuario al grupo
sudopara concederle privilegios administrativos.
2.9 Ejercicio 9. Gestión de grupos del sistema
La correcta administración de grupos es esencial para aplicar políticas de permisos y segmentar usuarios por departamentos o roles.
Realice los siguientes pasos:
Crea un grupo llamado
ciberseguridad.Añade al usuario
analistaal nuevo grupo.Comprueba su pertenencia a grupos.
Renombra el grupo
ciberseguridadaauditoria.Elimina el grupo anterior si ya no es necesario.
Verifica que el grupo ha sido eliminado.
2.10 Ejercicio 10. Creación de grupos y asignación de usuarios
En entornos reales se crean varios grupos para organizar usuarios por departamentos o funciones.
Realice los siguientes pasos:
Crea tres grupos:
soporte,redesyservidores.Crea tres usuarios y asígnalos a cada grupo.
Comprueba los grupos de cada usuario.
Crea un grupo común
tecnicosy agrégales acceso conjunto.Verifica que los tres usuarios pertenecen al grupo
tecnicos.
2.11 Ejercicio 11. Auditoría combinada de usuarios y grupos
En este ejercicio se realizará una auditoría conjunta para detectar inconsistencias entre usuarios, grupos y permisos.
Realice los siguientes pasos:
Muestra los grupos sin miembros.
Identifica usuarios cuyo grupo principal ya no existe.
Lista los grupos con más de 3 miembros.
Muestra todos los grupos a los que pertenece un usuario determinado (por ejemplo
analista).Exporta la relación completa de usuarios y grupos a un fichero.
2.12 Ejercicio 12. Eliminación segura de cuentas y limpieza del sistema
Eliminar usuarios inactivos o cuentas de prueba es parte del mantenimiento seguro del sistema.
Realice los siguientes pasos:
Bloquea la cuenta
usuario3antes de eliminarla.Haz una copia de seguridad de su directorio personal y guárdala en
/backup.Elimina su cuenta y su directorio personal.
Comprueba que ya no figura en los archivos del sistema.
Buscar posibles archivos huérfanos que pertenecían al usuario eliminado.