1. Fundamentos del control de acceso y modelos de identidad
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. 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 programado a nivel de kernel: por defecto, un proceso con UID 0 recibe todas las capabilities y no está sujeto a las comprobaciones de permisos DAC. Este poder solo puede restringirse con mecanismos adicionales como la reducción de capabilities, los módulos de control de acceso obligatorio (SELinux, AppArmor) o los espacios de nombres de usuario.
-
Es recomendable evitar el acceso directo en el sistema como
rooty usarsudopara tareas administrativas puntuales.
-
-
Usuarios del sistema (UID 1-999): Estos usuarios son creados automáticamente por el sistema o por servicios instalados como
mysql,www-dataodaemon.-
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.
-
En Debian, los UID
1-99se asignan de forma estática (paquetebase-passwd) y los UID100-999se asignan dinámicamente a los servicios que se instalan. Este rango se define con los parámetrosSYS_UID_MINySYS_UID_MAXde/etc/login.defs. -
Existe una excepción conocida: el usuario
nobody(UID65534), que es una cuenta sin privilegios usada por algunos servicios aunque su UID sea mayor que 1000. -
Aunque la convención actual es reservar los UID entre 0 y 999 para el sistema, cada distribución 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 |
|
A partir de UID 1000 son usuarios normales. |
Red Hat / CentOS / Fedora |
|
Desde RHEL 7. En versiones antiguas (RHEL ≤ 6) el rango era |
Arch Linux / Manjaro |
|
Siguen la convención moderna. |
SUSE / openSUSE |
|
Igual que Debian. |
Unix BSD / Solaris antiguos |
|
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/basho/bin/zsh. -
Tienen un grupo principal con el mismo nombre que el usuario y, normalmente, un GID igual al UID (siempre que ese GID esté libre).
-
No tienen privilegios administrativos a menos que se les otorgue mediante
sudo.
-
Los valores de UID_MIN y UID_MAX se configuran en el archivo /etc/login.defs. Puede consultar cuáles son los valores actuales del sistema con el siguiente comando:
grep -E '^UID_(MIN|MAX)' /etc/login.defs
|
El parámetro |
En Ubuntu 24.04 LTS, la salida del comando anterior devolvería los siguientes valores:
UID_MIN 1000 UID_MAX 60000
1.2. El modelo User Private Groups (UPG)
En los sistemas UNIX tradicionales, existía un modelo en el que todos los usuarios comunes pertenecían por defecto al mismo grupo principal compartido, comúnmente llamado users, con GID 100. Este esquema planteaba problemas de privacidad, ya que si un usuario otorgaba permisos de lectura o escritura a su grupo en un archivo, cualquier otro usuario del sistema podía acceder a él o modificarlo.
Para solventar esta debilidad, las distribuciones Linux modernas implementan de forma predeterminada el esquema UPG (User Private Group), que consiste en:
-
Grupo exclusivo por usuario: Cada vez que se crea un nuevo usuario, el sistema crea automáticamente un grupo privado con su mismo nombre y, si está disponible, un GID idéntico a su UID.
-
Aislamiento por defecto: El usuario es el único miembro de su grupo principal, garantizando que sus archivos personales nunca queden expuestos inadvertidamente a otros usuarios a través del grupo.
-
Flexibilidad para el trabajo en equipo: Si varios usuarios necesitan colaborar en un proyecto compartido, el administrador no necesita alterar sus grupos principales, basta con crear un grupo secundario específico y asignarles acceso a un directorio de trabajo común.
|
En el siguiente bloque (Permisos y control de acceso básico) se estudiará en detalle cómo se configuran los permisos de grupo, la máscara |
Este comportamiento está regulado en /etc/login.defs mediante la directiva:
USERGROUPS_ENAB yes
Si esta opción está establecida en yes, cuando se elimina un usuario con el comando userdel, el sistema también eliminará automáticamente su grupo privado si este no tiene más miembros.
2. Archivos esenciales de cuentas y seguridad de credenciales
Linux utiliza varios archivos de texto plano ubicados en el directorio /etc que constituyen la base de la autenticación local:
| Archivo | Función principal | Permisos recomendados |
|---|---|---|
|
Contiene información básica sobre las cuentas (nombre, UID, GID principal, directorio personal y shell). |
|
|
Almacena los hashes de las contraseñas y las directivas temporales de caducidad. |
|
|
Define los grupos del sistema y sus listas de miembros secundarios. |
|
|
Almacena las contraseñas de grupo y los administradores delegados de cada grupo. |
|
2.1. Archivo /etc/passwd
Es un archivo de texto plano accesible por todos los usuarios del sistema (permisos 644), ya que muchas herramientas y utilidades necesitan traducir UIDs numéricos a nombres de usuario legibles.
2.1.1. Estructura
Cada línea representa una cuenta de usuario y está dividida en siete campos separados por dos puntos (:):
usuario:contraseña:UID:GID:descripción:directorio_personal:shell
2.1.2. Campos principales
| Campo | Descripción | Ejemplo | Explicación técnica |
|---|---|---|---|
|
Nombre de la cuenta |
|
Identificador de inicio de sesión (login). En sistemas modernos sigue las convenciones POSIX (minúsculas, dígitos, guion y guion bajo). |
|
Puntero de autenticación |
|
En sistemas con contraseñas ocultas (shadow passwords), este campo siempre contiene una |
|
Identificador numérico de usuario |
|
Número único asignado al usuario. El valor |
|
Identificador del grupo principal |
|
GID numérico del grupo principal del usuario, definido en |
|
Campo de información GECOS |
|
Campo de texto libre para el nombre real, departamento, teléfono o ubicación. Puede modificarse con |
|
Ruta del directorio personal |
|
Directorio de inicio del usuario tras autenticarse con éxito. Las cuentas de servicio suelen apuntar a |
|
Intérprete de comandos |
|
Programa ejecutado al iniciar sesión interactiva. Si contiene |
2.1.3. Ejemplo
Podemos inspeccionar una entrada de /etc/passwd mediante grep:
grep '^maria:' /etc/passwd
maria:x:1001:1001:Maria Garcia:/home/maria:/bin/bash (1) (2) (3) (4) (5) (6) (7)
| 1 | Nombre de usuario. |
| 2 | Contraseña delegada en /etc/shadow. |
| 3 | UID del usuario. |
| 4 | GID de su grupo principal. |
| 5 | Comentario o campo GECOS. |
| 6 | Directorio personal asignado. |
| 7 | Intérprete de comandos inicial. |
2.2. Archivo /etc/shadow y seguridad de credenciales
Históricamente, los hashes de las contraseñas se almacenaban en el segundo campo de /etc/passwd. Dado que este fichero debe ser legible por cualquier proceso, cualquier usuario local podía extraer los hashes e intentar descifrarlos mediante ataques de fuerza bruta o diccionario. Para resolver este riesgo se introdujo /etc/shadow, accesible únicamente por el superusuario y por procesos autorizados.
|
Hash no es lo mismo que cifrado Es habitual leer que las contraseñas se guardan “cifradas”, pero técnicamente no es correcto:
Para verificar una contraseña en el inicio de sesión, el sistema aplica la misma función de hashing con la sal almacenada a lo que escribe el usuario y compara el resultado con el hash de |
La sal (salt) es una cadena aleatoria generada por el sistema que se concatena a la contraseña antes de calcular el hash. Cumple dos objetivos de seguridad vitales:
-
Impide el uso de tablas precalculadas (rainbow tables), ya que el atacante tendría que calcular una tabla distinta para cada sal posible.
-
Garantiza que dos usuarios con la misma contraseña tengan hashes completamente distintos en el archivo.
|
Lecturas recomendadas Los siguientes artículos permiten profundizar en el concepto de sal criptográfica y en las directrices de almacenamiento seguro de contraseñas: |
2.2.1. Estructura de /etc/shadow
Cada línea contiene nueve campos separados por dos puntos (:):
usuario:contraseña:lastchange:min:max:warn:inactive:expire:reserved
| Campo | Descripción | Ejemplo | Explicación técnica |
|---|---|---|---|
|
Nombre de la cuenta |
|
Debe coincidir exactamente con una entrada existente en |
|
Hash de la contraseña |
|
Contiene el algoritmo, la sal y el hash. Si contiene |
|
Fecha del último cambio |
|
Número de días transcurridos desde el 1 de enero de 1970 (epoch time). Puede convertirse a fecha legible con |
|
Días mínimos entre cambios |
|
Días que deben transcurrir antes de que el usuario pueda cambiar su contraseña de nuevo. Evita que un usuario burle el historial de contraseñas cambiándola muchas veces seguidas. |
|
Días máximos de validez |
|
Periodo máximo tras el cual la contraseña debe renovarse obligatoriamente. |
|
Días de aviso previo |
|
Antelación con la que el sistema comienza a advertir al usuario de la inminente expiración al iniciar sesión. |
|
Días de inactividad tras expiración |
|
Días de gracia tras expirar la contraseña antes de desactivar la cuenta por completo. |
|
Fecha de expiración absoluta |
|
Fecha en formato de días desde 1970 en que la cuenta deja de funcionar, independientemente de la contraseña. |
|
Campo reservado |
vacío |
Reservado para usos futuros. |
2.2.2. Formato de registro y prefijos de algoritmos de hash
El campo de contraseña contiene el hash y los metadatos del algoritmo utilizado conforme a la estructura general:
$id$params$salt$hash
Donde cada segmento cumple un propósito específico:
-
$id: Identifica el algoritmo de hash empleado en la derivación. -
$params: Parámetros de coste del algoritmo. Aparecen de forma obligatoria en yescrypt para fijar la dificultad de CPU y memoria, y de forma opcional en SHA-256 o SHA-512 mediante la directivarounds=Npara incrementar las iteraciones sobre el valor estándar de 5000. -
$salt: Cadena aleatoria única que individualiza el cálculo y evita la reutilización de ataques precalculados. -
$hash: Cadena final resultante de aplicar la función criptográfica unidireccional.
|
La familia de algoritmos |
|
En las funciones de hashing para contraseñas, la rapidez de cómputo constituye una debilidad. Cuanto más veloz es el cálculo de un hash, mayor es la cantidad de combinaciones por segundo que un atacante puede evaluar en ataques de fuerza bruta o diccionario. Por este motivo, los algoritmos modernos se diseñan deliberadamente para ser lentos y demandantes de recursos del sistema. |
A continuación se resumen los prefijos más habituales que identifican al algoritmo en el segundo campo de /etc/shadow:
| Prefijo | Algoritmo | Estado de seguridad |
|---|---|---|
|
yescrypt |
Recomendado por defecto en Debian 11, Debian 12 (Bookworm), Ubuntu 22.04 LTS y distribuciones recientes de Fedora. Resistente a ataques masivos con GPU (ver apartado 6.1). |
|
SHA-512 |
Estándar robusto anterior. Seguro, aunque más vulnerable a aceleración por hardware que yescrypt. |
|
SHA-256 |
Seguro, sustituido progresivamente por SHA-512 y yescrypt. |
|
bcrypt |
Muy seguro, basado en el cifrador Blowfish. Habitual en entornos BSD y aplicaciones web. |
|
MD5 |
Obsoleto e inseguro. Vulnerable a colisiones y ataques de fuerza bruta ultrarrápidos. |
Vacío ( |
Sin contraseña |
Riesgo crítico. Permite el inicio de sesión local sin ninguna autenticación. |
2.2.3. Herramientas relacionadas con /etc/shadow
| Comando | Descripción | Ejemplo de auditoría o configuración |
|---|---|---|
|
Cambia o consulta el estado de contraseñas. |
|
|
Comprueba la coherencia y permisos de |
|
|
Edita de forma segura |
|
2.3. Archivos de grupos: /etc/group y /etc/gshadow
Los grupos permiten organizar a los usuarios por funciones, departamentos o niveles de acceso a recursos:
grupo:contraseña:GID:miembros
-
/etc/group(permisos644 root:root):-
grupo: Nombre del grupo (ej.soporte). -
contraseña: Marcadorxque indica delegación en/etc/gshadow. -
GID: Identificador numérico del grupo. -
miembros: Lista de usuarios secundarios separados por comas. El usuario cuyo grupo principal coincide con el GID no necesita figurar en esta lista.
-
-
/etc/gshadow(permisos640 root:shadow):-
Contiene contraseñas de grupo y la lista de administradores de grupo que pueden gestionar miembros con
gpasswdsin necesidad de privilegios deroot(ver apartado 4.2). -
Se edita de forma segura mediante
sudo vigr -s.
-
2.4. Permisos críticos y copias de seguridad (CIS)
Las utilidades de cuentas (useradd, usermod, passwd, etc.) crean copias de seguridad automáticas con sufijo de guion (-) al efectuar cambios. El CIS Benchmark exige que estas copias se protejan con el mismo rigor que los archivos originales:
sudo chmod 644 /etc/passwd /etc/passwd- /etc/group /etc/group-
sudo chown root:root /etc/passwd /etc/passwd- /etc/group /etc/group-
sudo chmod 640 /etc/shadow /etc/shadow- /etc/gshadow /etc/gshadow-
sudo chown root:shadow /etc/shadow /etc/shadow- /etc/gshadow /etc/gshadow-
|
Con los conceptos explicados en este capítulo sobre los archivos de cuentas, formatos de hash, sal y algoritmos, ya puede realizar:
|
3. Ciclo de vida y bastionado de cuentas de usuario
La administración segura de identidades abarca el ciclo de vida completo de cada cuenta: creación controlada, asignación de plantillas, auditoría de permisos, mantenimiento de atributos, políticas de caducidad y baja segura sin dejar rastros residuales.
3.1. Creación de usuarios: bajo y alto nivel
En sistemas GNU/Linux coexisten dos herramientas principales para dar de alta cuentas:
-
useradd(bajo nivel): Binario estándar disponible en todas las distribuciones Linux. Es ideal para scripts y automatizaciones porque opera exactamente según los parámetros especificados, sin formular preguntas interactivas. En Debian y Ubuntu no crea el directorio personal salvo que se indique explícitamente con la opción-m. -
adduser(alto nivel): Script interactivo presente en Debian, Ubuntu y derivadas. Guía al administrador paso a paso, solicita la contraseña, crea el directorio personal con permisos seguros y aplica la plantilla/etc/skelde forma automática. En Red Hat y Fedora,adduseres simplemente un enlace simbólico auseradd.
3.1.1. Opciones principales de useradd
| Parámetro | Función | Ejemplo de uso |
|---|---|---|
|
Crea el directorio personal si no existe. |
|
|
Define el intérprete de comandos (shell). |
|
|
Añade información en el campo GECOS o comentario. |
|
|
Especifica una ruta personalizada para el directorio personal. |
|
|
Fija una fecha de expiración absoluta ( |
|
|
Días de gracia tras caducar la clave antes de desactivar la cuenta. |
|
|
Crea una cuenta del sistema (UID en rango |
|
|
Fuerza a no crear el directorio personal (útil en servicios). |
|
3.1.2. Creación segura de cuentas de servicio
Las cuentas que ejecutan servicios del sistema (como bases de datos o servidores web) nunca deben tener acceso interactivo ni directorios innecesarios:
sudo useradd -r -M -d /var/lib/appsvc -s /usr/sbin/nologin -c "Servicio de aplicacion" appsvc
Esta directiva garantiza que el UID pertenezca al rango de sistema, que no se cree un directorio en /home y que el intérprete impida el inicio de sesión interactivo con el mensaje «This account is currently not available».
3.2. Valores predeterminados y plantillas globales
Cuando useradd se invoca sin parámetros específicos, aplica la configuración por defecto definida en /etc/default/useradd y en /etc/login.defs:
useradd -D
Salida de ejemplo:
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
Para modificar estas directivas de forma persistente, el administrador puede utilizar useradd -D acompañado de las banderas correspondientes, por ejemplo: sudo useradd -D -f 30 para fijar 30 días de inactividad máxima tras expiración de contraseña.
3.2.1. El directorio plantilla /etc/skel
Cuando se crea un nuevo usuario con la opción -m, el sistema copia en su directorio personal todos los archivos y carpetas contenidos en /etc/skel, asignándoles como propietario al nuevo usuario. Permite estandarizar configuraciones de inicio (.bashrc, .profile) y definir máscaras de creación restrictivas (umask 027).
|
Para imponer directivas obligatorias e inmutables que los usuarios no puedan eludir, deben emplearse mecanismos globales del sistema: la directiva |
3.3. Permisos del directorio personal (/home) y directivas CIS
Uno de los fallos de configuración más frecuentes en auditorías de seguridad radica en los permisos asignados a los directorios de los usuarios en /home.
3.3.1. El riesgo del modo permisivo 755
Históricamente, muchas distribuciones creaban los directorios personales con modo 755 (drwxr-xr-x). Con esta configuración, cualquier usuario local no privilegiado puede ingresar al directorio de otro usuario y leer sus archivos personales, proyectos y documentos confidenciales si estos conservan permisos de lectura global.
3.3.2. Configuración segura según CIS Benchmark (750 o 700)
Las directrices del CIS Benchmark exigen que los directorios personales no otorguen permisos de acceso a “otros”:
-
Modo
750(drwxr-x---): Solo el propietario y los miembros de su grupo pueden acceder; el resto de usuarios del sistema tiene el acceso totalmente denegado. -
Modo
700(drwx------): Acceso exclusivo para el propietario.
|
Bajo el modelo UPG (ver apartado 1.2), el grupo principal de cada usuario solo lo contiene a él mismo, por lo que en la práctica |
Para garantizar que todos los nuevos usuarios se creen con permisos restrictivos, se deben configurar las siguientes directivas:
-
En
/etc/login.defs(parauseradd):HOME_MODE 0750 -
En
/etc/adduser.conf(paraadduseren Debian y Ubuntu):DIR_MODE=0750
3.3.3. Auditoría y remediación de directorios existentes
Para auditar y corregir directorios personales preexistentes que presenten permisos demasiado permisivos:
# Auditar directorios accesibles por el grupo o por otros
sudo find /home -maxdepth 1 -mindepth 1 -type d -perm /027 -ls
# Corregir permisos masivamente a 750
sudo find /home -maxdepth 1 -mindepth 1 -type d -exec chmod 750 {} +
3.4. Modificación de cuentas y control de intérpretes
El comando usermod permite actualizar cualquier atributo de una cuenta existente sin necesidad de recrearla:
-
Modificar directorio personal y mover contenido:
bash sudo usermod -d /home/nuevo -m usuario -
Cambiar el nombre de usuario (login):
bash sudo usermod -l nuevo_nombre antiguo_nombre -
Añadir a grupos secundarios: ```bash sudo usermod -aG docker,soporte usuario ````
|
Atención al modificar grupos con usermod Es imprescindible incluir la opción |
3.4.1. Cambio de intérprete y seguridad de /etc/shells
El comando chsh (change shell) permite a los usuarios modificar su propia shell. Sin embargo, los usuarios sin privilegios solo pueden elegir intérpretes que figuren explícitamente en el archivo /etc/shells.
|
Riesgo de seguridad en /etc/shells Bajo ninguna circunstancia deben añadirse |
3.5. Políticas de caducidad y expiración con chage
La herramienta chage (change age) gestiona la vigencia de las contraseñas y la expiración automática de las cuentas:
| Parámetro | Propósito | Ejemplo práctico | Descripción |
|---|---|---|---|
|
Listar estado |
|
Muestra la configuración completa de caducidad y expiración. |
|
Días máximos de validez |
|
Establece el periodo máximo tras el cual la contraseña debe cambiarse. |
|
Días mínimos entre cambios |
|
Impide cambios consecutivos en menos de 24 horas para eludir historiales de claves. |
|
Aviso previo |
|
Días previos a la expiración en que el usuario recibe alertas al iniciar sesión. |
|
Inactividad postcaducidad |
|
Días de gracia tras expirar la contraseña antes de desactivar la cuenta por completo. |
|
Fecha de expiración de cuenta |
|
Fija la fecha en que la cuenta queda bloqueada de forma absoluta. Con |
|
Forzar cambio inmediato |
|
Marca la fecha de último cambio a 0, forzando a cambiar la clave en el próximo inicio de sesión. |
|
Políticas corporativas: CIS frente a NIST SP 800-63B El CIS Benchmark exige tradicionalmente rotación periódica forzada de contraseñas, por ejemplo, cada 90 o 365 días. Sin embargo, la guía NIST SP 800-63B desaconseja la rotación periódica arbitraria, ya que induce a los usuarios a seleccionar patrones previsibles ( |
3.6. Bloqueo integral y baja segura de usuarios
El procedimiento para deshabilitar o eliminar una cuenta debe seguir pautas estrictas para no dejar brechas de acceso ni recursos huérfanos.
3.6.1. Bloqueo parcial frente a bloqueo completo
Existen dos niveles de bloqueo que conviene diferenciar claramente:
# Bloqueo parcial (solo contraseña)
sudo passwd -l maria
# Bloqueo completo de cuenta (CIS Benchmark)
sudo usermod -L -e 1 maria
|
La trampa del bloqueo con passwd -l El comando Para revocar el acceso de forma absoluta se debe hacer expirar la cuenta con |
Para reactivar una cuenta completamente bloqueada:
sudo usermod -U -e "" maria
Auditoría de cuentas bloqueadas o deshabilitadas con awk
Para auditar y detectar las cuentas del sistema que se encuentran deshabilitadas o bloqueadas en /etc/shadow, el administrador puede utilizar el siguiente comando:
sudo awk -F: '$2 ~ /^(\*|!)/ {print $1 " -> Cuenta bloqueada"}' /etc/shadow
A continuación se detalla la función técnica de cada uno de los elementos que componen el comando anterior:
| Elemento | Significado y función técnica |
|---|---|
|
Ejecuta el comando con privilegios administrativos, indispensables para acceder a |
|
Herramienta de procesamiento y filtrado de texto estructurado por columnas. |
|
Establece los dos puntos ( |
|
Apunta al segundo campo de cada registro, correspondiente al hash o al estado de la contraseña. |
|
Operador de correspondencia que evalúa si el valor coincide con el patrón de la expresión regular ( |
|
Expresión regular que detecta si el campo comienza por asterisco ( |
|
Bloque de acción que imprime el nombre de usuario ( |
|
Archivo del sistema sobre el que se efectúa la consulta. |
|
Referencias En los siguientes enlaces puede encontrar más información sobre la utilidad
|
3.6.2. Procedimiento de baja segura y prevención de archivos huérfanos
Antes de invocar userdel, el administrador debe ejecutar las siguientes comprobaciones preventivas:
-
Terminar procesos y sesiones activas:
who | grep maria pgrep -u maria sudo pkill -u maria sudo crontab -u maria -r 2>/dev/null -
Hacer copia de seguridad y rastrear archivos:
sudo tar -czvf /backup/maria_backup.tar.gz /home/maria sudo find / -xdev -user maria -ls 2>/dev/null -
Eliminar la cuenta y su directorio:
sudo userdel -r maria
|
Peligro de reutilización de UID y archivos huérfanos Al eliminar una cuenta con El comando
|
|
Con los procedimientos del ciclo de vida de usuarios explicados en este capítulo, ya puede realizar:
|
4. Gestión de grupos y colaboración
La administración de grupos permite organizar usuarios por departamentos, proyectos o niveles de acceso sin necesidad de compartir cuentas.
4.1. Ciclo de vida de grupos: creación, modificación y borrado
4.1.1. Crear grupos: groupadd
sudo groupadd proyectos
sudo groupadd -g 1050 desarrollo
-
-g: Asigna un GID numérico específico. -
-r: Crea un grupo del sistema (GID inferior a 1000).
En Debian y Ubuntu también está disponible el script addgroup soporte.
4.1.2. Modificar grupos: groupmod
Permite actualizar las propiedades de un grupo existente:
# Cambiar el nombre del grupo
sudo groupmod -n seguridad proyectos
# Cambiar el GID
sudo groupmod -g 1100 seguridad
|
Atención al modificar el GID El comando
|
4.1.3. Eliminar grupos: groupdel
sudo groupdel seguridad
El comando groupdel no permite eliminar el grupo principal de ningún usuario existente (groupdel: cannot remove the primary group of user '…'). Para poder borrarlo, primero se debe reasignar el grupo principal del usuario afectado (con usermod -g) o dar de baja a dicho usuario.
4.2. Delegación administrativa con gpasswd
El comando gpasswd es la utilidad asociada a /etc/gshadow. Permite gestionar membresías y delegar la administración de un grupo en usuarios específicos sin otorgarles privilegios de root:
| Comando | Acción realizada |
|---|---|
|
Añade un usuario al grupo secundario. |
|
Elimina a un usuario del grupo (revocación inmediata). |
|
Define la lista completa de miembros, sustituyendo la anterior. |
|
Nombra a un usuario administrador del grupo en |
|
Elimina la contraseña del grupo. |
Un usuario nombrado administrador de un grupo con gpasswd -A puede ejecutar gpasswd -a y gpasswd -d sobre su propio grupo sin invocar sudo. Esto permite que responsables de proyecto gestionen quién accede a sus carpetas compartidas sin comprometer la seguridad global del sistema.
|
Las contraseñas de grupo permitían antiguamente que un usuario se uniera temporalmente a un grupo con |
4.3. Trabajo colaborativo y consistencia de grupos
Para consultar las membresías de un usuario se utilizan las utilidades estándar:
id juan
groups juan
|
Los cambios de grupo no afectan a las sesiones abiertas La lista de grupos de un proceso se calcula en el momento exacto de iniciar sesión. Si se añade o retira a un usuario de un grupo, el cambio no tendrá efecto en sus terminales activas. El usuario debe cerrar su sesión y volver a entrar (o ejecutar |
|
Con las operaciones de administración de grupos y delegación con
|
5. Privilegios administrativos y delegación con sudo
El principio de mínimo privilegio exige erradicar el trabajo cotidiano mediante la cuenta directa de root. La delegación controlada con sudo (superuser do) permite conceder permisos granulares y auditar de forma fehaciente quién ejecuta qué acción en el sistema.
5.1. El riesgo del superusuario directo
Iniciar sesión directamente como root presenta graves deficiencias de seguridad:
-
Pérdida de trazabilidad e imputabilidad: Si varias personas conocen la contraseña de
root, es imposible determinar quién ejecutó una acción indebida o destructiva. -
Impacto catastrófico de errores: Cualquier error tipográfico en comandos con privilegios totales puede corromper el sistema de ficheros de forma irreversible.
-
Violación de cumplimiento: Normativas como PCI-DSS, ISO 27001 y el Esquema Nacional de Seguridad (ENS) prohíben el uso compartido de cuentas con privilegios de superusuario.
5.2. Auditoría exhaustiva de grupos privilegiados
La asignación de grupos secundarios en Linux requiere un control riguroso. Determinados grupos conceden control administrativo total sobre el sistema, mientras que otros proporcionan acceso a información confidencial que puede facilitar vectores de ataque indirectos o auditorías no autorizadas.
5.2.1. Grupos con acceso administrativo total o escalada directa a root
Pertenecer a estos grupos permite tomar el control completo del sistema o ejecutar comandos con privilegios de superusuario:
| Grupo | Mecanismo y vector de riesgo |
|---|---|
|
Concede privilegios de superusuario a través del comando |
|
En la instalación tradicional con demonio centralizado (rootful), el demonio se ejecuta como |
|
Concede control sobre el demonio de contenedores a través de su socket local. Permite crear contenedores privilegiados ( |
|
Otorga acceso directo de lectura y escritura a los dispositivos de almacenamiento en bloque ( |
|
En distribuciones Debian y Ubuntu, otorga permisos de escritura en |
5.2.2. Grupos con acceso a información confidencial y auditoría
Estos grupos no permiten la ejecución directa de comandos administrativos, pero exponen datos sensibles que comprometen la confidencialidad del sistema:
| Grupo | Información expuesta y riesgo operacional |
|---|---|
|
Permite la lectura de |
|
Otorga permisos de lectura sobre los archivos de registro tradicionales en |
|
Permite consultar la totalidad de los registros del diario de |
|
Concede acceso de lectura a los dispositivos de eventos en |
|
Alternativa segura al grupo docker: adopción de Podman o modo rootless Añadir una cuenta de usuario al grupo del sistema Para mitigar este vector crítico en entornos donde los usuarios deban ejecutar contenedores, existen dos soluciones de bastionado:
|
5.3. Ficheros de configuración y visudo
-
/etc/sudoers: Archivo de configuración principal. Nunca se debe editar con un editor de texto convencional, sino mediantesudo visudo, el cual bloquea el archivo para evitar concurrencia y valida la sintaxis antes de guardar. Un único fallo sintáctico en este fichero puede dejar el sistema bloqueado sin posibilidad de elevación administrativa. -
/etc/sudoers.d/: Directorio para reglas modulares en archivos independientes. Es la práctica recomendada porque facilita la automatización y previene sobrescrituras durante las actualizaciones de paquetes. Se edita consudo visudo -f /etc/sudoers.d/nombre.
Sintaxis fundamental de una directiva:
quién dónde=(como_quién) qué_comandos
Ejemplo de delegación con mínimo privilegio: permitir que los miembros de soporte reinicien el servicio SSH sin contraseña pero sin concederles ningún otro permiso de root:
%soporte ALL=(root) /usr/bin/systemctl restart ssh
|
Configuraciones peligrosas en sudoers
|
5.4. Comandos de auditoría y trazabilidad
| Comando | Utilidad técnica |
|---|---|
|
Lista los comandos que el usuario actual puede invocar mediante |
|
Permite al administrador inspeccionar los privilegios concedidos a otra cuenta. |
|
Verifica la integridad sintáctica de |
|
Muestra el registro inmutable de todos los comandos ejecutados a través de |
|
Con los conceptos de privilegios administrativos, reglas de
|
6. Mecanismos avanzados y resolución de identidades
Una vez asimilada la administración cotidiana de usuarios y grupos locales, resulta indispensable comprender los mecanismos de arquitectura interna que gobiernan la criptografía de contraseñas, la virtualización sin privilegios y la integración con directorios empresariales.
6.1. Criptografía avanzada de contraseñas: yescrypt
A lo largo de la historia de los sistemas UNIX y Linux, los algoritmos de almacenamiento de credenciales han evolucionado para contrarrestar el incremento exponencial en la capacidad de cómputo de los atacantes:
En sistemas modernos como Debian 11, Debian 12 (Bookworm), Ubuntu 22.04 LTS y versiones recientes de Fedora, el algoritmo predeterminado es yescrypt (prefijo $y$).
6.1.1. Anatomía de una contraseña yescrypt
$y$j9T$WOMmh5En0h210kQG0eK...$bK8kU0oG10Wb0X1z9V4f6D... (1) (2) (3) (4)
| 1 | Identificador del algoritmo ($y$ identifica yescrypt). |
| 2 | Parámetros de configuración y dificultad (cost settings). |
| 3 | Sal criptográfica aleatoria que individualiza el hash. |
| 4 | Hash final derivado tras aplicar la función criptográfica. |
Desglose de los parámetros de configuración y coste (j9T)
En el ejemplo anterior, la cadena j9T situada entre el identificador del algoritmo ($y$) y la sal codifica los parámetros de configuración y dificultad (cost settings):
-
j(Modo de operación y banderas): Selecciona la configuración estándar recomendadaYESCRYPT_DEFAULTS, la cual habilita el modo nativo de 64 bits con memoria de lectura y escritura (memory-hard). -
9(Coste computacional en CPU y memoria \(N\)): Representa un factor de coste exponencial \(N = 4096\), equivalente a \(2^{12}\) iteraciones. -
T(Tamaño de bloque de memoria \(r\)): Corresponde a un tamaño de bloque \(r = 32\), medido en unidades de 128 bytes.
6.1.2. Funciones resistentes a memoria (Memory-Hard)
Los algoritmos tradicionales como SHA-512 son muy rápidos y no demandan casi memoria RAM para calcularse. Esto beneficia al atacante, quien puede desplegar granjas de tarjetas gráficas (GPU) o chips ASIC capaces de calcular miles de millones de hashes SHA-512 por segundo en ataques de fuerza bruta.
En contraste, yescrypt es una función diseñada expresamente con memoria-dura (memory-hard). Cada verificación de contraseña exige al procesador acceder constantemente a un búfer de aproximadamente 16 MiB de memoria RAM:
Para un usuario legítimo que inicia sesión una sola vez, 16 MiB de RAM representan una fracción imperceptible de tiempo. Para un atacante que intenta evaluar millones de combinaciones por segundo, la exigencia de 16 MiB por hilo satura de inmediato el ancho de banda del bus de memoria y la memoria física disponible en dispositivos aceleradores como GPU, matrices de puertas lógicas programables en campo (FPGA) o circuitos integrados para aplicaciones específicas (ASIC), neutralizando la viabilidad económica y técnica del ataque.
6.1.3. Configuración de yescrypt en el sistema
El algoritmo de hash del sistema se gestiona en dos ubicaciones complementarias:
-
En PAM (
/etc/pam.d/common-passworden Debian y Ubuntu): Se configura mediante una opción del módulopam_unix.so. Es la directiva prioritaria utilizada por el comandopasswden las operaciones interactivas cotidianas:password [success=1 default=ignore] pam_unix.so obscure yescrypt -
En
/etc/login.defs: Gobierna el comportamiento de las herramientas administrativas que no invocan a PAM, tales comochpasswdonewusers:ENCRYPT_METHOD YESCRYPT YESCRYPT_COST_FACTOR 5La directiva
YESCRYPT_COST_FACTORpermite graduar el coste entre los niveles 1 y 11, siendo 5 el valor asignado por defecto en las distribuciones actuales.
|
La modificación del algoritmo o del factor de coste no altera retroactivamente las contraseñas preexistentes en |
6.1.4. Detección y migración de algoritmos heredados (Legacy)
En auditorías de bastionado sobre servidores actualizados a lo largo del tiempo o procedentes de migraciones anteriores, es muy frecuente encontrar cuentas cuyas contraseñas continúan almacenadas con algoritmos obsoletos o vulnerables, tales como MD5 ($1$), SHA-256 ($5$) o SHA-512 sin parámetros de memoria ($6$).
Dado que la actualización de las directivas en PAM o en /etc/login.defs para activar yescrypt no recalcula automáticamente los registros existentes en /etc/shadow, el administrador debe identificar activamente estas cuentas y forzar su renovación controlada.
Auditoría de contraseñas con algoritmos heredados
Para auditar e identificar qué cuentas del sistema utilizan funciones de hashing previas a yescrypt, se puede filtrar /etc/shadow por los prefijos de los algoritmos clásicos:
# Listar usuarios con hashes MD5 ($1$), SHA-256 ($5$) o SHA-512 ($6$)
sudo awk -F: '$2 ~ /^\$([156])\$/ {print $1, substr($2,1,3)}' /etc/shadow
Procedimiento de remediación y rotación forzada
Para garantizar una transición segura hacia algoritmos modernos, se aplican dos procedimientos según el tipo de cuenta:
-
Cuentas interactivas de usuarios:
La estrategia más segura consiste en marcar la contraseña como caducada forzando su actualización en el siguiente inicio de sesión:sudo chage -d 0 mariaCuando la usuaria inicie sesión, la pila PAM interceptará la solicitud a través de
pam_unix.so, validará la credencial actual y exigirá introducir una nueva contraseña, la cual será procesada y almacenada bajo el algoritmo configurado en ese momento (yescrypt con su sal correspondiente).Para automatizar este requisito sobre la totalidad de cuentas identificadas con algoritmos antiguos:
for usuario in $(sudo awk -F: '$2 ~ /^\$([156])\$/ {print $1}' /etc/shadow); do sudo chage -d 0 "$usuario" done -
Cuentas de servicio o despliegues automatizados:
En entornos desatendidos donde se dispone de las contraseñas gestionadas de forma centralizada, se puede actualizar la clave de forma masiva conchpasswd, la cual aplicará inmediatamente el algoritmo fijado en/etc/login.defs:echo "servicio_backup:ClaveComplejaGenerada2026!" | sudo chpasswd
6.2. Contenedores sin privilegios: /etc/subuid y /etc/subgid (Rootless)
En distribuciones modernas, al dar de alta un usuario normal se generan automáticamente entradas en los archivos /etc/subuid y /etc/subgid:
maria:100000:65536
Formato del registro:
usuario:UID_INICIAL:CANTIDAD
Esto indica que a la usuaria maria se le asigna un rango de 65.536 identificadores subordinados a partir del UID 100000.
6.2.1. Propósito de seguridad
Estos ficheros habilitan los espacios de nombres de usuario (User Namespaces) para tecnologías de contenedores sin privilegios (Rootless Docker o Podman):
-
El usuario puede actuar como
root(UID 0) dentro del contenedor. -
En el sistema anfitrión real, todos sus procesos se ejecutan bajo su UID subordinado sin privilegios (ej. UID 100000).
Si un atacante logra escapar del contenedor, aterriza en el anfitrión como un usuario sin privilegios y no como root, impidiendo la toma del sistema físico.
6.3. Fuentes de identidades híbridas: NSS y getent
Los archivos /etc/passwd y /etc/group representan la base de identidades local, pero no la única. En redes corporativas, los usuarios y grupos proceden habitualmente de directorios centralizados como LDAP, FreeIPA o Active Directory mediante SSSD.
El orden de consulta lo determina el NSS (Name Service Switch) a través de /etc/nsswitch.conf:
passwd: files systemd sss
group: files systemd sss
shadow: files sss
El sistema consulta primero en los ficheros locales (files), luego en los servicios dinámicos de systemd y finalmente en SSSD (sss).
Por este motivo, al auditar cuentas debe emplearse getent en lugar de leer directamente los archivos planos:
getent passwd maria
getent group sudo
Un grep sobre /etc/passwd omitiría cualquier usuario procedente de un directorio empresarial en red, mientras que getent consulta a través de la capa NSS completa.
6.4. Arquitectura de autenticación: la pasarela entre las cuentas locales y PAM
A lo largo de este bloque formativo se han analizado las estructuras estáticas donde residen las cuentas, sus contraseñas y sus parámetros temporales (/etc/passwd, /etc/shadow, /etc/group y /etc/gshadow). Sin embargo, en los sistemas GNU/Linux existe una estricta separación de responsabilidades entre el almacén de datos y la lógica de autenticación:
-
Los ficheros locales y NSS constituyen el almacén pasivo: Conservan los registros, los hashes criptográficos con su sal y las fechas de expiración.
-
PAM (Pluggable Authentication Modules) implementa el motor de decisión dinámico: Es la infraestructura modular encargada de consultar dicho almacén, evaluar las políticas de acceso y autorizar o denegar las peticiones de los usuarios.
6.4.1. Correspondencia funcional entre /etc/shadow y los grupos de PAM
Cuando una aplicación del sistema (como login, sshd, su, sudo o passwd) requiere validar o actualizar una identidad, invoca a la pila PAM dividida en cuatro grupos de gestión:
-
Grupo
auth(Autenticación de identidad):-
El módulo
pam_unix.solee el campo 2 de/etc/shadow, extrae la sal y el algoritmo, calcula el hash de la clave introducida y verifica si coinciden. -
Módulos complementarios como
pam_faillock.so(sucesor moderno depam_tally2) mantienen un registro independiente de intentos fallidos para mitigar ataques de fuerza bruta, bloqueando temporalmente la cuenta sin necesidad de corromper o alterar el registro en/etc/shadow.
-
-
Grupo
account(Validación del estado de la cuenta):-
El módulo
pam_unix.soevalúa los campos 4 a 8 de/etc/shadow: comprueba si la fecha de último cambio más el tiempo máximo de validez ha expirado (max), si se ha superado el periodo de gracia por inactividad (inactive) o si la fecha de caducidad absoluta ha llegado (expire). Si la cuenta expiró, la autenticación se interrumpe de inmediato emitiendo el mensaje «Your account has expired», neutralizando incluso accesos basados en llaves SSH.
-
-
Grupo
password(Actualización de credenciales):-
Antes de modificar el archivo de contraseñas, el módulo
pam_pwquality.soevalúa la longitud, la entropía y la presencia en diccionarios de la nueva clave elegida por el usuario. -
Una vez validada su robustez,
pam_unix.sogenera una nueva sal aleatoria de 16 bytes, deriva el hash utilizando el algoritmo configurado (habitualmente yescrypt) y reescribe el campo 2 de/etc/shadow, actualizando además la fecha del último cambio en el campo 3 con el número de días transcurridos desde el inicio de la época UNIX.
-
-
Grupo
session(Configuración del entorno de ejecución):-
Tras superar las fases anteriores, módulos como
pam_umask.soaplican la máscara de permisos predeterminada (por ejemplo027), mientraspam_limits.soimpone topes a los recursos del sistema definidos en/etc/security/limits.conf.
-
|
Esta arquitectura desacoplada permite sustituir o robustecer cualquier mecanismo de seguridad sin tener que reprogramar las utilidades de administración de cuentas. En el Bloque 3: Módulos de autenticación conectables (PAM) se abordará en profundidad la sintaxis de las reglas de control, el apilamiento de módulos y el bastionado avanzado mediante |
7. Guía consolidada de bastionado y lista de verificación
Como síntesis de las medidas analizadas en los capítulos anteriores, el administrador de sistemas debe verificar de forma sistemática el siguiente catálogo de directivas técnicas de endurecimiento.
7.1. Matriz de riesgos y medidas técnicas
| Vector de amenaza | Impacto potencial | Medida de bastionado obligatoria | Verificación técnica |
|---|---|---|---|
Cuenta clonada con UID 0 |
Puerta trasera de administración completa |
Exigir unicidad absoluta de UID 0 para |
|
Cuentas sin contraseña |
Acceso interactivo local no autenticado |
Bloquear o asignar contraseñas robustas |
|
Permisos laxos en /home |
Fuga de privacidad entre usuarios normales |
Imponer máscara CIS |
|
Sesiones SSH con clave activa |
Persistencia tras deshabilitar contraseña |
Bloqueo completo de cuenta con expiración |
|
Terminales desatendidas |
Acceso físico o lateral no autorizado |
Cierre forzado de shell por inactividad |
Variable inmutable |
Pertenencia a |
Escalada a superusuario sin auditoría |
Migrar a Docker rootless o Podman |
|
Ficheros huérfanos postbaja |
Apropiación de ficheros por nuevo UID |
Rastrear huérfanos antes de reasignar UIDs |
|
7.2. Lista de verificación de bastionado (Checklist CIS)
-
Asegurar que únicamente root tenga UID 0 y remediar cuentas clandestinas:
awk -F: '$3 == 0 {print $1}' /etc/passwdLa salida debe devolver únicamente
root. Si aparece cualquier otra cuenta (por ejemplotooroadmin), el sistema contiene una puerta trasera con privilegios absolutos de administración.Precaución operacional al eliminar cuentas con UID 0
Si se detecta una cuenta clandestina con UID 0, la ejecución directa de
userdelfallará si el atacante mantiene sesiones interactivas abiertas o procesos en segundo plano. Para remediar la intrusión de forma segura:-
Interrumpir procesos y sesiones activas: Terminar de inmediato cualquier proceso vinculado a la identidad clandestina antes de intentar su borrado:
sudo pkill -9 -u toor # O en sistemas con systemd: sudo loginctl terminate-user toor -
Bloquear la cuenta preventivamente: Desactivar la caducidad y el acceso por contraseña mientras se analiza el incidente:
sudo usermod -L -e 1 toor -
Eliminar la cuenta sin tocar el directorio raíz: Ejecutar el borrado de la cuenta con
sudo userdel toor(o forzándolo consudo userdel -f toorsi fuera necesario). Bajo ninguna circunstancia utilice la bandera-r(userdel -r), puesto que si la cuenta compartía el directorio/rootcon el superusuario legítimo, eliminaría el directorio de trabajo del administrador real.
-
-
Desactivar el intérprete interactivo en cuentas de servicio: Las cuentas de sistema (UID 1 a 999) deben utilizar
/usr/sbin/nologincomo shell en/etc/passwd. -
Configurar el cierre automático de sesión por inactividad (
TMOUT): {#sec7-2-tmout} Para evitar que una terminal desatendida quede expuesta, se define el cierre automático a los 15 minutos (900 segundos) de inactividad de forma obligatoria e inmutable en/etc/profile.d/timeout.sh:sudo tee /etc/profile.d/timeout.sh << 'EOF' readonly TMOUT=900 export TMOUT EOF sudo chmod 644 /etc/profile.d/timeout.sh -
Identificar cuentas con contraseña vacía:
sudo awk -F: '$2 == "" {print $1}' /etc/shadowLa salida debe ser estrictamente vacía.
-
Auditar identificadores duplicados (UIDs y GIDs):
cut -d: -f3 /etc/passwd | sort -n | uniq -d cut -d: -f3 /etc/group | sort -n | uniq -d -
Auditar nombres duplicados de usuario y grupo:
cut -d: -f1 /etc/passwd | sort | uniq -d cut -d: -f1 /etc/group | sort | uniq -d -
Elevación segura con
su -: Al cambiar a superusuario, utilice siempresu -osudo -ien lugar desu. El guion inicializa un entorno de inicio de sesión limpio y evita heredar variables manipuladas o rutas relativas en elPATH. -
Auditar ficheros de inicio ocultos y eliminar ficheros peligrosos:
-
Comprobar que los archivos de inicio (
.bashrc,.profile) en/homeno tengan permisos de escritura para otros:sudo find /home -maxdepth 2 -name ".*" -perm /022 -ls -
Asegurar que no existan archivos de credenciales obsoletos o inseguros:
sudo find /home \( -name ".netrc" -o -name ".rhosts" -o -name ".forward" \) -ls
-
-
Verificar que el grupo
shadowno tenga miembros interactivos:grep '^shadow:' /etc/groupEl cuarto campo debe estar vacío. Si contiene usuarios, estos pueden leer los hashes sin necesidad de
sudo. -
Proteger la cuenta root: En sistemas administrados con
sudo, la contraseña derootdebe permanecer bloqueada (estadoLensudo passwd -S root) y su grupo principal debe ser GID 0.
7.3. Diagnóstico automatizado de integridad: pwck y grpck
Las utilidades pwck y grpck analizan la integridad sintáctica y referencial de los archivos de cuentas. Es imprescindible ejecutarlas en modo de solo lectura (-r) en tareas de auditoría para no aplicar cambios imprevistos en los ficheros del sistema:
sudo pwck -r
sudo grpck -r
Estas herramientas comprueban que no existan campos omitidos, delimitadores faltantes, directorios personales inaccesibles, formatos corruptos ni GIDs inexistentes asignados a usuarios.
7.3.1. Automatización periódica con Cron y registro en el diario del sistema
En un entorno corporativo bastionado, confiar únicamente en revisiones manuales puntuales resulta insuficiente. Un atacante o un error de administración podría introducir una inconsistencia que pasaría inadvertida hasta la siguiente auditoría manual.
Para garantizar la supervisión continua, se debe configurar una tarea periódica diaria en /etc/cron.daily/audit-account-integrity que ejecute las comprobaciones y registre cualquier anomalía en syslog o en el diario de systemd mediante la utilidad logger:
sudo tee /etc/cron.daily/audit-account-integrity << 'EOF'
#!/bin/bash
# Auditoría diaria de integridad de cuentas y grupos (CIS Benchmark)
LOG_TAG="audit-account-integrity"
# Ejecutar validaciones en modo solo lectura
PWCK_OUTPUT=$(pwck -r 2>&1)
PWCK_STATUS=$?
GRPCK_OUTPUT=$(grpck -r 2>&1)
GRPCK_STATUS=$?
# Evaluar resultados y alertar en el diario si se detectan anomalías
if [ $PWCK_STATUS -ne 0 ]; then
logger -t "$LOG_TAG" -p auth.alert "ALERTA: Se detectaron inconsistencias en /etc/passwd o /etc/shadow: $PWCK_OUTPUT"
fi
if [ $GRPCK_STATUS -ne 0 ]; then
logger -t "$LOG_TAG" -p auth.alert "ALERTA: Se detectaron inconsistencias en /etc/group o /etc/gshadow: $GRPCK_OUTPUT"
fi
exit $((PWCK_STATUS + GRPCK_STATUS))
EOF
sudo chmod 750 /etc/cron.daily/audit-account-integrity
Para verificar el funcionamiento de la tarea programada y auditar las alertas registradas en el diario:
# Probar la ejecución manual del script
sudo /etc/cron.daily/audit-account-integrity
# Consultar si existen incidencias registradas en el diario
journalctl -t audit-account-integrity
|
Una vez estudiadas todas las medidas de bastionado del ciclo de vida de usuarios y grupos, puede consolidar sus competencias completando:
|
8. Ejercicios prácticos
Los ejercicios están diseñados para realizarse en orden sobre una máquina virtual Ubuntu/Debian de pruebas, ya que algunos reutilizan usuarios y grupos creados en ejercicios anteriores. El último ejercicio deja el sistema en su estado original.
|
No realice estos ejercicios en un servidor en producción. Algunos pasos simulan configuraciones inseguras de forma deliberada. |
| Nº | Ejercicio | Competencia que desarrolla |
|---|---|---|
1 |
Interpretar |
|
2 |
Comprender cómo se almacenan las contraseñas y el papel de la sal |
|
3 |
Crear cuentas con los atributos adecuados a su función |
|
4 |
Gestionar cambios en cuentas existentes sin inconsistencias |
|
5 |
Diferenciar el bloqueo de contraseña del bloqueo real de la cuenta |
|
6 |
Aplicar políticas de caducidad, expiración e inactividad |
|
7 |
Configurar cómo nacen las nuevas cuentas |
|
8 |
Organizar usuarios por funciones y delegar la gestión de grupos |
|
9 |
Detectar privilegios excesivos y delegar con mínimo privilegio |
|
10 |
Identificar técnicas de persistencia basadas en cuentas |
|
11 |
Eliminar cuentas sin dejar riesgos residuales |
|
12 |
Automatizar la verificación del bastionado de cuentas |
|
13 |
Revertir los cambios realizados durante la práctica |
8.1. Ejercicio 1. Exploración de los ficheros de cuentas
En un sistema multiusuario, la seguridad comienza por conocer quién existe en el sistema, qué privilegios tiene cada cuenta y cómo se protege su información.
Realice los siguientes pasos:
-
Muestra las primeras 10 líneas del archivo
/etc/passwde identifica los siete campos de una de ellas. -
Lista todos los usuarios con UID menor que 1000 junto con su shell asignado (campo 7).
-
Audita si existe alguna cuenta de sistema (UID entre 1 y 999) que disponga indebidamente de un shell interactivo (distinto de
nologin,falseosync). -
Comprueba los permisos, propietario y grupo de
/etc/passwd,/etc/shadow,/etc/groupy/etc/gshadow, e interpreta el resultado. -
Intenta visualizar
/etc/shadowsin privilegios de superusuario (deberías obtener “Permiso denegado”) y después consudo. -
Identifica qué algoritmo de hash se ha usado para la contraseña de tu propio usuario, a partir del prefijo del segundo campo de
/etc/shadow. -
Convierte el campo
lastchangede tu usuario en una fecha legible. -
Muestra tu grupo principal y tus grupos secundarios, y comprueba que tu entrada se obtiene igual con
grepque congetent. Explica en qué situación ambos comandos darían resultados distintos.
8.2. Ejercicio 2. Hash y sal de las contraseñas
Las contraseñas no se almacenan cifradas, sino como hash con sal. En este ejercicio comprobará experimentalmente para qué sirve la sal.
Realice los siguientes pasos:
-
Genera dos veces el hash SHA-512 de la contraseña
Bastionado2026conopenssl passwd -6. ¿Son iguales los resultados? ¿Por qué? -
Repite la operación fijando manualmente la sal
abcdefgh. ¿Qué ocurre ahora? -
Instala el paquete
whoisy genera un hash yescrypt conmkpasswd. Identifica en el resultado el identificador del algoritmo, los parámetros de coste y la sal. -
Comprueba qué algoritmo utiliza el sistema para las nuevas contraseñas, tanto en PAM como en
/etc/login.defs. ¿Cuál de los dos tiene prioridad al usarpasswd? -
Explica por qué la sal impide que un atacante use tablas precalculadas (rainbow tables) y por qué yescrypt es más resistente que SHA-512 a los ataques con GPU.
8.3. Ejercicio 3. Alta segura de cuentas interactivas y de servicio
Cada cuenta debe crearse con los atributos adecuados a su función: una persona necesita una shell y un directorio personal, pero un servicio no.
Realice los siguientes pasos:
-
Crea el usuario interactivo
prueba1con directorio personal, shell/bin/bashy el comentarioUsuario de prueba. -
Comprueba qué contiene el campo de contraseña de
prueba1en/etc/shadowantes de asignarle una contraseña. ¿Puede iniciar sesión? -
Asígnale una contraseña y obliga a que la cambie en su primer inicio de sesión.
-
Inicia sesión como
prueba1consu -y verifica que el sistema obliga a cambiar la contraseña. -
Crea la cuenta de servicio
appsvccomo cuenta del sistema, sin directorio personal creado, con directorio/var/lib/appsvcy shell/usr/sbin/nologin. -
Comprueba que su UID está por debajo de 1000 y que no tiene grupo privado con UID ≥ 1000.
-
Verifica que la cuenta
appsvcno permite una sesión interactiva, pero que sí puede ejecutar procesos (como haría un servicio).
8.4. Ejercicio 4. Valores por defecto: login.defs, useradd -D y /etc/skel
Garantizar que las nuevas cuentas nazcan con una configuración segura es más eficaz que corregirlas una a una después.
Realice los siguientes pasos:
-
Haz una copia de seguridad de
/etc/login.defsy de/etc/skel/.profile. -
Consulta los valores actuales de
PASS_MAX_DAYS,PASS_MIN_DAYS,PASS_WARN_AGE,HOME_MODE,UMASKyENCRYPT_METHOD. -
Modifica
/etc/login.defspara quePASS_MAX_DAYSvalga365yPASS_MIN_DAYSvalga1(valores CIS). SiHOME_MODEno está definido, añadeHOME_MODE 0750. -
Consulta los valores por defecto de
useraddy configura que las cuentas se desactiven 30 días después de caducar su contraseña. -
Inspecciona los archivos ocultos de
/etc/skely añade al final de/etc/skel/.profilela directivaumask 027. -
Crea el usuario
auditory verifica: permisos de su directorio personal, suumaskal iniciar sesión y su política de caducidad. -
Compara la salida de
sudo chage -l auditorcon la desudo chage -l prueba1. ¿Por qué los cambios enlogin.defsno han afectado aprueba1? -
Reflexiona: ¿puede
auditoreliminar la líneaumask 027de su.profile? ¿Qué mecanismo usarías para imponer la máscara a todos los usuarios de forma obligatoria?
8.5. Ejercicio 5. Modificación y renombrado de cuentas
En ocasiones es necesario ajustar cuentas existentes sin recrearlas, por ejemplo, al cambiar el nombre de un usuario. Hay que hacerlo con cuidado para no dejar inconsistencias.
Realice los siguientes pasos:
-
Crea el usuario
seguridadcon directorio personal, shell/bin/bashy contraseña. -
Renombra el usuario
seguridadaanalista. -
Cambia su directorio personal a
/home/analistamoviendo su contenido. -
Ejecuta
id analista. ¿Cómo se llama su grupo principal? Corrige la inconsistencia. -
Verifica los cambios en
/etc/passwdy comprueba el propietario, el grupo y los permisos de/home/analista. -
Cambia la shell de
analistaa/bin/shconchshy después restáurala a/bin/bash. ¿Qué requisito debe cumplir la shell elegida?
8.6. Ejercicio 6. Caducidad de contraseñas y cuentas temporales
Las cuentas temporales (becarios, auditores externos, contratistas) deben caducar automáticamente para que no queden habilitadas cuando ya no se necesitan.
Realice los siguientes pasos:
-
Aplica al usuario
analistauna caducidad de contraseña de 45 días con aviso 5 días antes, y verifica la configuración. -
Crea el usuario temporal
becariode forma que su cuenta expire dentro de 90 días y se desactive 15 días después de que caduque su contraseña. -
Asígnale una contraseña, fuerza el cambio en el primer inicio de sesión y verifica todos sus parámetros.
-
Localiza los campos correspondientes en la línea de
becariode/etc/shadowy relaciona cada uno con la salida dechage -l. -
Reflexiona: según NIST SP 800-63B, ¿tiene sentido obligar a cambiar la contraseña cada 45 días? ¿Y fijar una fecha de expiración para la cuenta del becario?
8.7. Ejercicio 7. Bloqueo parcial frente a bloqueo completo
Un error habitual es pensar que passwd -l impide por completo el acceso a una cuenta. En este ejercicio comprobará la diferencia entre deshabilitar la contraseña y bloquear la cuenta.
Realice los siguientes pasos:
-
Bloquea la contraseña de
analistaconpasswd -ly comprueba su estado conpasswd -S. -
Desde tu usuario, intenta iniciar sesión como
analistaconsu -. ¿Qué ocurre? -
Explica por qué este bloqueo no impide el acceso por SSH con clave pública en la configuración por defecto de Debian/Ubuntu.
+
Ampliación (si dispone de servidor SSH): antes del paso 1, copie una clave pública al usuario con ssh-copy-id analista@localhost y compruebe que, tras passwd -l, ssh analista@localhost sigue funcionando.
-
Aplica ahora un bloqueo completo haciendo que la cuenta haya expirado, y comprueba el resultado con
chage -l. -
Intenta de nuevo
su - analista(y, si hiciste la ampliación,ssh analista@localhost). ¿Qué mensaje aparece ahora? -
Desbloquea completamente la cuenta.
8.8. Ejercicio 8. Baja segura y reutilización de UID
Eliminar usuarios es parte del mantenimiento seguro del sistema, pero hacerlo sin precauciones puede dejar archivos huérfanos que acaban en manos de otro usuario.
Realice los siguientes pasos:
-
Crea el usuario
usuario3, anota su UID y crea comousuario3un fichero fuera de su directorio personal. -
Bloquea por completo la cuenta antes de eliminarla.
-
Comprueba que no tiene procesos en ejecución ni tareas programadas.
-
Localiza todos los archivos del usuario en el sistema y haz una copia de seguridad de su directorio personal en
/backup. -
Elimina la cuenta y su directorio personal, y comprueba que ya no existe.
-
Busca archivos huérfanos (sin usuario o sin grupo válido).
-
Crea un nuevo usuario
usuario4, consulta su UID y vuelve a listar/tmp/secreto_usuario3.txt. ¿Qué ha ocurrido? ¿Qué riesgo supone? -
Elimina el fichero
/tmp/secreto_usuario3.txt.
8.9. Ejercicio 9. Grupos, gpasswd y directorio compartido
En entornos reales se crean grupos para organizar usuarios por departamentos o funciones, y se delega su gestión en los responsables de cada equipo.
Realice los siguientes pasos:
-
Crea los grupos
soporte,redesytecnicos. -
Crea
usuario1(miembro desoporteytecnicos) yusuario2(miembro deredesytecnicos) en un solo comando cada uno. -
Nombra a
usuario1administrador del grupotecnicosy comprueba el cambio en/etc/gshadow. -
Actuando como
usuario1(y sin usarsudopara el comandogpasswd), añade aanalistaal grupotecnicos. -
Crea el directorio compartido
/srv/tecnicos, accesible solo pararooty los miembros del grupotecnicos. -
Comprueba que
usuario1puede crear un fichero en/srv/tecnicosy queauditorno puede. -
Renombra el grupo
redesacomunicacionesy verifica queusuario2sigue perteneciendo a él. -
Intenta eliminar el grupo
analista. ¿Por qué falla?
8.10. Ejercicio 10. Detección de una puerta trasera con UID 0
Una técnica habitual de persistencia tras comprometer un sistema consiste en crear una cuenta con un nombre aparentemente inofensivo (admin, support, toor…) y UID 0. En este ejercicio simulará el ataque y lo detectará como lo haría un auditor.
Realice los siguientes pasos:
-
(Simulación del atacante) Crea la cuenta
toorcon UID 0 y GID 0, usando/rootcomo directorio personal y sin crearlo. -
(Auditoría) Lista todas las cuentas con UID 0.
-
Detecta los UID duplicados del sistema.
-
Comprueba qué nombre de usuario muestra el sistema para los archivos de
rooty para tus procesos consudo. ¿Por qué podría pasar desapercibida la cuenta? -
Elimina la cuenta
toorsin borrar el directorio/root. Compruebe si tiene procesos asociados, deténgalos y proceda a la eliminación segura.+
No utilice nunca userdel -r en este caso: borraría el directorio /root. Además, si el usuario tuviera procesos activos en el sistema, userdel fallará a menos que se hayan terminado previamente sus procesos con pkill o se fuerce la baja con la opción -f.
8.11. Ejercicio 11. Auditoría de grupos privilegiados y sudo
Antes de aplicar medidas de bastionado, el administrador debe saber quién puede convertirse en root, ya sea a través de sudo o de grupos privilegiados.
Realice los siguientes pasos:
-
Lista los miembros de los grupos privilegiados
sudo,adm,docker,lxd,diskyshadow(algunos pueden no existir en tu sistema). -
Muestra las reglas activas de
/etc/sudoersy de/etc/sudoers.d/, sin comentarios ni líneas vacías. -
Consulta qué privilegios
sudotienen tu usuario yanalista. -
Añade a
analistaal gruposudo, comprueba de nuevo sus privilegios y, a continuación, revócalos. -
Crea con
visudoel fichero/etc/sudoers.d/soportepara que los miembros del gruposoportesolo puedan ejecutarsystemctl status sshcomoroot. Valida la sintaxis. -
Comprueba los privilegios resultantes de
usuario1y deusuario2. -
Busca en GTFOBins qué ocurriría si la regla anterior permitiera ejecutar
/usr/bin/lesso/usr/bin/finden lugar desystemctl status ssh.
8.12. Ejercicio 12. Controles CIS y script de auditoría
Las herramientas de verificación del sistema y los controles del CIS Benchmark permiten detectar corrupciones de archivos, identificadores duplicados, cuentas sin contraseña y membresías peligrosas. En este ejercicio los aplicará manualmente y después los automatizará.
Realice los siguientes pasos:
-
Ejecuta
pwckygrpcken modo solo lectura e interpreta los avisos. -
Comprueba los permisos de los archivos de cuentas y de sus copias de respaldo.
-
Verifica que el grupo
shadowno tiene miembros y que no existen UID, GID ni nombres duplicados. -
(Simulación) Elimina la contraseña de
prueba1conpasswd -d, detecta la cuenta sin contraseña conawky corrige el problema bloqueándola. -
Configura el cierre de sesión por inactividad (
TMOUT=900, de solo lectura) en/etc/profile.d/timeout.sh. Abre una nueva sesión de login y comprueba que no se puede desactivar conunset TMOUT. -
Escribe un script
auditoria_cuentas.shque ejecute los siguientes controles y muestreOKoALERTApara cada uno:-
Solo existe una cuenta con UID 0.
-
No hay cuentas sin contraseña.
-
No hay UID, GID ni nombres duplicados.
-
El grupo
shadowno tiene miembros. -
Ninguna cuenta de sistema (UID 1-999) tiene shell interactiva.
-
/etc/shadowy/etc/gshadowtienen permisos640o más restrictivos. -
Ningún directorio de
/homees accesible por “otros”. -
Lista de miembros de los grupos privilegiados.
-
8.13. Ejercicio 13. Limpieza del entorno
Para terminar, revierta los cambios realizados durante la práctica.
Realice los siguientes pasos:
-
Elimina los usuarios creados durante la práctica junto con sus directorios personales:
prueba1,appsvc,analista,becario,auditor,usuario1,usuario2yusuario4. -
Elimina los grupos
soporte,comunicacionesytecnicos, el directorio/srv/tecnicos, la regla/etc/sudoers.d/soportey la copia/backup/usuario3_backup.tar.gz. -
Restaura
/etc/login.defsy/etc/skel/.profilea partir de las copias de seguridad, y el valor por defecto deINACTIVEdeuseradd. -
Comprueba con
pwck,grpcky tu script de auditoría que el sistema queda en un estado coherente. Decide si quieres conservar/etc/profile.d/timeout.sh.Con la realización de estos ejercicios prácticos se consolidan los procedimientos esenciales de auditoría, administración segura y bastionado de cuentas y grupos locales en sistemas Linux, asegurando la integridad de los archivos de autenticación y el cumplimiento de las directrices del CIS Benchmark.
9. Licencia
Licencia CC BY-NC-ND 4.0
Esta página forma parte del curso Bastionado de Redes y Sistemas © 2026 de José Juan Sánchez Hernández y su contenido se distribuye bajo una licencia Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.
Esta licencia exige que quienes reutilicen el material otorguen el debido crédito al autor. Permite copiar y redistribuir el material en cualquier medio o formato, únicamente en su forma original, y solo para fines no comerciales.