Módulo 15 – BONUS: Usuarios de sistema vs usuarios normales en Linux
+==============================================================================+
| MÓDULO 15 (BONUS): CUENTAS DE SISTEMA vs CUENTAS HUMANAS |
| Duración estimada: 1-2 horas | Nivel: Intermedio |
+==============================================================================+
Tabla de contenidos
- Introducción
- La convención de los UID en Linux
- Usuarios de sistema (service accounts)
- Usuarios normales (cuentas humanas)
- Crear un usuario de sistema con
useradd -r - Diferencia entre
-ry-senuseradd - Ejemplos concretos de cuentas de sistema
- Vínculo con el Módulo 14 – Las cuentas
wikijs_* - Comandos para listar e identificar usuarios
- Buenas prácticas en producción
- Esquema recapitulativo
- Ejercicios prácticos
Introducción
En Linux, no todas las cuentas de usuario son iguales. Se distinguen dos grandes categorías:
| Categoría | UID típico | Rol | Ejemplo |
|---|---|---|---|
| Usuario de sistema (service account) | < 1000 | Ejecutar servicios/demonios | www-data, mysql, nobody |
| Usuario normal (cuenta humana) | ≥ 1000 | Persona física que inicia sesión | alice, bob, etudiant |
No es una regla absoluta: es una convención que depende de la distribución y de la configuración de /etc/login.defs.
Volver a la tabla de contenidos
La convención de los UID en Linux
¿Qué es un UID?
El UID (User IDentifier) es un número único asignado a cada cuenta de usuario. Es este número (y no el nombre) el que el núcleo de Linux utiliza para gestionar los permisos.
Los rangos de UID
┌──────────────────────────────────────────────────────────────────┐
│ RANGOS DE UID EN LINUX │
├──────────┬───────────────────────────────────────────────────────┤
│ UID 0 │ root (superusuario) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1-999 │ Cuentas de SISTEMA / servicios / demonios │
│ │ (www-data, mysql, sshd, daemon, nobody, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1000+ │ Cuentas NORMALES / humanas │
│ │ (alice, bob, etudiant, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 65534 │ nobody (usuario sin privilegios) │
└──────────┴───────────────────────────────────────────────────────┘
¿Dónde se definen estos rangos?
El archivo /etc/login.defs define los rangos oficiales en su sistema:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
Resultado típico en Ubuntu/Debian:
SYS_UID_MIN 201
SYS_UID_MAX 999
UID_MIN 1000
UID_MAX 60000
Interpretación:
- SYS_UID_MIN (201) → SYS_UID_MAX (999) : rango reservado para cuentas de sistema
- UID_MIN (1000) → UID_MAX (60000) : rango para cuentas humanas
- UID 0 : siempre
root - UID 1-200 : a menudo reservados para cuentas de sistema críticas (según la distribución)
Volver a la tabla de contenidos
Usuarios de sistema (service accounts)
Definición
Un usuario de sistema (o service account) es una cuenta creada para ejecutar un servicio, un demonio o un componente del sistema. No está destinada a una persona.
Características típicas
| Característica | Valor típico |
|---|---|
| UID | < 1000 (a menudo entre 1 y 999) |
| Shell | /usr/sbin/nologin o /bin/false |
| Home | Sin home, o un directorio técnico (ej: /var/www) |
| Contraseña | Desactivada (bloqueada) |
| Conexión interactiva | Imposible (o no deseada) |
¿Por qué usuarios de sistema?
- Principio de menor privilegio: cada servicio se ejecuta con permisos limitados, no como
root - Aislamiento: si un servicio es comprometido, el atacante solo tiene los derechos de esa cuenta
- Trazabilidad: se sabe qué servicio realizó qué acción en los logs
- Seguridad: se evita la conexión interactiva (shell
nologin)
Ejemplos comunes
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
mysql:x:114:120:MySQL Server,,,:/nonexistent:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
root (UID 0) es un caso especial: es una cuenta de sistema con un shell interactivo y privilegios totales.
Volver a la tabla de contenidos
Usuarios normales (cuentas humanas)
Definición
Un usuario normal es una cuenta creada para una persona física que inicia sesión en el sistema.
Características típicas
| Característica | Valor típico |
|---|---|
| UID | ≥ 1000 |
| Shell | /bin/bash o /bin/sh |
| Home | /home/<nombre_usuario> |
| Contraseña | Definida (activa) |
| Conexión interactiva | Sí |
¿Cómo crearlos?
sudo useradd -m -s /bin/bash alice
id alice
El -m crea el directorio home (/home/alice) y el -s /bin/bash da un shell interactivo.
Volver a la tabla de contenidos
Crear un usuario de sistema con useradd -r
El flag -r (system account)
El flag -r de useradd crea una cuenta de sistema:
sudo useradd -r monservice
Lo que hace -r:
- Asigna un UID en el rango de sistema (según
/etc/login.defs) - Por defecto, no crea directorio home (a menos que se añada
-m)
Ejemplos
sudo useradd -r monservice
sudo useradd -r -m monservice
sudo useradd -r -m -s /usr/sbin/nologin monservice
sudo useradd -r -m -s /bin/bash monservice
Verificación
id monservice
getent passwd monservice
Volver a la tabla de contenidos
Diferencia entre -r y -s en useradd
Es una distinción fundamental:
| Opción | Rol | Efecto |
|---|---|---|
-r | Declara la cuenta como de sistema | UID en el rango de sistema |
-s | Define el shell de conexión | Programa lanzado al iniciar sesión |
-r no afecta al shell
sudo useradd -r svc_web
-s no afecta al tipo de cuenta
sudo useradd -s /usr/sbin/nologin alice
Combinación recomendada para un servicio
sudo useradd -r -m -s /usr/sbin/nologin svc_web
-r = tipo de cuenta (sistema); -s = shell (login / no login). Ambos son independientes.
Volver a la tabla de contenidos
Ejemplos concretos de cuentas de sistema
Apache / Nginx
id www-data
getent passwd www-data
MySQL / MariaDB
id mysql
getent passwd mysql
SSHD
id sshd
Volver a la tabla de contenidos
Vínculo con el Módulo 14 – Las cuentas wikijs_*
En el TP del Módulo 14, se crearon:
sudo useradd -r -m -s /bin/bash wikijs_dev
sudo useradd -r -m -s /bin/bash wikijs_test
sudo useradd -r -m -s /bin/bash wikijs_prod
Estas cuentas son de sistema porque se utilizó -r.
Verificación:
id wikijs_dev
id wikijs_test
id wikijs_prod
Vínculo con systemd:
[Service]
User=wikijs_dev
Volver a la tabla de contenidos
Comandos para listar e identificar usuarios
1) Ver los rangos de UID
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
2) Listar los usuarios humanos (UID ≥ UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
3) Listar los usuarios de sistema (UID < UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
4) Listar las cuentas no-login (servicios típicos)
awk -F: '($7 ~ /(nologin|false)$/) {print $1" -> "$7}' /etc/passwd
5) Listar las cuentas humanas probables (home + shell interactivo)
awk -F: '($6 ~ /^\/home\//) && ($7 ~ /(bash|sh)$/) {print $1" home="$6" shell="$7}' /etc/passwd
Volver a la tabla de contenidos
Buenas prácticas en producción
1) Utilizar siempre -r para cuentas de servicio
sudo useradd -r -m -s /usr/sbin/nologin mon_service
2) Evitar shells interactivos para servicios
sudo usermod -s /usr/sbin/nologin wikijs_dev
3) Nunca ejecutar un servicio como root
[Service]
User=www-data
Volver a la tabla de contenidos
Esquema recapitulativo
Flujo de decisión: ¿cómo identificar una cuenta?
Volver a la tabla de contenidos
Ejercicios prácticos
Ejercicio 1: identificar los tipos de cuentas (principiante)
- Mostrar los rangos de UID:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
- Listar las cuentas de sistema:
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
- Listar las cuentas humanas:
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
Ejercicio 2: crear y comparar cuentas (intermedio)
sudo useradd -m -s /bin/bash test_humain
sudo useradd -r -m -s /usr/sbin/nologin test_service
id test_humain
id test_service
TP Bonus creado el: Febrero 2026