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:

  1. 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, admin con 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 root y usar sudo para tareas administrativas puntuales.
  2. 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.
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.
  1. 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.

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.defs

Nota: El parámetro -E permite usar expresiones regulares con el grep. 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/passwd

Se 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/shadow para evitar fugas de información, porque este archivo tiene permisos más restrictivos y solo es accesible por root.


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/shadow

Obtendremos una salida similar a esta:

-rw-r----- 1 root shadow 1534 Oct 17 10:45 /etc/shadow

⚠️ 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:

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/shadow

En 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 bob

Visualización de información útil

  1. Mostrar la línea completa de un usuario en /etc/shadow:

    sudo grep maria /etc/shadow
  2. Comprobar el último cambio de contraseña:

    sudo chage -l maria

    El parámetro -l lista 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       : 14
  3. Convertir el campo lastchange en fecha legible:

    date -d "1970-01-01 +19500 days"

    El parametro -d permite 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

  1. Nunca modificarlo manualmente. Utilice los comandos passwd, chage o vipw -s.

  2. Verificar permisos periódicamente:

    sudo chmod 640 /etc/shadow
    sudo chown root:shadow /etc/shadow
  3. Evitar contraseñas vacías o cuentas sin expiración definida.

  4. Habilitar contraseñas cifradas con SHA-512 o yescrypt editando /etc/login.defs:

    ENCRYPT_METHOD SHA512
  5. Auditar 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 awk y expresiones regulares:


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:


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:

Ejemplo:

sudo chgrp admins /srv/compartido
sudo chmod 770 /srv/compartido

Solo 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:


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 useradd toma 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 maria

Los parámetros que se han utilizado son:

Ahora falta asignar una contraseña a la cuenta:

sudo passwd maria

Opciones 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 maria

En 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 maria

Con 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 maria

Bloquear una cuenta de usuario

sudo passwd -l maria

En 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 maria

Muestra 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 maria

Este 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 maria

El 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 maria

Ejemplo:

Vamos a comprobar la configuración actual de caducidad de la cuenta de maria:

sudo chage -l maria
Last 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 proyectos

Esto 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 proyectos

Salida 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 desarrollo

Esto 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 soporte

El 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 proyectos

Este comando renombra el grupo proyectos a seguridad.

Verificar el cambio:

grep seguridad /etc/group

Salida de ejemplo:

seguridad:x:1003:

1.8.2 Cambiar el GID de un grupo

sudo groupmod -g 1100 seguridad

Esto 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 seguridad

1.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 seguridad

Verificar que el grupo ha sido eliminado:

grep seguridad /etc/group || echo "Grupo eliminado correctamente"

1.9.2 Precauciones antes de eliminar un grupo

  1. Comprueba si aún tiene miembros:

    getent group seguridad
  2. Revisa si hay archivos en el sistema que pertenezcan a ese grupo:

    sudo find / -group seguridad 2>/dev/null

    Si aparecen resultados, cambia su grupo antes de borrar el grupo:

    sudo chgrp nuevo_grupo archivo
  3. No elimines grupos del sistema (GID < 1000), ya que pueden ser necesarios para servicios.


1.10 Buenas prácticas del administrador

  1. Revisar cuentas con UID 0: Solo debe existir el usuario root. Cualquier otra cuenta con UID 0 implica un riesgo crítico.

  2. Desactivar shells no autorizados: Las cuentas de servicio deben tener /usr/sbin/nologin o /bin/false para impedir el acceso interactivo.

  3. Auditar regularmente los archivos de autenticación: Usar herramientas como awk, grep, getent passwd o lastlog para identificar cuentas antiguas o sin uso.

  4. Configurar PAM (/etc/pam.d/common-password): Activar el módulo pam_pwquality.so para aplicar políticas de complejidad (longitud mínima, mezcla de caracteres, etc.).

  5. Bloquear cuentas inactivas:

    sudo usermod --expiredate 2025-12-31 usuario

    o mediante automatización con faillock o pam_tally2.

  6. Usar sudo y no root: Permite registrar cada comando ejecutado y evita daños accidentales. El registro se almacena en /var/log/auth.log.

  7. 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

  1. 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).

  2. Cuentas inactivas o abandonadas: Son un riesgo porque pueden ser utilizadas por atacantes si permanecen habilitadas.

  3. Uso excesivo del usuario root: Incrementa el riesgo de errores críticos y dificulta la trazabilidad. → Se debe emplear el comando sudo con configuración específica en /etc/sudoers.

  4. Permisos incorrectos en archivos del sistema: Si los archivos /etc/passwd o /etc/shadow son legibles por usuarios no autorizados, las contraseñas podrían exponerse.


