Usar root para todo es tentador pero peligroso. Un error y borras el sistema. Un atacante que entre tiene acceso total. La gestión correcta de usuarios y permisos es fundamental para la seguridad.
Esta guía te enseña a gestionar usuarios y permisos como un profesional.
Por qué no usar root para todo
| Usando root | Usando usuarios separados |
|---|---|
| Un error = desastre | Errores contenidos |
| Sin auditoría | Sabes quién hizo qué |
| Todo o nada | Permisos granulares |
| Atacante = acceso total | Atacante = acceso limitado |
Estructura recomendada
root → Solo para emergencias
├── admin → Tu usuario con sudo
├── deploy → Despliegues automáticos
├── www-data → Servidor web
└── mysql → Base de datos
Gestión de usuarios
Crear usuario
# Crear usuario básico
sudo adduser nombre_usuario
# Crear usuario sin directorio home
sudo adduser --no-create-home nombre_usuario
# Crear usuario de sistema (sin login)
sudo adduser --system --no-create-home nombre_usuario
# Crear con shell específico
sudo adduser --shell /bin/bash nombre_usuario
Ver información de usuario
# Info del usuario actual
whoami
id
# Info de otro usuario
id nombre_usuario
# Ver grupos del usuario
groups nombre_usuario
# Ver todos los usuarios
cat /etc/passwd
# Solo nombres de usuarios con shell
grep -E '/bin/(bash|sh|zsh)' /etc/passwd | cut -d: -f1
Modificar usuario
# Cambiar shell
sudo usermod -s /bin/bash nombre_usuario
# Añadir a grupo
sudo usermod -aG grupo nombre_usuario
# Cambiar directorio home
sudo usermod -d /nuevo/home nombre_usuario
# Bloquear usuario
sudo usermod -L nombre_usuario
# Desbloquear usuario
sudo usermod -U nombre_usuario
# Cambiar nombre de usuario
sudo usermod -l nuevo_nombre viejo_nombre
Eliminar usuario
# Eliminar usuario (mantiene home)
sudo deluser nombre_usuario
# Eliminar usuario y su home
sudo deluser --remove-home nombre_usuario
# Eliminar usuario y todos sus archivos
sudo deluser --remove-all-files nombre_usuario
Cambiar contraseña
# Cambiar tu contraseña
passwd
# Cambiar contraseña de otro usuario (como root)
sudo passwd nombre_usuario
# Forzar cambio en próximo login
sudo passwd -e nombre_usuario
# Ver estado de contraseña
sudo passwd -S nombre_usuario
Gestión de grupos
Crear y gestionar grupos
# Crear grupo
sudo addgroup nombre_grupo
# Añadir usuario a grupo
sudo adduser nombre_usuario nombre_grupo
# o
sudo usermod -aG nombre_grupo nombre_usuario
# Ver miembros de un grupo
getent group nombre_grupo
# Eliminar usuario de grupo
sudo deluser nombre_usuario nombre_grupo
# Eliminar grupo
sudo delgroup nombre_grupo
Grupos comunes
| Grupo | Propósito |
|---|---|
sudo | Permisos de administrador |
www-data | Servidor web |
docker | Ejecutar Docker sin sudo |
adm | Leer logs del sistema |
ssh | Acceso SSH (si se configura) |
Sudo: Permisos de administrador
Añadir usuario a sudo
# Método 1: Añadir al grupo sudo
sudo usermod -aG sudo nombre_usuario
# Método 2: Editar sudoers
sudo visudo
Configuración de sudoers
# /etc/sudoers (usar visudo para editar)
# Usuario con todos los permisos
nombre_usuario ALL=(ALL:ALL) ALL
# Usuario sin pedir contraseña
nombre_usuario ALL=(ALL) NOPASSWD: ALL
# Usuario solo puede reiniciar nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# Usuario puede ejecutar comandos como www-data
deploy ALL=(www-data) NOPASSWD: ALL
# Grupo con permisos
%developers ALL=(ALL) NOPASSWD: /usr/bin/git, /usr/bin/npm
Usar sudo
# Ejecutar comando como root
sudo comando
# Ejecutar como otro usuario
sudo -u www-data comando
# Abrir shell como root
sudo -i
# Abrir shell como otro usuario
sudo -u nombre_usuario -i
# Ver qué puedes hacer con sudo
sudo -l
Sistema de permisos
Entender los permisos
-rwxr-xr-x 1 usuario grupo 4096 Feb 11 10:00 archivo.sh
│├─┤├─┤├─┤
│ │ │ └── Otros (o)
│ │ └───── Grupo (g)
│ └──────── Usuario/Owner (u)
└────────── Tipo (- archivo, d directorio, l enlace)
Significado de rwx
| Permiso | En archivos | En directorios |
|---|---|---|
r (4) | Leer contenido | Listar contenido |
w (2) | Modificar | Crear/eliminar archivos |
x (1) | Ejecutar | Entrar (cd) |
Permisos en números
| Número | Permisos | Significado |
|---|---|---|
| 7 | rwx | Todo |
| 6 | rw- | Leer y escribir |
| 5 | r-x | Leer y ejecutar |
| 4 | r— | Solo leer |
| 0 | --- | Nada |
Ejemplos comunes
| Permiso | Significado |
|---|---|
| 755 | rwxr-xr-x → Dueño todo, otros leer/ejecutar |
| 644 | rw-r—r— → Dueño leer/escribir, otros solo leer |
| 700 | rwx------ → Solo el dueño |
| 600 | rw------- → Solo el dueño, sin ejecutar |
| 775 | rwxrwxr-x → Dueño y grupo todo |
Cambiar permisos con chmod
Modo numérico
# Permisos típicos para archivos
chmod 644 archivo.txt # rw-r--r--
chmod 600 archivo_privado # rw-------
# Permisos típicos para scripts
chmod 755 script.sh # rwxr-xr-x
chmod 700 script_privado # rwx------
# Permisos para directorios
chmod 755 directorio/ # rwxr-xr-x
chmod 700 directorio_privado/
# Recursivo
chmod -R 755 directorio/
Modo simbólico
# Añadir permiso
chmod +x script.sh # Añadir ejecución a todos
chmod u+x script.sh # Añadir ejecución solo al dueño
chmod g+w archivo.txt # Añadir escritura al grupo
# Quitar permiso
chmod -x script.sh # Quitar ejecución
chmod o-rwx archivo.txt # Quitar todo a otros
# Establecer exactamente
chmod u=rwx,g=rx,o=r archivo
# Copiar permisos
chmod g=u archivo.txt # Grupo igual que usuario
Cambiar propietario con chown
# Cambiar dueño
sudo chown usuario archivo.txt
# Cambiar dueño y grupo
sudo chown usuario:grupo archivo.txt
# Solo cambiar grupo
sudo chown :grupo archivo.txt
# o
sudo chgrp grupo archivo.txt
# Recursivo
sudo chown -R usuario:grupo directorio/
# Cambiar siguiendo enlaces simbólicos
sudo chown -H usuario archivo
Permisos para web
Estructura típica
/var/www/sitio/
├── public/ # 755, www-data:www-data
│ ├── index.php # 644
│ └── assets/ # 755
├── storage/ # 775 (escritura)
├── cache/ # 775 (escritura)
└── .env # 600 (privado)
Configurar permisos web
# Propietario www-data
sudo chown -R www-data:www-data /var/www/sitio
# Permisos base
sudo find /var/www/sitio -type d -exec chmod 755 {} \;
sudo find /var/www/sitio -type f -exec chmod 644 {} \;
# Directorios de escritura
sudo chmod -R 775 /var/www/sitio/storage
sudo chmod -R 775 /var/www/sitio/cache
# Archivos sensibles
sudo chmod 600 /var/www/sitio/.env
Tu usuario + www-data
# Añadir tu usuario al grupo www-data
sudo usermod -aG www-data tu_usuario
# Crear con grupo www-data
sudo chown -R tu_usuario:www-data /var/www/sitio
# Permisos que permiten a ambos
sudo chmod -R 775 /var/www/sitio
# Nuevos archivos heredan grupo
sudo chmod g+s /var/www/sitio
Usuario para deploy
Crear usuario deploy
# Crear usuario
sudo adduser --disabled-password deploy
# Añadir a www-data
sudo usermod -aG www-data deploy
# Configurar sudo limitado
sudo visudo
# Añadir:
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart php8.2-fpm
deploy ALL=(www-data) NOPASSWD: ALL
Configurar SSH para deploy
# Crear directorio SSH
sudo mkdir -p /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh
# Añadir clave pública (de GitHub Actions, etc.)
sudo nano /home/deploy/.ssh/authorized_keys
# Pegar la clave pública
sudo chmod 600 /home/deploy/.ssh/authorized_keys
sudo chown -R deploy:deploy /home/deploy/.ssh
Permisos especiales
SUID, SGID, Sticky bit
# SUID (4): Ejecutar como el dueño
chmod 4755 archivo # -rwsr-xr-x
chmod u+s archivo
# SGID (2): Ejecutar como el grupo / heredar grupo en dirs
chmod 2755 directorio # drwxr-sr-x
chmod g+s directorio
# Sticky bit (1): Solo el dueño puede borrar (para /tmp)
chmod 1777 directorio # drwxrwxrwt
chmod +t directorio
ACLs (permisos avanzados)
# Ver ACLs
getfacl archivo
# Añadir permiso a usuario específico
setfacl -m u:usuario:rwx archivo
# Añadir permiso a grupo específico
setfacl -m g:grupo:rx archivo
# Permisos por defecto en directorio
setfacl -d -m u:usuario:rwx directorio/
# Eliminar ACL
setfacl -x u:usuario archivo
# Eliminar todas las ACLs
setfacl -b archivo
Auditoría
Ver quién hizo qué
# Últimos logins
last
# Logins fallidos
lastb
# Quién está conectado
who
w
# Historial de comandos de un usuario
cat /home/usuario/.bash_history
# Ver uso de sudo
grep sudo /var/log/auth.log
Buscar archivos por permisos
# Archivos con SUID
find / -perm -4000 -type f 2>/dev/null
# Archivos escribibles por todos
find /var/www -perm -002 -type f
# Archivos sin dueño
find / -nouser -o -nogroup 2>/dev/null
Preguntas frecuentes
¿Debo usar root o crear otro usuario?
Crea un usuario con sudo para uso diario. Root solo para emergencias o tareas que específicamente lo requieran. Esto limita el daño de errores y mejora la auditoría.
¿Qué permisos debo dar a los archivos de mi web?
Generalmente 644 para archivos y 755 para directorios. Archivos sensibles como .env deben ser 600. Directorios que necesitan escritura (uploads, cache) pueden ser 775.
¿Por qué mi script no se ejecuta aunque tenga permisos?
Verifica que tenga permiso de ejecución (chmod +x). También revisa el shebang (#!/bin/bash) y que el intérprete exista. Si está en un sistema de archivos montado con 'noexec', no funcionará.
¿Cómo permito que mi usuario y www-data editen los mismos archivos?
Añade tu usuario al grupo www-data (usermod -aG www-data tu_usuario), haz que los archivos pertenezcan a tu_usuario:www-data, y usa permisos 775/664.
¿Qué es el sticky bit y para qué sirve?
El sticky bit en directorios (como /tmp) hace que solo el dueño de un archivo pueda borrarlo, aunque el directorio tenga permisos de escritura para todos.
Nuestra recomendación
Setup básico:
- Crear usuario admin con sudo
- Deshabilitar login de root por SSH
- Usuario deploy para CI/CD
- Permisos correctos en /var/www
Mejores prácticas:
- Nunca uses root para tareas diarias
- Permisos mínimos necesarios
- Audita accesos regularmente
- Documenta qué usuario hace qué
¿Necesitas gestión profesional? La administración gestionada de Avantys incluye configuración segura de usuarios y permisos.
Conclusión
La gestión correcta de usuarios y permisos es la base de la seguridad de tu VPS. Tómate el tiempo de configurarlo bien desde el principio.
Recuerda: permisos mínimos necesarios, usuarios separados por función, y nunca uses root para tareas diarias.
¿Necesitas un VPS seguro? Explora los VPS de Avantys con configuración de seguridad incluida.
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.