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. |
-
Usuarios normales (UID ≥ 1000): Son las cuentas de personas que interactúan con el sistema.
-
Disponen de un directorio personal (
/home/usuario). -
Solo disponen de los permisos que les concede el DAC: control sobre sus propios recursos y acceso a los archivos que otros hayan hecho legibles, como
/etc/passwd. -
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
| Elemento | Significado |
|---|---|
|
Muestra las líneas de un archivo que cumplen un patrón |
|
Activa las expresiones regulares extendidas |
|
|
|
El operador |
|
Se recomienda la lectura de este tutorial sobre expresiones regulares y búsqueda de patrones con |
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 capítulo 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, useradd crea el grupo privado de cada cuenta nueva y, cuando se elimina un usuario con el comando userdel, el sistema también elimina 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. |
| Elemento | Significado |
|---|---|
|
Muestra las líneas de un archivo que cumplen un patrón |
|
Selecciona las líneas que empiezan por |
|
Archivo en el que se busca |
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 archivo 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 empieza por |
|
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. |
La orden date -d "1970-01-01 +20378 days" convierte esos días en una fecha legible:
| Elemento | Significado |
|---|---|
|
Muestra la fecha y la hora |
|
Indica una fecha concreta en lugar de la actual |
|
Suma 20378 días al origen de la época UNIX |
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 otros algoritmos como SHA-256 o SHA-512. -
$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.
|
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. Es muy rápido de calcular y no usa memoria, por lo que permite 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 de interacción segura con /etc/shadow
El archivo /etc/shadow nunca debe manipularse con editores de texto convencionales como nano o vim. Abrir el archivo directamente carece de mecanismos de bloqueo de concurrencia, lo que puede provocar condiciones de carrera y corromper la base de datos de credenciales si otro proceso modifica el archivo al mismo tiempo, por ejemplo un usuario que cambia su contraseña con passwd.
Para interactuar, auditar y modificar este archivo de forma segura, el sistema proporciona herramientas específicas:
-
Auditoría del estado de credenciales (
passwd -S):
Permite consultar el estado de la contraseña y sus parámetros de caducidad en una línea estructurada, sin exponer el hash criptográfico en pantalla. Combinado con la opción-a, audita todas las cuentas locales del sistema en una sola operación:sudo passwd -S maria sudo passwd -SaParámetro Significado -SMuestra el estado (status) de la contraseña de una cuenta en lugar de cambiarla. Sin esta opción,
passwd mariapediría una contraseña nueva-aAplica la consulta a todas las cuentas (all). Solo se usa junto con
-SReferencias
La salida tiene una línea por cuenta con este formato:
maria P 2026-10-19 7 90 14 30Los campos son, por orden: el nombre de la cuenta, el estado (
P,LoNP), la fecha del último cambio de contraseña y los valores demin,max,warneinactivede/etc/shadow(días mínimos entre cambios, días máximos de validez, días de aviso y días de inactividad).El estado puede tomar tres valores, según el contenido del campo de contraseña de
/etc/shadow:-
P, contraseña utilizable: El campo contiene un hash válido. La cuenta puede autenticarse con contraseña. -
L, contraseña bloqueada: El campo empieza por!, como ocurre traspasswd -lousermod -L, o vale*, como en la mayoría de las cuentas del sistema. Nadie puede autenticarse con contraseña, pero siguen siendo posibles otros métodos como las claves SSH. -
NP, sin contraseña: El campo está vacío. Cualquiera puede entrar en la cuenta sin autenticarse, por lo que es un riesgo crítico que debe corregirse de inmediato, por ejemplo bloqueando la cuenta conpasswd -lo asignándole una contraseña.
-
-
Verificación de integridad referencial (
pwck -r):
Este comando verifica que todas las entradas de/etc/passwdy/etc/shadowtienen el formato adecuado y contienen datos válidos, y propone eliminar las que están mal formadas o tienen errores que no se pueden corregir. La opción-rlo ejecuta en solo lectura, de modo que no modifica los archivos.sudo pwck -rLas comprobaciones sobre
/etc/shadowse activan porque ese archivo existe en el sistema. En total, el comando verifica:Archivo Comprueba que /etc/passwdCada entrada tiene el número correcto de campos
/etc/passwdEl nombre de usuario es único y válido
/etc/passwdEl identificador de usuario y el de grupo son válidos
/etc/passwdEl grupo principal es válido
/etc/passwdEl directorio personal es válido
/etc/passwdEl intérprete de comandos es válido
/etc/shadowCada entrada de
passwdtiene su entrada enshadow, y viceversa/etc/shadowLas contraseñas están almacenadas en
shadow/etc/shadowLas entradas tienen el número correcto de campos y no se repiten
/etc/shadowLas fechas del último cambio de contraseña no están en el futuro
Referencias
-
Edición segura con bloqueo exclusivo (
vipw -s):
Bloquea el acceso al archivo creando el cerrojo/etc/shadow.lock, el cual almacena el identificador de proceso (PID) para impedir modificaciones simultáneas por otros programas, y genera la copia temporal/etc/shadow.editsobre la que opera el editor. Una vez guardado y cerrado el editor, aplica los cambios de forma atómica sobre el archivo definitivo y preserva los permisos640y el grupo propietarioshadow.vipwno valida el contenido: acepta líneas con un formato incorrecto y solo recuerda que puede ser necesario revisar el archivo relacionado, por lo que tras editarlo conviene ejecutarsudo pwck -rosudo grpck -r. Para editar/etc/gshadowse emplea de forma análogasudo vigr -s, generando/etc/gshadow.locky/etc/gshadow.edit.sudo vipw -sOrden Archivo que edita vipw/etc/passwdvipw -s/etc/shadow, porque-s(shadow) cambia el archivo de destinovigr/etc/groupvigr -s/etc/gshadowReferencias
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 para Ubuntu Linux incluye una recomendación específica para cada una de estas copias (/etc/passwd-, /etc/group-, /etc/shadow- y /etc/gshadow-) con los mismos permisos máximos 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-
| Orden | Significado |
|---|---|
|
|
|
|
Ambas órdenes admiten varios archivos a la vez, por lo que cada línea trata el archivo original y su copia con sufijo -. Los permisos se estudian en el capítulo de permisos y control de acceso básico.
|
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). |
|
|
Referencias |
3.1.2. Opciones principales de adduser
adduser acepta opciones con nombre largo, más legibles que las abreviaturas de useradd, y lee sus valores por defecto de /etc/adduser.conf. Por eso no necesita -m: crea el directorio personal por sí solo. Sin opciones, sudo adduser juan crea la cuenta con su grupo privado y su directorio personal, y pide la contraseña y los datos del campo GECOS.
| Parámetro | Función | Equivalente en useradd |
|---|---|---|
|
No pide la contraseña y deja la cuenta sin ella: no se puede entrar con contraseña, pero sí con otros métodos como las claves SSH |
(sin equivalente directo) |
|
No ejecuta |
(sin equivalente directo) |
|
Crea una cuenta del sistema, sin contraseña y con |
|
|
Usa un grupo existente como grupo principal en lugar de crear uno privado |
|
|
Rellenan el campo GECOS, el intérprete, el directorio personal y el UID |
|
|
Referencias |
Además de crear cuentas, adduser añade un usuario existente a un grupo existente con la forma adduser usuario grupo:
sudo adduser juan soporte
3.1.3. 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
| Parámetro | Efecto |
|---|---|
|
Asigna un UID del rango de sistema |
|
No crea el directorio personal, ni siquiera en |
|
Anota esa ruta como directorio personal en |
|
Impide el inicio de sesión interactivo y muestra el mensaje «This account is currently not available» |
|
Rellena el campo GECOS con una descripción de la cuenta |
Como useradd no muestra ninguna salida cuando termina bien, el resultado se verifica con dos órdenes:
getent passwd appsvc
sudo passwd -S appsvc
getent passwd muestra la entrada de la cuenta a través de NSS (Name Service Switch), la capa de consulta de identidades que se estudia en el apartado 6.3. Permite comprobar que el UID queda por debajo de UID_MIN, que el directorio personal es el indicado con -d y que el intérprete es /usr/sbin/nologin.
passwd -S muestra el estado de la contraseña sin exponer el hash, y requiere sudo porque lee /etc/shadow. El estado esperado es L, que indica que no existe una contraseña con la que autenticarse. Si apareciera NP, la cuenta no tendría contraseña y sería una puerta de acceso abierta.
Por último, conviene comprobar las dos caras de una cuenta de servicio, que no admite una sesión interactiva pero sí ejecuta procesos:
# Intenta abrir una sesión de login. Con sudo no se pide contraseña,
# pero el intérprete nologin rechaza la sesión
sudo su - appsvc
# Ejecuta una orden con la identidad de la cuenta, sin abrir ninguna shell
sudo -u appsvc id
La primera orden termina con el mensaje «This account is currently not available», porque su - necesita el intérprete que figura en /etc/passwd y ese intérprete, /usr/sbin/nologin, se limita a mostrar ese aviso y salir. La segunda, en cambio, muestra el UID, el GID y los grupos de appsvc, ya que sudo -u ejecuta el programa directamente con esa identidad sin pasar por la shell de inicio de sesión.
Esta es la misma situación de un servicio gestionado por systemd con la directiva User=appsvc, que arranca el ejecutable con esa identidad sin consultar en ningún momento el campo de intérprete de la cuenta. Por eso nologin cierra la vía interactiva sin impedir que la cuenta cumpla su función.
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.
Si ejecutamos el siguiente comando se mostrarán cuáles son los valores que se aplicarán por defecto:
sudo useradd -D
Una posible salida de ejemplo es la siguiente:
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
LOG_INIT=yes
Cada línea es una variable de /etc/default/useradd:
| Variable | Significado | Valor del ejemplo |
|---|---|---|
|
GID del grupo principal por defecto. Solo se usa cuando las cuentas no reciben un grupo privado. Con |
|
|
Directorio base en el que se crean los directorios personales, de modo que el de |
|
|
Días de gracia tras caducar la contraseña antes de desactivar la cuenta. El valor |
|
|
Fecha de expiración que reciben las cuentas nuevas. Si está vacía, no caducan |
vacío |
|
Intérprete de comandos por defecto cuando no se indica |
|
|
Directorio plantilla cuyos archivos se copian al directorio personal de la cuenta nueva, como se explica en el apartado 3.2.1 |
|
|
Indica si se crea el buzón de correo de la cuenta |
|
|
Indica si la cuenta se registra en las bases de datos de último acceso y de intentos fallidos, |
|
El archivo /etc/default/useradd solo es legible por root. Sin sudo, useradd -D no puede leerlo y muestra los valores de compilación en lugar de los configurados, por lo que una consulta sin privilegios puede dar una imagen falsa de la política vigente.
| Orden | Efecto |
|---|---|
|
|
|
Modifica de forma persistente el valor de |
|
Restaura el valor original, que desactiva la inactividad |
Las variables de /etc/login.defs, como PASS_MAX_DAYS, HOME_MODE o UMASK, no son retroactivas: solo se aplican a las cuentas que se creen después de modificarlas. Sus valores se detallan en el ejercicio 4.
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).
Los archivos de inicio de la shell
En Ubuntu 24.04, /etc/skel contiene tres archivos ocultos, cuyo nombre empieza por punto. Son scripts que la shell Bash ejecuta automáticamente en momentos distintos:
| Archivo | Cuándo se ejecuta | Contenido habitual |
|---|---|---|
|
Al iniciar una sesión de login, como una consola, una conexión SSH o |
Variables de entorno como |
|
Cada vez que se abre una shell interactiva que no es de login, como una terminal gráfica |
Alias, aspecto del prompt, historial y autocompletado |
|
Al cerrar una sesión de login |
Tareas de limpieza, como borrar la pantalla |
Como los usuarios pueden editar estos archivos, una configuración de seguridad que dependa solo de ellos puede ser eliminada, como se explica más abajo.
La máscara umask
La máscara de creación de archivos o umask indica qué permisos se quitan a los archivos y directorios nuevos. Los permisos de partida son 666 en los archivos, porque no se crean ejecutables, y 777 en los directorios. A cada uno se le retiran los bits que la máscara tiene activos, de modo que la máscara 027 quita la escritura al grupo y todos los permisos a otros.
umask |
Archivos nuevos | Directorios nuevos | Efecto |
|---|---|---|---|
|
|
|
Todo el sistema puede leer y recorrer lo que crea el usuario |
|
|
|
El grupo también puede escribir. Es el valor efectivo en Ubuntu para cuentas con grupo privado |
|
|
|
El grupo puede leer, y el resto de usuarios queda sin acceso. Es la máscara que recomienda el CIS Benchmark |
|
|
|
Solo el propietario accede |
La orden umask, sin argumentos, muestra la máscara de la shell actual, y umask 027 la cambia solo para esa sesión. Para que se aplique siempre, debe fijarse en un script de inicio, como el .profile de /etc/skel, o de forma global con la directiva UMASK de /etc/login.defs, que el módulo pam_umask aplica en cada inicio de sesión. En Ubuntu 24.04, UMASK vale 022, pero con USERGROUPS_ENAB yes y un grupo privado la máscara efectiva es 002. El capítulo de permisos y control de acceso básico estudia los permisos con más detalle.
|
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 solo los directorios detectados, quitando la escritura de grupo y todo el acceso de otros
sudo find /home -maxdepth 1 -mindepth 1 -type d -perm /027 -exec chmod g-w,o-rwx {} +
El comando de auditoría se descompone de la siguiente manera:
| Elemento | Función |
|---|---|
|
Permite recorrer directorios personales que el usuario actual no puede leer |
|
Inicia la búsqueda en |
|
No desciende más de un nivel por debajo de |
|
Descarta el propio |
|
Selecciona únicamente directorios y descarta los archivos sueltos que pudiera haber en |
|
Selecciona los directorios en los que al menos uno de los bits indicados esté activo |
|
Muestra cada resultado con el formato de |
La máscara 027 se interpreta por clases. Con el prefijo /, find selecciona los permisos que superan el valor 750 recomendado:
| Clase | Dígito | Bits que se comprueban | Se detecta cuando |
|---|---|---|---|
Propietario |
|
Ninguno |
Nunca: el propietario puede tener cualquier permiso |
Grupo |
|
Escritura |
El grupo puede escribir en el directorio |
Otros |
|
Lectura, escritura y ejecución |
Otros usuarios tienen cualquier permiso |
Por ejemplo, 700, 740 y 750 no aparecen en la lista, mientras que 751, 755 y 770 sí. El prefijo / no debe confundirse con - delante de la máscara, ya que -perm -027 exige que todos los bits estén activos y -perm 027 exige una coincidencia exacta.
La orden de corrección repite el mismo filtro y sustituye -ls por una acción:
| Elemento | Función |
|---|---|
|
Ejecuta |
|
Representa la lista de resultados |
|
Los agrupa en una sola invocación en lugar de lanzar un |
|
Quita la escritura al grupo y todos los permisos a otros |
Se utiliza el modo simbólico g-w,o-rwx en lugar de fijar 750 porque solo retira permisos. Un chmod 750 aplicado a todos los directorios habría ampliado el acceso del grupo en los que ya estaban en 700, y habría alcanzado también a directorios que no son personales, como lost+found.
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:
sudo usermod -d /home/nuevo -m usuario -
Cambiar el nombre de usuario (login):
sudo usermod -l nuevo_nombre antiguo_nombre -
Añadir a grupos secundarios:
sudo usermod -aG docker,soporte usuario
| Parámetro | Significado |
|---|---|
|
Establece un nuevo directorio personal (directory). Por sí solo solo cambia la ruta anotada en |
|
Mueve (move) el contenido del directorio personal antiguo al nuevo. Solo tiene efecto junto con |
|
Cambia el nombre de inicio de sesión (login). No renombra ni el grupo principal ni el directorio personal |
|
Define los grupos secundarios del usuario, separados por comas y sin espacios |
|
Añade (append) los grupos de |
|
Cambia el grupo principal del usuario |
|
Cambia el intérprete de comandos de la cuenta |
Las opciones -l y -d no se pueden aplicar mientras la cuenta tenga procesos en ejecución: usermod se niega y muestra el PID que lo impide. Cierre antes las sesiones del usuario o realice el cambio desde otra cuenta administrativa, nunca desde la propia sesión que se va a renombrar. Tras renombrar una cuenta, revise también las referencias al nombre antiguo en /etc/sudoers.d/, en las directivas AllowUsers de SSH y en las tareas programadas.
|
Atención al modificar grupos con usermod Es imprescindible incluir la opción |
|
Referencias |
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 Algunas distribuciones basadas en Red Hat incluyen
La orden no debe devolver ninguna línea. |
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. |
|
Referencias |
Los valores de PASS_MAX_DAYS, PASS_MIN_DAYS y PASS_WARN_AGE de /etc/login.defs se copian a /etc/shadow al crear la cuenta. Modificarlos no cambia las cuentas existentes, que deben ajustarse una a una con chage. Para auditar qué cuentas con contraseña no caducan nunca o superan los 365 días de vigencia:
sudo awk -F: '$2 !~ /^[!*]/ && ($5 == "" || $5 > 365) {print $1 " -> " $5}' /etc/shadow
| Elemento | Significado |
|---|---|
|
Usa los dos puntos como separador de campos |
|
Descarta las cuentas sin contraseña utilizable, cuyo segundo campo empieza por |
|
Selecciona las cuentas cuyo quinto campo, los días máximos de validez, está vacío o supera 365 |
|
Muestra el nombre de la cuenta y su valor de |
Un valor vacío o 99999 indica que la contraseña no caduca.
|
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). -l (lock) antepone ! al hash
sudo passwd -l maria
# Bloqueo completo de cuenta (CIS Benchmark)
sudo usermod -L -e 1 maria
El bloqueo completo combina dos parámetros de usermod, cada uno con un efecto distinto sobre /etc/shadow:
| Parámetro | Campo de /etc/shadow que modifica |
Efecto |
|---|---|---|
|
Segundo campo, el hash de la contraseña |
Antepone |
|
Octavo campo, la fecha de expiración de la cuenta |
Fija la expiración en el día |
La fecha de expiración de -e admite un número de días desde 1970 o una fecha con formato AAAA-MM-DD, y es la que impide el acceso por cualquier método, porque la comprueba el módulo pam_unix en la fase account, con independencia de cómo se autenticara la persona. Se puede comprobar el resultado con sudo chage -l maria, que mostrará Account expires : Jan 02, 1970.
|
La trampa del bloqueo con passwd -l
|
El papel de UsePAM
Que la clave siga funcionando depende de la directiva UsePAM de sshd, que indica si el servidor consulta a PAM. El valor por defecto de OpenSSH es no, pero Debian y Ubuntu distribuyen /etc/ssh/sshd_config con UsePAM yes. El comportamiento, probado con OpenSSH 9.6 de Ubuntu 24.04 y una clave pública válida, es el siguiente:
| Estado de la cuenta | UsePAM yes |
UsePAM no |
|---|---|---|
Sin bloquear |
Acceso concedido |
Acceso concedido |
Solo |
Acceso concedido |
Acceso denegado |
Solo expiración, con |
Acceso denegado |
Acceso denegado |
Bloqueo completo, |
Acceso denegado |
Acceso denegado |
-
Con
UsePAM yes:sshdverifica por sí mismo la firma de la clave y después consulta a PAM las fasesaccountysession. La faseaccountdepam_unixcomprueba las fechas de caducidad de los campos 5 a 8 de/etc/shadow, pero no el!del hash, de modo que el bloqueo parcial pasa desapercibido. -
Con
UsePAM no:sshdno usa PAM y aplica sus propias comprobaciones sobre/etc/shadow, entre ellas el!y la expiración, por lo que el bloqueo parcial sí impide el acceso.
La solución: expirar la cuenta
Para impedir nuevos accesos por cualquier método y con independencia de UsePAM, se debe hacer expirar la cuenta con usermod -L -e 1, que establece la fecha de expiración en el 2 de enero de 1970. Con UsePAM yes, es PAM quien rechaza el acceso, incluidas las claves SSH. El cliente recibe el mensaje «Your account has expired; please contact your system administrator» antes de que se cierre la conexión, y el motivo queda registrado en el diario de autenticación. Con UsePAM no, lo rechaza sshd y el cliente solo ve «Permission denied (publickey)».
El bloqueo, parcial o completo, no cierra las sesiones que el usuario ya tuviera abiertas, porque solo impide nuevas autenticaciones. Para comprobar el estado de la cuenta y cerrar las sesiones vigentes:
sudo passwd -S maria
sudo loginctl terminate-user maria
| Orden | Función |
|---|---|
|
Muestra el estado de la contraseña. |
|
Confirma la fecha de expiración de la cuenta |
|
Cierra todas las sesiones de la cuenta y termina sus procesos |
|
Aplique |
|
Demostración Puede comprobar esta diferencia de forma práctica en la demostración de bloqueo parcial frente a bloqueo completo de cuentas, que reproduce la trampa conectando por SSH desde el anfitrión a una instancia de OpenStack. |
Para reactivar una cuenta completamente bloqueada:
sudo usermod -U -e "" maria
La reactivación revierte cada uno de los dos efectos del bloqueo completo:
| Parámetro | Campo de /etc/shadow que modifica |
Efecto |
|---|---|---|
|
Segundo campo, el hash de la contraseña |
Elimina el |
|
Octavo campo, la fecha de expiración de la cuenta |
Deja el campo vacío, lo que equivale a una cuenta sin fecha de expiración. Es equivalente a |
Tras la reactivación, sudo chage -l maria muestra Account expires : never.
|
Si la cuenta no tenía contraseña antes del bloqueo y su hash era solo |
Auditoría de cuentas bloqueadas o deshabilitadas con awk
El siguiente comando lista las cuentas cuya autenticación por contraseña está deshabilitada, es decir, las que tienen un ! o un * al inicio del segundo campo de /etc/shadow:
sudo awk -F: '$2 ~ /^(\*|!)/ {print $1 " -> Contraseña deshabilitada"}' /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. |
Esta comprobación solo examina el segundo campo. Por eso detecta que la contraseña está deshabilitada, pero no distingue entre bloqueo parcial y completo, ni detecta las cuentas bloqueadas únicamente por caducidad. Además, * y ! no siempre indican un bloqueo aplicado por el administrador. En las cuentas del sistema significan que nunca tuvieron contraseña.
|
Ejercicio de investigación propuesto Se propone como ejercicio la búsqueda de la expresión correcta del comando |
|
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. El orden es importante. La cuenta se bloquea en primer lugar para que nadie pueda abrir una sesión nueva ni un proceso pueda relanzarse mientras se limpia el resto.
-
Bloquear la cuenta de forma completa:
sudo usermod -L -e 1 maria -
Terminar procesos y sesiones activas:
# Sesiones abiertas de maria who | grep maria # PID de todos sus procesos en ejecución pgrep -u maria # Termina todos sus procesos con la señal SIGTERM sudo pkill -u maria # Si siguen en ejecución tras unos segundos, los fuerza con SIGKILL sudo pkill -9 -u maria # Lista los trabajos programados con at, si el paquete está instalado sudo atq # Desactiva sus sesiones persistentes de systemd sudo loginctl disable-linger maria # Elimina sus tareas programadas con cron. No muestra error si no tiene sudo crontab -u maria -r 2>/dev/nullOrden Significado who | grep mariawholista las sesiones abiertas. La tubería|pasa esa lista agrep, que muestra solo las líneas que contienenmariapgrep -u mariapgrepbusca procesos y muestra su número (PID).-u marialimita la búsqueda a los procesos de esa cuentapkill -u mariapkillenvía una señal a los procesos que cumplen el criterio, aquí los demaria. Por defecto esSIGTERM, una petición de terminación que un proceso puede ignorarpkill -9 -u maria-9envíaSIGKILL, que el proceso no puede ignorar. Úsela sipgrep -u mariasigue devolviendo PIDatqLista los trabajos programados con
at. Comorootmuestra los de todos los usuarios, por lo que debe buscar los demaria. Breve tutorial sobreatloginctl disable-linger mariaImpide que los servicios de usuario de
mariasigan ejecutándose sin que tenga una sesión abierta. Referencia deloginctlcrontab -u maria -rcrontabgestiona las tareas programadas.-u mariaindica de qué usuario y-r(remove) las elimina2>/dev/nullDescarta los mensajes de error (salida
2) enviándolos a/dev/null, un archivo especial que descarta todo lo que recibe -
Hacer copia de seguridad y rastrear archivos:
# Directorio de destino accesible solo por root sudo install -d -m 700 /backup # Copia comprimida de su directorio personal sudo tar -czvf /backup/maria_backup.tar.gz /home/maria # Restringe los permisos de la copia sudo chmod 600 /backup/maria_backup.tar.gz # Lista sus archivos, sin entrar en otros sistemas de archivos montados sudo find / -xdev -user maria -ls 2>/dev/nullElemento Significado install -d -m 700install -dcrea el directorio indicado y-m 700le asigna esos permisos, de modo que solorootaccede a las copiastar -czvftaragrupa varios archivos en uno solo.-ccrea (create) el archivo,-zlo comprime con gzip,-vmuestra los archivos que procesa (verbose) y-findica el nombre del archivo de salida, que va a continuaciónchmod 600La copia contiene datos personales y credenciales como las claves de
~/.ssh, por lo que solo su propietario puede leerla y modificarla. Debe destruirse cuando deje de ser necesariafind / -user mariafindbusca archivos. Se parte de/y-user mariaselecciona los que pertenecen a esa cuenta-xdevNo entra en directorios de otro sistema de archivos. Desde
/omite/proc,/sysy/dev, los volúmenes montados bajo/mnto/mediay las unidades de red. Así evita cientos de entradas de/proc, una por cada proceso de la cuenta, y acorta la búsqueda de forma notable-lsMuestra cada resultado con el formato de
ls -dils2>/dev/nullDescarta los mensajes de error
Como
-xdevno entra en otros sistemas de archivos, la búsqueda no encuentra los archivos demariaque estén en un disco montado aparte, como una partición independiente de/homeo/var. Esos archivos deben buscarse indicando su punto de montaje. -
Eliminar la cuenta y su directorio:
sudo userdel -r maria getent passwd mariaOrden Función userdel -r mariaElimina la cuenta, y
-r(remove) elimina también su directorio personal y su buzón de correo. Se niega a actuar si la cuenta tiene procesos activosgetent passwd mariaComprueba el resultado y no debe devolver ninguna línea
Por último, retire las referencias a la cuenta en
/etc/sudoers.d/, en las directivasAllowUsersde SSH y en los sistemas externos que la usaran.
|
Peligro de reutilización de UID y archivos huérfanos Al eliminar una cuenta con Si no se indica
Los archivos encontrados deben reasignarse a una cuenta responsable o eliminarse, por ejemplo con |
|
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
Igual que ocurre con las cuentas de usuario, existen dos formas de crear grupos, una de bajo nivel y otra de alto nivel, según se explicó en el apartado 3.1:
-
groupadd(bajo nivel): Binario estándar disponible en todas las distribuciones Linux. Opera exactamente según los parámetros especificados y no hace preguntas, por lo que se recomienda en scripts y automatizaciones. -
addgroup(alto nivel): Script de Debian, Ubuntu y derivadas que acompaña aadduser. Hace lo mismo quegroupaddcon una sintaxis de opciones largas más legible y mensajes informativos, por lo que resulta cómodo en la administración manual.
Con groupadd, la creación de un grupo se escribe así:
sudo groupadd proyectos
sudo groupadd -g 1050 desarrollo
| Parámetro | Función |
|---|---|
|
Asigna un GID numérico específico. Así, |
|
Crea un grupo del sistema, con un GID inferior a 1000 |
Si no se indica un GID, groupadd asigna el siguiente libre por encima de GID_MIN, definido en /etc/login.defs.
|
Referencias |
Con addgroup, en Debian y Ubuntu, las mismas operaciones se escriben así:
sudo addgroup soporte
sudo addgroup --gid 1050 desarrollo
sudo addgroup --system servicios
| Orden | Equivalente con groupadd |
Función |
|---|---|---|
|
|
Crea un grupo normal con el siguiente GID libre |
|
|
|
|
|
|
|
Referencias |
4.1.2. Modificar grupos: groupmod
Permite actualizar las propiedades de un grupo existente:
# Cambiar el nombre del grupo
sudo groupmod -n seguridad desarrollo
# Cambiar el GID
sudo groupmod -g 1100 seguridad
| Parámetro | Función |
|---|---|
|
Indica el nuevo nombre (new name), que va antes del nombre actual |
|
Establece un nuevo GID |
En ambos casos el último argumento es el grupo que se modifica.
|
Referencias |
|
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.
|
Referencias |
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 |
|
Referencias |
4.3. Trabajo colaborativo y consistencia de grupos
Para consultar las membresías de un usuario se utilizan las utilidades estándar id y groups.
id juan
groups juan
| Orden | Salida |
|---|---|
|
El UID, el GID y todos los grupos de |
|
Solo los nombres de sus grupos |
Sin argumento, ambas órdenes consultan al usuario que las ejecuta.
|
Referencias |
|
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 archivos 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 Debian, |
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. Archivos de configuración y visudo
sudo decide quién puede ejecutar qué, y como quién, leyendo un conjunto de reglas que se guardan en /etc/sudoers y en el directorio /etc/sudoers.d/. Como un error en estos archivos puede dejar sin acceso administrativo al sistema, se modifican siempre con 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. -
/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, por ejemplo:sudo visudo -f /etc/sudoers.d/10-soporte. Los archivos se procesan por orden alfabético, por eso se usan prefijos numéricos con la misma cantidad de dígitos, como10-soportey90-cloud-init-users. Además,sudoignora los archivos cuyo nombre contiene un punto o termina en~, de modo que una regla guardada comosoporte.confno se aplica, y un archivo nuevo debe tener modo0440, que se fija consudo chmod 440.
La sintaxis de una directiva es la siguiente:
quién dónde=(como_quién) qué_comandos
| Campo | Significado | Ejemplos |
|---|---|---|
|
Usuario o grupo al que se aplica la regla. Un grupo se escribe con el prefijo |
|
|
Equipo en el que se evalúa la regla, no desde el que se conecta el usuario. |
|
|
Usuario, y opcionalmente grupo, con cuya identidad se ejecutan las órdenes. Si se omite, es |
|
|
Órdenes permitidas, con la ruta completa y sus argumentos. Se pueden separar varias con comas |
|
Ejemplo de delegación con mínimo privilegio
En este ejemplo se define una regla que permite a los miembros del grupo soporte reiniciar el servicio SSH de Debian y Ubuntu, solicitándoles su propia contraseña, sin concederles ningún otro permiso de root:
%soporte ALL=(root) /usr/bin/systemctl restart ssh
| Elemento | Campo | Significado |
|---|---|---|
|
|
Grupo |
|
|
Equipos en los que se aplica la regla. |
|
|
La orden se ejecuta con los privilegios de |
|
|
Orden permitida, con su ruta completa y sus argumentos. Al fijar los argumentos, solo se permite exactamente esa combinación: |
Para comprobar la regla una vez instalada, sudo visudo -c valida la sintaxis de todos los archivos y sudo -l -U usuario muestra los privilegios que recibe un miembro de soporte.
Cómo se combinan varias reglas: un ejemplo real
Una cuenta suele recibir privilegios de varias reglas a la vez y sudo -l muestra el resultado combinado. En una imagen de Ubuntu para entornos de nube, como las que usa OpenStack, la cuenta ubuntu produce esta salida:
(ALL : ALL) ALL
(ALL) NOPASSWD: ALL
| Línea de la salida | Origen | Significado |
|---|---|---|
|
|
Como |
|
|
Puede ejecutar cualquier orden como cualquier usuario sin contraseña |
Cuando varias reglas coinciden, sudo aplica la última que encaja, de modo que la regla con NOPASSWD: prevalece y ubuntu obtiene root sin que se le pida ninguna credencial. Es una configuración aceptable en una máquina virtual de laboratorio, donde ubuntu es la cuenta administrativa de la imagen, pero en un servidor real elimina la barrera descrita en el siguiente aviso.
|
Configuraciones peligrosas en sudoers
|
|
Demostración Puede comprobar este riesgo de forma práctica en la demostración de escalada de privilegios con sudo y GTFOBins, que reproduce el escape a una shell de |
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 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. |
Parámetros de coste (j9T)
La cadena j9T codifica los parámetros de configuración: j selecciona el modo estándar recomendado con memoria de lectura y escritura, 9 fija un coste \(N = 4096\) y T un tamaño de bloque \(r = 32\).
6.1.2. Funciones resistentes a memoria (Memory-Hard)
Los algoritmos tradicionales como SHA-512 son muy rápidos y casi no demandan memoria RAM, lo que beneficia al atacante: una GPU o un ASIC calcula miles de millones de hashes por segundo. yescrypt es una función memory-hard: cada verificación exige un búfer de \(128 \times r \times N = 16.777.216\) bytes, es decir, unos 16 MiB. Para un usuario que inicia sesión es imperceptible, pero para un atacante que evalúa millones de combinaciones satura la memoria y el ancho de banda de los aceleradores, y elimina su ventaja económica.
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: Fija el algoritmo para las herramientas que no delegan en PAM. En Debian y Ubuntu,passwd,chpasswdynewuserssí lo hacen, de modo que el valor de PAM prevalece sobreENCRYPT_METHOD. En Ubuntu 24.04, conENCRYPT_METHOD SHA512en/etc/login.defs, tantochpasswdcomonewusersgeneran hashes$y$. Para fijar otro algoritmo en una ejecución concreta,chpasswdadmite la opción-c, por ejemplochpasswd -c SHA512. Una configuración coherente es:ENCRYPT_METHOD YESCRYPT YESCRYPT_COST_FACTOR 5La directiva
YESCRYPT_COST_FACTORpermite graduar el coste entre los niveles 1 y 11, siendo 5 el valor que se aplica si no se especifica. En Ubuntu 24.04 aparece comentada en/etc/login.defs, y el sistema usa ese valor implícito.
|
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
Es el mismo esquema que en la auditoría de cuentas bloqueadas con otro patrón:
| Elemento | Significado |
|---|---|
|
Usa los dos puntos como separador de campos |
|
Selecciona los registros cuyo segundo campo, el hash, empieza por |
|
Muestra el nombre de la cuenta y los tres primeros caracteres del hash, es decir, el prefijo que identifica el algoritmo. |
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" doneElemento Función for usuario in …; do …; doneRepite la orden
chagepara cada nombre de la lista$(…)Ejecuta el
awky sustituye la expresión por su salida, que es la lista de cuentas afectadasusuarioVariable que toma uno de esos nombres en cada vuelta
chage -d 0Fija la fecha del último cambio en 0 (date), lo que obliga a cambiar la contraseña en el siguiente inicio de sesión
-
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 configurado en PAM, es decir, yescrypt en las distribuciones actuales:echo "servicio_backup:ClaveComplejaGenerada2026!" | sudo chpasswdElemento Función chpasswdLee de la entrada estándar líneas con el formato
usuario:contraseñay establece esas contraseñasecho "…" | sudo chpasswdLa tubería
|alimenta achpasswdcon la salida deechoLa cuenta debe existir previamente, porque en caso contrario
chpasswdno aplica ningún cambio. Para verificar el resultado, compruebe que el prefijo es$y$:sudo grep '^servicio_backup:' /etc/shadow | cut -d: -f2 | cut -c1-3
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. useradd reparte estos rangos de forma consecutiva según las variables SUB_UID_MIN, SUB_UID_MAX y SUB_UID_COUNT de /etc/login.defs, y sus equivalentes SUB_GID_*. En Ubuntu 24.04 empiezan en 100000 y asignan 65.536 identificadores a cada cuenta.
6.2.1. Propósito de seguridad
Estos archivos 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.2.2. Verificación y auditoría
Para consultar el rango asignado a una cuenta:
grep '^maria:' /etc/subuid /etc/subgid
Al indicar dos archivos, grep antepone a cada resultado el nombre del archivo en el que lo encontró, de modo que se ven los dos rangos a la vez.
userdel elimina las entradas de la cuenta, pero usermod -l no las renombra: el rango sigue asociado al nombre antiguo y queda huérfano cuando la cuenta se elimina con su nuevo nombre. Si después se crea otra cuenta con ese nombre, useradd le asigna un rango nuevo, pero la entrada antigua sigue a su nombre, por lo que la cuenta nueva recibe también el rango anterior y puede acceder a los archivos que dejaron los contenedores de la cuenta eliminada. Para detectar entradas cuyo usuario ya no existe:
for f in /etc/subuid /etc/subgid; do
cut -d: -f1 "$f" | while read -r u; do
getent passwd "$u" >/dev/null || echo "$f: $u no existe"
done
done
| Elemento | Función |
|---|---|
|
Repite la comprobación para los dos archivos |
|
Extrae el primer campo de cada línea, el nombre de la cuenta |
|
Lee esos nombres uno a uno en la variable |
|
Busca la cuenta y descarta la salida, porque solo interesa si existe |
|
Si |
La salida debe estar vacía. Las entradas huérfanas se eliminan editando ambos archivos como root.
|
Ubuntu 24.04 añade una protección adicional: con |
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. El servicio que conecta el sistema con ellos es el System Security Services Daemon (SSSD), que consulta el directorio remoto, guarda en caché las respuestas y se las entrega a NSS como si fueran una fuente local más.
El NSS (Name Service Switch) es el mecanismo de las bibliotecas del sistema que permite a los programas obtener información de nombres, como usuarios, grupos o equipos, sin saber de dónde procede. Cuando un programa consulta una cuenta, NSS recorre las fuentes configuradas en /etc/nsswitch.conf, en el orden indicado, hasta encontrar una respuesta:
passwd: files systemd sss
group: files systemd sss
shadow: files sss
Cada línea asocia una base de datos con una lista ordenada de fuentes:
| Elemento | Significado |
|---|---|
|
Base de datos que se consulta: cuentas, grupos y contraseñas |
|
Archivos locales, como |
|
Servicios dinámicos de |
|
SSSD, la última fuente. Solo aparece cuando SSSD está instalado y configurado: en un Ubuntu 24.04 que no pertenece a un dominio, la línea es |
La búsqueda se detiene en la primera fuente que responde, por lo que una cuenta local prevalece sobre una del directorio con el mismo nombre.
El comando getent (get entries) muestra las entradas de las bases de datos soportadas por las bibliotecas NSS. Consulta las mismas fuentes y en el mismo orden que cualquier otro programa del sistema, por lo que devuelve la misma respuesta que recibiría, por ejemplo, el proceso de inicio de sesión. Por este motivo, al auditar cuentas debe emplearse en lugar de leer directamente los archivos planos:
getent passwd maria
getent group sudo
| Orden | Resultado |
|---|---|
|
La entrada de |
|
La entrada del grupo |
|
Sin clave, todas las entradas de la base de datos, salvo que esta no admita enumeración |
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.
|
Referencias |
De la identidad a la autenticación: PAM
NSS solo proporciona los datos de las cuentas. La decisión de conceder o denegar el acceso la toma PAM (Pluggable Authentication Modules), que consulta ese almacén y evalúa las políticas configuradas:
En la fase auth, pam_unix.so comprueba el hash del campo 2 de /etc/shadow. En la fase account, evalúa los campos 4 a 8 y rechaza el acceso si la cuenta ha caducado, también con una clave SSH. Por eso passwd -l solo afecta a la primera fase y usermod -L -e 1 actúa sobre la segunda, como se explicó en el apartado 3.6. La estructura de las pilas y el bastionado con pam_pwquality y pam_faillock se estudian en la guía de módulos de autenticación conectables (PAM).
|
Con los conceptos de criptografía de contraseñas y algoritmos heredados de este capítulo, puede repasar:
|
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 | Dónde se verifica |
|---|---|---|---|
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 los permisos |
|
Acceso SSH con clave tras bloquear la contraseña |
Persistencia tras deshabilitar la contraseña |
Bloqueo completo de cuenta con expiración |
|
Terminales desatendidas |
Acceso físico o lateral no autorizado |
Cierre forzado de shell por inactividad |
|
Pertenencia a |
Escalada a superusuario sin auditoría |
Migrar a Docker rootless o Podman |
|
Archivos huérfanos postbaja |
Apropiación de archivos 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/passwdElemento Significado awkProcesa el archivo línea a línea
-F:Usa los dos puntos como separador de campos
$3 == 0Selecciona las líneas cuyo tercer campo, el UID, vale 0
{print $1}Muestra el primer campo, el nombre de la cuenta
La 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
Una cuenta clandestina con UID 0 comparte identidad con
roota efectos del núcleo, y eso condiciona toda la remediación. Para llevarla a cabo de forma segura:-
Bloquear la cuenta preventivamente: Bloquear la contraseña y hacer caducar la cuenta mientras se analiza el incidente. La orden actúa solo sobre la entrada
toorde/etc/shadow:sudo usermod -L -e 1 toor -
Interrumpir sus sesiones sin afectar a
root: Localizar las sesiones abiertas con el nombre de la cuenta clandestina y terminar únicamente los procesos de esa terminal:who | grep toor sudo pkill -t pts/1Orden Función whoLista las sesiones y su terminal, como
pts/1pkill -t pts/1Termina los procesos asociados a esa terminal, porque
-t(terminal) los selecciona por terminal en lugar de por usuarioNo seleccione procesos por nombre de usuario. Como
tooryroottienen el mismo UID,pkill -u toorypkill -9 -u toorapuntan a todos los procesos deroot, incluidosystemdcon PID 1, y pueden dejar el sistema inutilizable. En una comprobación realizada conpgrep -u toorsobre Ubuntu 24.04, la orden devolvió exactamente los mismos procesos quepgrep -u root. Del mismo modo,loginctl terminate-user toorcerraría todas las sesiones deroot. -
Eliminar la cuenta sin tocar el directorio raíz: Ejecutar
sudo userdel -f toor, donde-f(force) fuerza el borrado aunque la cuenta tenga procesos activos. Sin la opción-f,userdelse niega a actuar con el mensaje user toor is currently used by process 1, porque todos los procesos derootcuentan como suyos. Con-fel mensaje se sigue mostrando como aviso, pero la cuenta se elimina, lo que se comprueba congetent passwd toor. 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, con UID entre 1 y 999, deben utilizar como shell
/usr/sbin/nologino/bin/false, que impiden la sesión interactiva:awk -F: '$3 > 0 && $3 < 1000 && $7 !~ /(nologin|false)$/ {print $1, $7}' /etc/passwdElemento Significado $3 > 0 && $3 < 1000Selecciona las cuentas de sistema, excluyendo a
root$7 !~ /(nologin|false)$/Descarta las que tienen como shell
nologinofalse{print $1, $7}Muestra el nombre de la cuenta y su shell
En Debian y Ubuntu, la única línea esperada es
sync /bin/sync. La cuentasynces una excepción histórica: su shell ejecuta la ordensyncy termina, sin ofrecer una sesión interactiva. -
Configurar el cierre automático de sesión por inactividad (
TMOUT): Para evitar que una terminal desatendida quede expuesta, se define el cierre automático a los 15 minutos (900 segundos) de inactividad en/etc/profile.d/timeout.sh, que se aplica a todas las sesiones de login:sudo tee /etc/profile.d/timeout.sh << 'EOF' readonly TMOUT=900 export TMOUT EOF sudo chmod 644 /etc/profile.d/timeout.shElemento Significado sudo tee archivo << 'EOF'teeescribe en un archivo lo que recibe. Se usa consudoporque la redirección>no hereda los privilegios.<< 'EOF'indica que el texto que sigue, hasta la líneaEOF, es la entradareadonly TMOUT=900TMOUTes el número de segundos de inactividad tras los cuales la shell se cierra.readonlyimpide que el usuario lo modifique o lo elimineexport TMOUTHace que la variable sea visible para los programas que se lancen desde la shell
readonlysolo protege la variable en la shell que lee el archivo. El atributo no se hereda, por lo que el usuario puede abrir otra shell conbashy ejecutar en ellaunset TMOUT, y la orden funciona.TMOUTes, por tanto, una medida disuasoria y no un control que el usuario no pueda eludir. Para un cierre que dependa del sistema y no de la shell,systemd-logindpermite detener las sesiones inactivas con la directivaStopIdleSessionSecde/etc/systemd/logind.conf, desactivada por defecto en Ubuntu 24.04. -
Identificar cuentas con contraseña vacía:
sudo awk -F: '$2 == "" {print $1}' /etc/shadowElemento Significado $2 == ""Selecciona las cuentas cuyo segundo campo, el hash, está vacío
{print $1}Muestra el nombre de la cuenta
La 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 -dTres órdenes encadenadas con tuberías:
Orden Significado cut -d: -f3cutextrae columnas.-d:fija los dos puntos como delimitador y-f3(field) selecciona el tercer campo. Con-f1se obtienen los nombressort -nOrdena las líneas.
-nlo hace de forma numéricauniq -dMuestra solo las líneas repetidas (duplicated). Necesita la entrada ordenada. La salida debe estar vacía
-
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 de usuario, utilice siempresu -en lugar desu, y para obtener una shell de superusuario,sudo -i. El guion inicializa un entorno de inicio de sesión limpio y evita heredar variables manipuladas o rutas relativas en elPATH. En Ubuntu, la contraseña derootestá bloqueada, por lo quesu - rootfalla con «Authentication failure» ysudo -ies la forma habitual de abrir una sesión deroot. -
Auditar archivos de inicio ocultos y eliminar archivos peligrosos:
-
Comprobar que los archivos de inicio (
.bashrc,.profile) en/homeno tengan permisos de escritura para el grupo ni para otros:sudo find /home -maxdepth 2 -name ".*" -perm /022 -lsElemento Significado -maxdepth 2Desciende hasta dos niveles, de modo que revisa los archivos dentro de cada directorio personal
-name ".*"Selecciona los nombres que empiezan por punto, es decir, los ocultos
-perm /022Selecciona los que tienen escritura para el grupo o para otros
-
Asegurar que no existan archivos de credenciales obsoletos o inseguros:
sudo find /home \( -name ".netrc" -o -name ".rhosts" -o -name ".forward" \) -lsElemento Significado -oSignifica «o»
\( … \)Agrupan los tres nombres de archivo
-
-
Verificar que el grupo
shadowno tenga miembros interactivos:grep '^shadow:' /etc/groupElemento Significado '^shadow:'Selecciona la línea que empieza por
shadow:El cuarto campo debe estar vacío. Si contiene usuarios, estos pueden leer los hashes sin necesidad de
sudo. Esa lista solo incluye a los miembros secundarios, por lo que también hay que comprobar que ninguna cuenta tengashadowcomo grupo principal:awk -F: -v gid="$(getent group shadow | cut -d: -f3)" '$4 == gid {print $1}' /etc/passwdElemento Significado getent group shadow | cut -d: -f3Obtiene el GID del grupo
shadow, que en Debian y Ubuntu es42-v gid="…"Guarda ese GID en la variable
giddeawk$4 == gidSelecciona las cuentas cuyo cuarto campo, el grupo principal, es
shadowLa salida debe estar vacía.
-
Proteger la cuenta root: En sistemas administrados con
sudo, la contraseña derootdebe permanecer bloqueada y su grupo principal debe ser el GID 0:sudo passwd -S root awk -F: '$1 == "root" {print $4}' /etc/passwdLa primera orden debe mostrar el estado
Ly la segunda, el valor0.
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 archivos del sistema:
sudo pwck -r
sudo grpck -r
| Elemento | Función |
|---|---|
|
Verifica |
|
Verifica |
|
Las ejecuta en solo lectura (read-only) |
Estas herramientas comprueban que no existan campos omitidos, delimitadores faltantes, directorios personales inexistentes, formatos corruptos ni GIDs inexistentes asignados a usuarios. En Ubuntu 24.04, pwck -r muestra siempre avisos sobre los directorios inexistentes de cuentas del sistema como lp o www-data, que son normales, como se explica en el apartado 2.2.
|
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 | Dificultad |
|---|---|---|---|
1 |
Interpretar |
Baja |
|
2 |
Comprender cómo se almacenan las contraseñas y el papel de la sal |
Media |
|
3 |
Crear cuentas con los atributos adecuados a su función |
Media |
|
4 |
Configurar cómo nacen las nuevas cuentas |
Media |
|
5 |
Gestionar cambios en cuentas existentes sin inconsistencias |
Media |
|
6 |
Aplicar políticas de caducidad, expiración e inactividad |
Media |
|
7 |
Diferenciar el bloqueo de contraseña del bloqueo real de la cuenta |
Media |
|
8 |
Eliminar cuentas sin dejar riesgos residuales |
Media |
|
9 |
Organizar usuarios por funciones y delegar la gestión de grupos |
Media |
|
10 |
Identificar técnicas de persistencia basadas en cuentas |
Alta |
|
11 |
Detectar privilegios excesivos y delegar con mínimo privilegio |
Alta |
|
12 |
Automatizar la verificación del bastionado de cuentas |
Alta |
|
13 |
Revertir los cambios realizados durante la práctica |
Baja |
8.1. Ejercicio 1. Exploración de los archivos 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. Use el comandohead. -
Lista todos los usuarios que tengan un UID menor que 1000 junto con su shell asignado, que está en el séptimo campo del archivo
/etc/passwd. Use el comandoawk. -
Audita si existe alguna cuenta de sistema (UID entre 1 y 999) que disponga indebidamente de un shell interactivo (distinto de
nologin,falseosync). Use el comandoawk. -
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
Bastionado2026con el comandoopenssl passwd -6. ¿Qué hace el comando anterior? ¿Son iguales los resultados? ¿Por qué? -
Repite la operación fijando manualmente la sal
abcdefgh. Usa el comandoopenssl passwd -6 -salt <sal> <password>. ¿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 con el comando
passwdy obliga a que la cambie en su primer inicio de sesión con el comandochage. -
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 mayor o igual que 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 se crean con una configuración segura es más eficaz que corregirlas una a una después.
El archivo /etc/login.defs define los valores por defecto que se aplican al crear una cuenta. Cada línea asocia el nombre de una variable con su valor. Las que se utilizan en este ejercicio son:
| Variable | Significado | Valor en Ubuntu 24.04 |
|---|---|---|
|
Días máximos de validez de la contraseña antes de que deba cambiarse |
|
|
Días mínimos que deben pasar entre dos cambios de contraseña |
|
|
Días de antelación con los que se avisa de que la contraseña va a caducar |
|
|
Permisos con los que se crea el directorio personal de las cuentas nuevas |
|
|
Máscara de permisos para los archivos y directorios que crean las cuentas nuevas |
|
|
Algoritmo con el que se calcula el hash de la contraseña. En Ubuntu 24.04 la orden |
|
Los parámetros PASS_* se copian a /etc/shadow en el momento de crear la cuenta: por eso no afectan a las cuentas que ya existían. La orden useradd -D muestra otros valores por defecto, como INACTIVE, que son los días de gracia tras caducar la contraseña antes de desactivar la cuenta. Estos conceptos se explican en los apartados 3.3 y 3.5 de este capítulo.
Realice los siguientes pasos:
-
Haz una copia de seguridad de
/etc/login.defsy de/etc/skel/.profile. Guarda la segunda fuera de/etc/skel, porque todo lo que contiene ese directorio se copia al directorio personal de cada cuenta nueva. -
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. Utilice el comandosedytee. -
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. Con ella, las cuentas que se creen a partir de ahora abrirán sus sesiones con una máscara que hace que los archivos nuevos tengan permisos640y los directorios750, de modo que el resto de usuarios no pueda acceder a ellos. Complementa aHOME_MODE, que solo protege el propio directorio personal en el momento de crearlo. Utilice el comandotee. -
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?
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 con SSH: esta prueba requiere un servidor SSH en la máquina virtual y funciona con cualquier máquina, tanto si admite contraseñas como si solo permite claves públicas. Como
ssh-copy-idexige poder autenticarse antes con contraseña, no se utiliza. Antes del paso 1, instale el servidor si no está presente, genere un par de claves de uso exclusivo para la práctica, instale la clave pública en la cuentaanalistay compruebe quessh analista@localhostfunciona. Repita la conexión traspasswd -ly de nuevo tras el bloqueo completo del paso 4. -
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, la conexión SSH con la clave de la práctica). ¿Qué mensaje aparece ahora? Compáralo con el que aparece al ejecutarsudo su - analista -c id, y explica por quésu - analistasinsudono llega a mostrar el aviso de cuenta caducada. -
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 archivo 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 archivo
/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 archivo 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. Comprueba antes si tiene sesiones abiertas, bloquea la cuenta y elimínala conuserdel -f. Observa qué ocurre si omites la opción-f.No utilice nunca
userdel -ren este caso: borraría el directorio/root. Tampoco intente detener sus procesos conpkill -u toor: como comparte el UID 0, la orden señalizaría todos los procesos deroot. Sin la opción-f,userdelfalla porque todos los procesos derootcuentan como del usuariotoor.
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 archivo/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. Si realizó la ampliación con SSH del ejercicio 7, cierre antes las sesiones deanalista, que pueden permanecer activas unos segundos, y elimine el par de claves de la práctica. -
Elimina los grupos
soporte,comunicacionesytecnicos, el directorio/srv/tecnicos, la regla/etc/sudoers.d/soportey el directorio/backupcon la copia deusuario3. -
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, y elimina el rango subordinado que quedó huérfano al renombrarseguridaden el ejercicio 5 (ver apartado 6.2.2). 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.