Saltar al contenido principal

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​

  1. Introducción
  2. La convención de los UID en Linux
  3. Usuarios de sistema (service accounts)
  4. Usuarios normales (cuentas humanas)
  5. Crear un usuario de sistema con useradd -r
  6. Diferencia entre -r y -s en useradd
  7. Ejemplos concretos de cuentas de sistema
  8. Vínculo con el Módulo 14 – Las cuentas wikijs_*
  9. Comandos para listar e identificar usuarios
  10. Buenas prácticas en producción
  11. Esquema recapitulativo
  12. Ejercicios prácticos

Introducción​

En Linux, no todas las cuentas de usuario son iguales. Se distinguen dos grandes categorías:

CategoríaUID típicoRolEjemplo
Usuario de sistema (service account)< 1000Ejecutar servicios/demonioswww-data, mysql, nobody
Usuario normal (cuenta humana)≥ 1000Persona física que inicia sesiónalice, bob, etudiant
Atención

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ísticaValor típico
UID< 1000 (a menudo entre 1 y 999)
Shell/usr/sbin/nologin o /bin/false
HomeSin home, o un directorio técnico (ej: /var/www)
ContraseñaDesactivada (bloqueada)
Conexión interactivaImposible (o no deseada)

¿Por qué usuarios de sistema?​

  1. Principio de menor privilegio: cada servicio se ejecuta con permisos limitados, no como root
  2. Aislamiento: si un servicio es comprometido, el atacante solo tiene los derechos de esa cuenta
  3. Trazabilidad: se sabe qué servicio realizó qué acción en los logs
  4. 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
Nota

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ísticaValor típico
UID≥ 1000
Shell/bin/bash o /bin/sh
Home/home/<nombre_usuario>
ContraseñaDefinida (activa)
Conexión interactivaSí

¿Cómo crearlos?​

sudo useradd -m -s /bin/bash alice
id alice
Consejo

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ónRolEfecto
-rDeclara la cuenta como de sistemaUID en el rango de sistema
-sDefine el shell de conexiónPrograma 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
Resumen

-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)​

  1. Mostrar los rangos de UID:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
  1. 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
  1. 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