1.12 Medidas de bastionado recomendadas

IMPORTANTE: Más adelante realizaremos una práctica para resolver cada una de estas medidas de bastionado recomendada.


2 Ejercicios prácticos

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:

  1. Muestra las primeras 10 líneas del archivo /etc/passwd para ver las cuentas definidas en el sistema.

  2. Lista todos los usuarios que tienen un UID menor que 1000, lo que corresponde a usuarios del sistema.

  3. Muestra la información del superusuario.

  4. Crea un nuevo usuario para tus pruebas llamado prueba1 con 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:

  1. Comprueba los permisos de los archivos /etc/passwd y /etc/shadow.

  2. Interpreta el significado de cada columna (propietario, grupo, permisos).

  3. Intenta visualizar el contenido de /etc/shadow sin privilegios de superusuario. Deberías obtener un mensaje de “Permiso denegado”.

  4. Visualiza su contenido con sudo para observar el formato cifrado.


2.3 Ejercicio 3. Exploración de la información de usuarios y grupos

Cada usuario tiene tres componentes principales:

Entender esta relación es esencial para administrar cuentas y diagnosticar problemas de acceso.

Realice los siguientes pasos:

  1. Busca la línea del usuario prueba1 en /etc/passwd.

  2. Consulta su contraseña cifrada y parámetros de caducidad en /etc/shadow.

  3. 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:

  1. Crea un nuevo usuario llamado seguridad.

  2. Asígnale una contraseña.

  3. Modifica su shell a /bin/sh.

  4. Bloquea su cuenta temporalmente.

  5. 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:

  1. Lista los usuarios con UID 0 (deben ser solo root).

  2. Busca usuarios sin contraseña.

  3. 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:

  1. Aplica una política de caducidad de 45 días con aviso 5 días antes para el usuario seguridad.

  2. 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:

  1. Listar todos los usuarios con shell interactivo.

  2. Mostrar usuarios sin contraseña.

  3. Ver cuentas bloqueadas.

  4. 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:

  1. Renombra el usuario seguridad a analista.

  2. Cambia su directorio personal a /home/analista y mueve los archivos automáticamente.

  3. Verifica los cambios en /etc/passwd.

  4. Comprueba que los permisos del nuevo directorio sean correctos.

  5. Añade al usuario al grupo sudo para 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:

  1. Crea un grupo llamado ciberseguridad.

  2. Añade al usuario analista al nuevo grupo.

  3. Comprueba su pertenencia a grupos.

  4. Renombra el grupo ciberseguridad a auditoria.

  5. Elimina el grupo anterior si ya no es necesario.

  6. 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:

  1. Crea tres grupos: soporte, redes y servidores.

  2. Crea tres usuarios y asígnalos a cada grupo.

  3. Comprueba los grupos de cada usuario.

  4. Crea un grupo común tecnicos y agrégales acceso conjunto.

  5. 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:

  1. Muestra los grupos sin miembros.

  2. Identifica usuarios cuyo grupo principal ya no existe.

  3. Lista los grupos con más de 3 miembros.

  4. Muestra todos los grupos a los que pertenece un usuario determinado (por ejemplo analista).

  5. 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:

  1. Bloquea la cuenta usuario3 antes de eliminarla.

  2. Haz una copia de seguridad de su directorio personal y guárdala en /backup.

  3. Elimina su cuenta y su directorio personal.

  4. Comprueba que ya no figura en los archivos del sistema.

  5. Buscar posibles archivos huérfanos que pertenecían al usuario eliminado.