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