Cómo Configurar Usuarios y Permisos en Linux

La gestión de usuarios y permisos es fundamental para la administración y seguridad de sistemas Linux. Esta guía completa explica cómo crear, modificar y gestionar usuarios, grupos y permisos de archivos en servidores Linux, asegurando un control de acceso adecuado y la seguridad del sistema a través de estrategias efectivas de configuración de usuarios y gestión de permisos.

Tabla de Contenidos

Prerrequisitos

Antes de configurar usuarios y permisos, asegúrese de tener:

  • Servidor Linux (Ubuntu, Debian, CentOS, Rocky Linux o similar)
  • Acceso root o privilegios sudo
  • Acceso SSH al servidor
  • Comprensión básica de la línea de comandos de Linux
  • Familiaridad con editores de texto de terminal (nano, vi o vim)
  • Comprensión de conceptos básicos de seguridad

Comprender el Sistema de Usuarios y Permisos de Linux

Linux es un sistema operativo multiusuario con un modelo de permisos robusto que controla el acceso a archivos, directorios y recursos del sistema.

Tipos de Usuarios

Usuario root (superusuario):

  • UID (ID de Usuario): 0
  • Tiene acceso sin restricciones a todos los recursos del sistema
  • Puede realizar cualquier operación en el sistema
  • No debe usarse para tareas rutinarias

Usuarios del sistema:

  • UIDs: Típicamente 1-999 (varía según la distribución)
  • Utilizados por servicios y demonios
  • Generalmente no tienen shell de inicio de sesión (/sbin/nologin)
  • Ejemplos: www-data, mysql, nginx

Usuarios regulares:

  • UIDs: Típicamente 1000 en adelante
  • Cuentas de usuario normales para humanos
  • Tienen directorios home (generalmente /home/nombreusuario)
  • Se les pueden otorgar privilegios sudo para tareas administrativas

Modelo de Permisos

Los permisos de Linux operan en tres niveles:

  1. Usuario (u): El propietario del archivo
  2. Grupo (g): Usuarios en el grupo del archivo
  3. Otros (o): Todos los demás

Cada nivel puede tener tres tipos de permisos:

  • Lectura (r): Ver el contenido del archivo o listar el contenido del directorio
  • Escritura (w): Modificar el archivo o agregar/eliminar archivos en el directorio
  • Ejecución (x): Ejecutar el archivo como programa o acceder al directorio

Archivos Importantes del Sistema

  • /etc/passwd: Información de cuentas de usuario
  • /etc/shadow: Contraseñas cifradas (legible solo por root)
  • /etc/group: Información de grupos
  • /etc/gshadow: Contraseñas de grupo cifradas
  • /etc/sudoers: Configuración de sudo
  • /etc/login.defs: Configuración predeterminada para la creación de usuarios

Paso 1: Gestionar Cuentas de Usuario

Crear Nuevos Usuarios

# Crear usuario con configuración predeterminada (Ubuntu/Debian)
sudo adduser nombreusuario

# Crear usuario con configuración predeterminada (CentOS/Rocky Linux)
sudo useradd -m nombreusuario
sudo passwd nombreusuario

# Crear usuario con UID y shell específicos
sudo useradd -m -u 1500 -s /bin/bash nombreusuario

# Crear usuario con directorio home específico
sudo useradd -m -d /ruta/home/personalizada nombreusuario

# Crear usuario con grupo específico
sudo useradd -m -g nombregrupo nombreusuario

# Crear usuario con múltiples grupos
sudo useradd -m -G grupo1,grupo2,grupo3 nombreusuario

# Crear usuario del sistema (para servicios)
sudo useradd -r -s /sbin/nologin nombreservicio

Explicación de las opciones de useradd:

  • -m: Crear directorio home
  • -u: Especificar ID de usuario
  • -s: Establecer shell de inicio de sesión
  • -d: Establecer ruta del directorio home
  • -g: Establecer grupo primario
  • -G: Establecer grupos suplementarios
  • -r: Crear cuenta del sistema
  • -c: Agregar comentario (nombre completo)
  • -e: Establecer fecha de expiración

Ejemplo: Crear usuario con todas las opciones:

# Crear cuenta de usuario completa
sudo useradd -m \
  -u 2000 \
  -g desarrolladores \
  -G sudo,docker,www-data \
  -s /bin/bash \
  -c "Juan Pérez" \
  -e 2025-12-31 \
  juanperez

# Establecer contraseña
sudo passwd juanperez

Ver Información de Usuario

# Mostrar información del usuario
id nombreusuario

# Ver información detallada del usuario
getent passwd nombreusuario

# Listar todos los usuarios
cat /etc/passwd

# Listar solo usuarios regulares (UID >= 1000)
awk -F: '$3 >= 1000 {print $1}' /etc/passwd

# Mostrar el usuario actual conectado
whoami

# Mostrar quién está conectado
who
w

# Ver el último inicio de sesión del usuario
last nombreusuario
lastlog -u nombreusuario

Modificar Cuentas de Usuario

# Cambiar el nombre completo del usuario
sudo usermod -c "Juana González" nombreusuario

# Cambiar el shell de inicio de sesión del usuario
sudo usermod -s /bin/zsh nombreusuario

# Cambiar el directorio home del usuario
sudo usermod -d /nueva/ruta/home nombreusuario

# Mover el contenido del directorio home
sudo usermod -d /nueva/ruta/home -m nombreusuario

# Bloquear cuenta de usuario (deshabilitar inicio de sesión)
sudo usermod -L nombreusuario
# O
sudo passwd -l nombreusuario

# Desbloquear cuenta de usuario
sudo usermod -U nombreusuario
# O
sudo passwd -u nombreusuario

# Establecer fecha de expiración de la cuenta
sudo usermod -e 2025-12-31 nombreusuario

# Agregar usuario a grupo suplementario
sudo usermod -aG nombregrupo nombreusuario

# Reemplazar los grupos suplementarios del usuario
sudo usermod -G grupo1,grupo2 nombreusuario

# Cambiar el UID del usuario
sudo usermod -u 2500 nombreusuario

Eliminar Usuarios

# Eliminar usuario (mantener directorio home)
sudo userdel nombreusuario

# Eliminar usuario y directorio home
sudo userdel -r nombreusuario

# Eliminar usuario, directorio home y buzón de correo
sudo userdel -r -f nombreusuario

# Buscar y eliminar archivos del usuario en todo el sistema
sudo find / -user nombreusuario -delete

# Buscar archivos del usuario antes de la eliminación
sudo find / -user nombreusuario -ls

Importante: Siempre respalde los datos importantes antes de eliminar usuarios.

Gestión de Contraseñas

# Cambiar contraseña del usuario actual
passwd

# Cambiar contraseña de otro usuario (como root)
sudo passwd nombreusuario

# Forzar cambio de contraseña en el próximo inicio de sesión
sudo passwd -e nombreusuario
sudo chage -d 0 nombreusuario

# Establecer expiración de contraseña
sudo chage -M 90 nombreusuario

# Establecer edad mínima de contraseña
sudo chage -m 7 nombreusuario

# Establecer período de advertencia de contraseña
sudo chage -W 14 nombreusuario

# Ver información de expiración de contraseña
sudo chage -l nombreusuario

# Generar contraseña aleatoria
openssl rand -base64 12

# O usando pwgen
sudo apt install pwgen -y  # Ubuntu/Debian
sudo dnf install pwgen -y  # CentOS/Rocky
pwgen 16 1

Paso 2: Gestionar Grupos

Los grupos le permiten gestionar permisos para múltiples usuarios de manera eficiente.

Crear Grupos

# Crear nuevo grupo
sudo groupadd nombregrupo

# Crear grupo con GID específico
sudo groupadd -g 5000 nombregrupo

# Crear grupo del sistema
sudo groupadd -r gruposistema

Ver Información de Grupos

# Listar todos los grupos
cat /etc/group

# Ver grupos para un usuario específico
groups nombreusuario

# Mostrar grupos del usuario actual
groups

# Ver información detallada del grupo
getent group nombregrupo

# Listar miembros del grupo
getent group nombregrupo | cut -d: -f4

Modificar Grupos

# Renombrar grupo
sudo groupmod -n nuevonombre nombreviejo

# Cambiar GID del grupo
sudo groupmod -g 6000 nombregrupo

# Agregar usuario al grupo
sudo usermod -aG nombregrupo nombreusuario

# Agregar múltiples usuarios al grupo
for user in usuario1 usuario2 usuario3; do
    sudo usermod -aG nombregrupo $user
done

# Eliminar usuario del grupo
sudo gpasswd -d nombreusuario nombregrupo

# Establecer contraseña de grupo (raramente usado)
sudo gpasswd nombregrupo

Eliminar Grupos

# Eliminar grupo
sudo groupdel nombregrupo

# Buscar archivos del grupo antes de la eliminación
sudo find / -group nombregrupo -ls

Grupos Primarios vs Suplementarios

# Ver grupo primario del usuario
id -gn nombreusuario

# Ver todos los grupos (primario + suplementarios)
id -Gn nombreusuario

# Cambiar grupo primario del usuario
sudo usermod -g nuevogrupoprimario nombreusuario

Ejemplo: Organizar usuarios por departamento:

# Crear grupos de departamento
sudo groupadd desarrolladores
sudo groupadd disenadores
sudo groupadd marketing

# Crear usuarios y asignar a grupos
sudo useradd -m -G desarrolladores alicia
sudo useradd -m -G desarrolladores roberto
sudo useradd -m -G disenadores carlos
sudo useradd -m -G marketing diana

# Agregar acceso compartido
sudo usermod -aG www-data alicia
sudo usermod -aG www-data roberto

Paso 3: Comprender los Permisos de Archivos

Leer la Notación de Permisos

# Listar archivos con permisos
ls -l nombrearchivo

# Salida de ejemplo:
# -rw-r--r-- 1 usuario grupo 4096 10 ene 10:00 archivo.txt
#  │││││││││
#  ││││││││└─ Ejecución de otros
#  │││││││└── Escritura de otros
#  ││││││└─── Lectura de otros
#  │││││└──── Ejecución de grupo
#  ││││└───── Escritura de grupo
#  │││└────── Lectura de grupo
#  ││└─────── Ejecución de usuario
#  │└──────── Escritura de usuario
#  └───────── Lectura de usuario

El primer carácter indica el tipo de archivo:

  • -: Archivo regular
  • d: Directorio
  • l: Enlace simbólico
  • c: Dispositivo de caracteres
  • b: Dispositivo de bloques
  • s: Socket
  • p: Tubería con nombre

Valores Numéricos de Permisos

Los permisos se pueden expresar en notación octal (numérica):

  • Lectura (r): 4
  • Escritura (w): 2
  • Ejecución (x): 1

Combinaciones comunes de permisos:

  • 0: --- (sin permisos)
  • 1: --x (solo ejecución)
  • 2: -w- (solo escritura)
  • 3: -wx (escritura y ejecución)
  • 4: r-- (solo lectura)
  • 5: r-x (lectura y ejecución)
  • 6: rw- (lectura y escritura)
  • 7: rwx (lectura, escritura y ejecución)

Conjuntos de permisos comunes:

  • 644: -rw-r--r-- (usuario: rw, grupo: r, otros: r) - Archivo estándar
  • 755: -rwxr-xr-x (usuario: rwx, grupo: rx, otros: rx) - Ejecutable/directorio
  • 700: -rwx------ (usuario: rwx, grupo: ninguno, otros: ninguno) - Privado
  • 600: -rw------- (usuario: rw, grupo: ninguno, otros: ninguno) - Archivo privado
  • 777: -rwxrwxrwx (todos: rwx) - Acceso completo (inseguro, evitar)

Permisos de Directorio

Para los directorios, los permisos tienen significados diferentes:

  • Lectura (r): Listar contenido del directorio
  • Escritura (w): Crear, eliminar, renombrar archivos en el directorio
  • Ejecución (x): Acceder al directorio (entrar en él con cd)
# Permisos comunes de directorio
# 755: Directorio estándar (accesible para todos, escribible por el propietario)
# 775: Directorio compartido (escribible por propietario y grupo)
# 700: Directorio privado (accesible solo por el propietario)
# 1777: Directorio público con sticky bit (como /tmp)

Paso 4: Modificar Permisos de Archivos con chmod

El comando chmod (cambiar modo) modifica los permisos de archivos y directorios.

Modo Simbólico

# Agregar permiso
chmod u+x archivo.txt          # Agregar ejecución para usuario
chmod g+w archivo.txt          # Agregar escritura para grupo
chmod o+r archivo.txt          # Agregar lectura para otros
chmod a+x archivo.txt          # Agregar ejecución para todos

# Eliminar permiso
chmod u-x archivo.txt          # Eliminar ejecución del usuario
chmod g-w archivo.txt          # Eliminar escritura del grupo
chmod o-r archivo.txt          # Eliminar lectura de otros
chmod a-x archivo.txt          # Eliminar ejecución de todos

# Establecer permiso exacto
chmod u=rw archivo.txt         # Usuario: lectura+escritura solamente
chmod g=r archivo.txt          # Grupo: solo lectura
chmod o= archivo.txt           # Otros: sin permisos

# Combinar operaciones
chmod u+x,g+x,o+x archivo.txt  # Agregar ejecución a todos
chmod u=rwx,g=rx,o=r archivo.txt  # Establecer diferentes permisos

Notación simbólica:

  • u: Usuario (propietario)
  • g: Grupo
  • o: Otros
  • a: Todos (usuario, grupo, otros)
  • +: Agregar permiso
  • -: Eliminar permiso
  • =: Establecer permiso exacto

Modo Numérico

# Establecer permisos específicos usando octal
chmod 644 archivo.txt          # rw-r--r--
chmod 755 script.sh            # rwxr-xr-x
chmod 600 privada.key          # rw-------
chmod 700 /home/usuario/.ssh   # rwx------
chmod 400 soloLectura.txt      # r--------

# Establecer permisos recursivamente
chmod -R 755 /var/www/html
chmod -R 644 /var/www/html/*.txt

Ejemplos Prácticos

# Hacer ejecutable un script
chmod +x script.sh
chmod 755 script.sh

# Asegurar clave privada SSH
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 700 ~/.ssh

# Establecer permisos de directorio web
sudo chmod 755 /var/www/html
sudo chmod 644 /var/www/html/*.html

# Asegurar archivos de configuración
sudo chmod 600 /etc/mysql/my.cnf
sudo chmod 640 /etc/nginx/nginx.conf

# Hacer directorio escribible por el grupo
chmod 775 /directorio/compartido

Cambios de Permisos Recursivos

# Cambiar permisos recursivamente
chmod -R 755 /ruta/al/directorio

# Cambiar solo archivos (no directorios)
find /ruta -type f -exec chmod 644 {} \;

# Cambiar solo directorios (no archivos)
find /ruta -type d -exec chmod 755 {} \;

# Hacer ejecutables todos los archivos .sh
find /ruta -type f -name "*.sh" -exec chmod +x {} \;

Paso 5: Cambiar la Propiedad de Archivos con chown

El comando chown (cambiar propietario) modifica la propiedad de archivos y directorios.

Uso Básico de chown

# Cambiar propietario del archivo
sudo chown nombreusuario archivo.txt

# Cambiar propietario y grupo del archivo
sudo chown nombreusuario:nombregrupo archivo.txt

# Cambiar solo el grupo (alternativa a chgrp)
sudo chown :nombregrupo archivo.txt

# Cambiar propiedad recursivamente
sudo chown -R nombreusuario:nombregrupo /ruta/al/directorio

Ejemplos Prácticos de chown

# Cambiar propiedad del directorio home
sudo chown -R juan:juan /home/juan

# Establecer propiedad del servidor web
sudo chown -R www-data:www-data /var/www/html

# Cambiar propiedad de archivos subidos
sudo chown -R nginx:nginx /var/www/uploads

# Establecer propiedad para directorio de aplicación
sudo chown -R usuarioapp:grupoapp /opt/aplicacion

# Cambiar propietario pero preservar grupo
sudo chown nombreusuario /ruta/al/archivo

Usar chgrp

# Cambiar solo la propiedad del grupo
sudo chgrp nombregrupo archivo.txt

# Cambiar grupo recursivamente
sudo chgrp -R desarrolladores /home/compartido

# Múltiples archivos
sudo chgrp www-data *.php

Gestión Avanzada de Propiedad

# Copiar propiedad de archivo de referencia
sudo chown --reference=archivofuente archivodestino

# Salida detallada
sudo chown -v nombreusuario archivo.txt

# Preservar directorio raíz (no seguir enlaces simbólicos)
sudo chown --preserve-root -R usuario:grupo /

# Cambiar propiedad solo si actualmente es de un usuario específico
find /ruta -user usuarioviejo -exec sudo chown nuevousuario {} \;

Paso 6: Configurar Acceso Sudo

Sudo permite a los usuarios ejecutar comandos con privilegios elevados.

Agregar Usuarios al Grupo Sudo

Ubuntu/Debian:

# Agregar usuario al grupo sudo
sudo usermod -aG sudo nombreusuario

# Verificar membresía del grupo
groups nombreusuario

CentOS/Rocky Linux:

# Agregar usuario al grupo wheel
sudo usermod -aG wheel nombreusuario

# Verificar membresía del grupo
groups nombreusuario

Editar el Archivo Sudoers

Siempre use visudo para editar /etc/sudoers para prevenir errores de sintaxis:

# Editar archivo sudoers de forma segura
sudo visudo

Ejemplos de Configuración de Sudoers

# Permitir al usuario ejecutar todos los comandos con sudo
nombreusuario ALL=(ALL:ALL) ALL

# Permitir al usuario ejecutar comandos sin contraseña (usar con precaución)
nombreusuario ALL=(ALL) NOPASSWD: ALL

# Permitir al usuario ejecutar comandos específicos
nombreusuario ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt

# Permitir al grupo ejecutar todos los comandos
%nombregrupo ALL=(ALL:ALL) ALL

# Permitir al usuario ejecutar comandos como usuario específico
nombreusuario ALL=(otrousuario) ALL

# Restringir usuario a comandos específicos
nombreusuario ALL=(ALL) /bin/systemctl restart nginx, /bin/systemctl reload nginx

# Requerir contraseña para todos los comandos excepto específicos
nombreusuario ALL=(ALL) ALL
nombreusuario ALL=(ALL) NOPASSWD: /usr/bin/apt update

Crear Archivos Drop-in de Sudoers

# Crear archivo sudoers para usuario específico
sudo visudo -f /etc/sudoers.d/nombreusuario

# Agregar configuración:
nombreusuario ALL=(ALL) NOPASSWD: /usr/bin/systemctl

# Establecer permisos apropiados
sudo chmod 440 /etc/sudoers.d/nombreusuario

Probar Configuración de Sudo

# Probar acceso sudo
sudo -v

# Listar privilegios sudo
sudo -l

# Ejecutar comando como usuario específico
sudo -u nombreusuario comando

# Ejecutar comando con grupo específico
sudo -g nombregrupo comando

# Sudo con preservación de entorno
sudo -E comando

Paso 7: Implementar Permisos Especiales

Más allá de lectura, escritura y ejecución estándar, Linux tiene tres permisos especiales.

Setuid (SUID) - Establecer ID de Usuario

Permite a los usuarios ejecutar el archivo con los permisos del propietario del archivo.

# Establecer bit SUID
chmod u+s archivo
chmod 4755 archivo

# Ejemplo: el comando passwd tiene SUID
ls -l /usr/bin/passwd
# Salida: -rwsr-xr-x (note la 's' en la posición de ejecución del usuario)

# Eliminar SUID
chmod u-s archivo

Advertencia de seguridad: SUID en scripts de shell es peligroso e ignorado por la mayoría de los sistemas.

Setgid (SGID) - Establecer ID de Grupo

En archivos: Ejecutar con permisos del grupo del archivo En directorios: Los nuevos archivos heredan el grupo del directorio

# Establecer SGID en archivo
chmod g+s archivo
chmod 2755 archivo

# Establecer SGID en directorio (útil para directorios compartidos)
chmod g+s /directorio/compartido
chmod 2775 /directorio/compartido

# Ejemplo: Directorio de proyecto compartido
sudo mkdir /compartido/proyectos
sudo chown :desarrolladores /compartido/proyectos
sudo chmod 2775 /compartido/proyectos

# Ahora todos los archivos creados en /compartido/proyectos heredan el grupo 'desarrolladores'

Sticky Bit

En directorios: Solo el propietario puede eliminar sus archivos (como /tmp)

# Establecer sticky bit
chmod +t directorio
chmod 1777 directorio

# Ejemplo: /tmp tiene sticky bit
ls -ld /tmp
# Salida: drwxrwxrwt (note la 't' al final)

# Crear directorio de subida pública
sudo mkdir /var/www/uploads
sudo chmod 1777 /var/www/uploads

# Los usuarios pueden crear archivos pero solo eliminar los suyos

Ver Permisos Especiales

# Listar archivos con permisos especiales
ls -l

# Buscar archivos con SUID
sudo find / -type f -perm -4000 -ls 2>/dev/null

# Buscar archivos con SGID
sudo find / -type f -perm -2000 -ls 2>/dev/null

# Buscar directorios con sticky bit
sudo find / -type d -perm -1000 -ls 2>/dev/null

Valores Numéricos de Permisos Especiales

  • 4000: SUID
  • 2000: SGID
  • 1000: Sticky bit

Combinado con permisos regulares:

  • 4755: SUID + rwxr-xr-x
  • 2755: SGID + rwxr-xr-x
  • 1777: Sticky + rwxrwxrwx

Paso 8: Gestionar Permisos Predeterminados con umask

Umask define los permisos predeterminados para archivos y directorios recién creados.

Comprender umask

Umask sustrae de los permisos máximos:

  • Archivos: 666 (rw-rw-rw-)
  • Directorios: 777 (rwxrwxrwx)

Valores comunes de umask:

  • 022: Archivos: 644, Directorios: 755 (predeterminado para la mayoría de los sistemas)
  • 002: Archivos: 664, Directorios: 775 (escribible por grupo)
  • 077: Archivos: 600, Directorios: 700 (privado)

Ver y Establecer umask

# Ver umask actual
umask

# Ver en notación simbólica
umask -S

# Establecer umask para la sesión actual
umask 022
umask 002
umask 077

# Establecer umask en el perfil del usuario (persistente)
echo "umask 002" >> ~/.bashrc
echo "umask 002" >> ~/.profile

# Establecer umask en todo el sistema
sudo vi /etc/profile
# o
sudo vi /etc/bash.bashrc

Ejemplos de Cálculo de umask

# umask 022
# Archivos: 666 - 022 = 644 (rw-r--r--)
# Dirs:  777 - 022 = 755 (rwxr-xr-x)

# umask 002
# Archivos: 666 - 002 = 664 (rw-rw-r--)
# Dirs:  777 - 002 = 775 (rwxrwxr-x)

# umask 077
# Archivos: 666 - 077 = 600 (rw-------)
# Dirs:  777 - 077 = 700 (rwx------)

Probar umask

# Establecer umask
umask 022

# Crear archivo y directorio de prueba
touch archivoprueba
mkdir dirprueba

# Verificar permisos
ls -l archivoprueba dirprueba
# archivoprueba: -rw-r--r--
# dirprueba: drwxr-xr-x

Paso 9: Listas de Control de Acceso (ACL)

Las ACL proporcionan un control de permisos más detallado más allá del modelo estándar de usuario/grupo/otros.

Instalar Herramientas ACL

# Ubuntu/Debian
sudo apt install acl -y

# CentOS/Rocky Linux
sudo dnf install acl -y

Ver ACLs

# Ver ACLs del archivo
getfacl nombrearchivo

# Ver ACLs del directorio
getfacl nombredirectorio

# Verificar si las ACL están establecidas (signo + en la salida de ls)
ls -l
# -rw-r--r--+ indica que las ACL están presentes

Establecer ACLs

# Dar a un usuario específico acceso de lectura/escritura
setfacl -m u:nombreusuario:rw nombrearchivo

# Dar a un grupo específico acceso de lectura/ejecución
setfacl -m g:nombregrupo:rx directorio

# Eliminar ACL para usuario específico
setfacl -x u:nombreusuario nombrearchivo

# Eliminar todas las ACL
setfacl -b nombrearchivo

# Establecer ACL predeterminadas para directorio (heredadas por archivos nuevos)
setfacl -d -m u:nombreusuario:rw directorio

# Establecimiento recursivo de ACL
setfacl -R -m u:nombreusuario:rw directorio

Ejemplos Prácticos de ACL

# Permitir a un usuario específico acceder a su directorio home
setfacl -m u:colaborador:rx /home/sunombreusuario
setfacl -m u:colaborador:rw /home/sunombreusuario/compartido.txt

# Configurar directorio de proyecto compartido
sudo mkdir /proyectos/compartido
sudo setfacl -m u:alicia:rwx /proyectos/compartido
sudo setfacl -m u:roberto:rwx /proyectos/compartido
sudo setfacl -d -m u:alicia:rwx /proyectos/compartido
sudo setfacl -d -m u:roberto:rwx /proyectos/compartido

# Dar acceso de solo lectura a usuario específico
setfacl -m u:auditor:r-- /var/log/aplicacion.log

Copiar y Respaldar ACLs

# Respaldar ACLs
getfacl -R /ruta/al/directorio > respaldo_acl.txt

# Restaurar ACLs
setfacl --restore=respaldo_acl.txt

# Copiar ACLs de un archivo a otro
getfacl archivo_fuente | setfacl --set-file=- archivo_destino

Paso 10: Políticas de Contraseñas de Usuario

Implemente políticas de contraseñas para reforzar la autenticación fuerte.

Configurar Calidad de Contraseña

Ubuntu/Debian:

# Instalar biblioteca de calidad de contraseña
sudo apt install libpam-pwquality -y

# Editar configuración
sudo nano /etc/security/pwquality.conf

CentOS/Rocky Linux:

# Instalar biblioteca de calidad de contraseña
sudo dnf install libpwquality -y

# Editar configuración
sudo nano /etc/security/pwquality.conf

Configurar requisitos de contraseña:

# Longitud mínima de contraseña
minlen = 14

# Requerir al menos un dígito
dcredit = -1

# Requerir al menos una mayúscula
ucredit = -1

# Requerir al menos una minúscula
lcredit = -1

# Requerir al menos un carácter especial
ocredit = -1

# Número máximo de caracteres consecutivos
maxrepeat = 3

# Número mínimo de clases de caracteres
minclass = 4

# Verificar contra palabras del diccionario
dictcheck = 1

Políticas de Envejecimiento de Contraseñas

# Editar login.defs
sudo nano /etc/login.defs

# Establecer políticas de envejecimiento de contraseñas:
PASS_MAX_DAYS 90     # Edad máxima de contraseña
PASS_MIN_DAYS 7      # Días mínimos entre cambios
PASS_WARN_AGE 14     # Días de advertencia antes de la expiración
PASS_MIN_LEN 14      # Longitud mínima de contraseña

Gestionar Expiración de Contraseñas

# Establecer expiración de contraseña para usuario
sudo chage -M 90 nombreusuario      # Máximo 90 días
sudo chage -m 7 nombreusuario       # Mínimo 7 días entre cambios
sudo chage -W 14 nombreusuario      # Advertir 14 días antes de la expiración
sudo chage -I 30 nombreusuario      # Inactivo 30 días después de la expiración

# Establecer fecha de expiración
sudo chage -E 2025-12-31 nombreusuario

# Ver información de envejecimiento de contraseña
sudo chage -l nombreusuario

# Forzar cambio de contraseña en el próximo inicio de sesión
sudo chage -d 0 nombreusuario

Políticas de Bloqueo de Cuenta

# Configurar bloqueo de cuenta (faillock)
sudo nano /etc/security/faillock.conf

# Agregar:
deny = 5              # Bloquear después de 5 intentos fallidos
unlock_time = 900     # Desbloquear después de 15 minutos
fail_interval = 900   # Reiniciar contador después de 15 minutos

Ver cuentas bloqueadas:

# Verificar estado de faillock
sudo faillock --user nombreusuario

# Desbloquear usuario
sudo faillock --user nombreusuario --reset

Verificación

Verificar Configuración de Usuario

# Verificar que el usuario existe y tiene la configuración correcta
id nombreusuario
getent passwd nombreusuario

# Verificar membresía de grupo
groups nombreusuario

# Verificar permisos del directorio home
ls -ld /home/nombreusuario

# Verificar acceso SSH
ssh nombreusuario@localhost

Verificar Permisos

# Verificar permisos de archivo
ls -l nombrearchivo

# Verificar permisos de directorio recursivamente
ls -lR /ruta/al/directorio

# Verificar propiedad
stat nombrearchivo

# Verificar ACL
getfacl nombrearchivo

Verificar Acceso Sudo

# Probar acceso sudo
su - nombreusuario
sudo -v

# Listar privilegios sudo
sudo -l

Auditoría Completa de Permisos

# Buscar archivos escribibles por todos (posible problema de seguridad)
sudo find / -type f -perm -002 ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null

# Buscar archivos con bit SUID
sudo find / -type f -perm -4000 2>/dev/null

# Buscar archivos con bit SGID
sudo find / -type f -perm -2000 2>/dev/null

# Buscar archivos sin propietario
sudo find / -nouser -o -nogroup 2>/dev/null

Solución de Problemas

Errores de Permiso Denegado

Problema: El usuario no puede acceder al archivo o directorio.

Solución:

# Verificar permisos de archivo
ls -l nombrearchivo

# Verificar permisos de directorio en la ruta
namei -l /ruta/completa/al/archivo

# Verificar usuario y membresía de grupo
id nombreusuario

# Corregir permisos si es necesario
sudo chmod 755 /ruta/al/directorio
sudo chmod 644 /ruta/al/archivo

# Corregir propiedad
sudo chown nombreusuario:nombregrupo archivo

No Se Puede Ejecutar Script

Problema: El script no se ejecuta a pesar de tener permiso de ejecución.

Solución:

# Verificar si el bit ejecutable está establecido
ls -l script.sh

# Agregar permiso de ejecución
chmod +x script.sh

# Verificar línea shebang
head -n 1 script.sh
# Debe tener: #!/bin/bash o #!/usr/bin/env bash

# Verificar si existe el intérprete
which bash

# Ejecutar explícitamente si es necesario
bash script.sh

Acceso Sudo No Funciona

Problema: Usuario agregado al grupo sudo/wheel pero no puede usar sudo.

Solución:

# Verificar membresía de grupo
groups nombreusuario

# El usuario debe cerrar sesión y volver a iniciarla para que los cambios de grupo surtan efecto
# O forzar actualización de grupo:
newgrp sudo  # Ubuntu/Debian
newgrp wheel # CentOS/Rocky

# Verificar configuración de sudoers
sudo visudo -c

# Verificar que el grupo está configurado en sudoers
grep -E "^%(sudo|wheel)" /etc/sudoers

# Verificar restricciones específicas del usuario
sudo grep nombreusuario /etc/sudoers.d/*

Problemas de Propiedad de Archivos

Problema: Los archivos creados en un directorio compartido tienen el propietario/grupo incorrecto.

Solución:

# Establecer bit SGID en el directorio
chmod g+s /directorio/compartido

# Establecer propiedad de grupo apropiada
chown :grupocompartido /directorio/compartido

# Verificar configuración
ls -ld /directorio/compartido
# Debe mostrar: drwxrwsr-x con 's' en la posición de ejecución del grupo

# Corregir archivos existentes
chown -R :grupocompartido /directorio/compartido

ACL No Funciona

Problema: La configuración de ACL no surte efecto.

Solución:

# Verificar si el sistema de archivos soporta ACL
mount | grep acl

# Si no, remontar con soporte ACL
sudo mount -o remount,acl /

# Hacer permanente en /etc/fstab
sudo nano /etc/fstab
# Agregar 'acl' a las opciones: defaults,acl

# Verificar que las ACL están establecidas
getfacl nombrearchivo
ls -l nombrearchivo
# Debe mostrar signo '+' si las ACL están presentes

Mejores Prácticas

Mejores Prácticas de Gestión de Usuarios

  1. Nunca use root para tareas rutinarias - Siempre use sudo
  2. Implemente el principio de mínimo privilegio - Otorgue permisos mínimos necesarios
  3. Use grupos para la gestión de permisos - Más fácil que gestionar usuarios individuales
  4. Auditorías regulares - Revise cuentas de usuario y permisos trimestralmente
  5. Elimine cuentas no utilizadas - Elimine o bloquee cuentas que ya no se necesitan
  6. Políticas de contraseñas fuertes - Refuerce complejidad y expiración
  7. Documente propósitos de usuarios - Use el campo de comentarios para anotar por qué existe el usuario
  8. Separe usuarios del sistema y regulares - Mantenga rangos de UID distintos

Mejores Prácticas de Permisos

  1. Nunca use permisos 777 - Casi siempre innecesario e inseguro
  2. Proteja archivos sensibles - Use 600 para archivos privados, 400 para secretos de solo lectura
  3. Asegure directorios - Use 755 para públicos, 700 para privados, 750 para compartidos por grupo
  4. Revise archivos SUID - Audite regularmente, minimice el uso
  5. Use ACL para escenarios complejos - Cuando los permisos estándar sean insuficientes
  6. Establezca umask apropiado - Coincida con sus requisitos de seguridad
  7. Monitoree cambios de permisos - Registre y audite modificaciones
  8. Respalde permisos - Incluya en la estrategia de respaldo

Recomendaciones de Seguridad

# Asegurar directorios home
sudo chmod 750 /home/*

# Asegurar directorio SSH
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config

# Asegurar directorios web
sudo chown -R www-data:www-data /var/www
sudo find /var/www -type d -exec chmod 755 {} \;
sudo find /var/www -type f -exec chmod 644 {} \;

# Asegurar archivos de configuración
sudo chmod 640 /etc/mysql/my.cnf
sudo chmod 640 /etc/nginx/nginx.conf
sudo chmod 600 /etc/ssh/sshd_config

# Auditorías regulares de permisos
sudo find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null
sudo find / -type f -perm -002 -ls 2>/dev/null

Plantilla de Documentación

# Crear script de documentación de usuarios
cat << 'EOF' | sudo tee /usr/local/bin/user-audit.sh
#!/bin/bash

echo "=== Informe de Auditoría de Usuarios ==="
echo "Generado: $(date)"
echo ""

echo "=== Usuarios Regulares (UID >= 1000) ==="
awk -F: '$3 >= 1000 {printf "%-15s UID: %5s Grupos: ", $1, $3; system("groups " $1)}' /etc/passwd

echo ""
echo "=== Usuarios con Acceso Sudo ==="
grep -Po '^sudo|wheel.+:\K.*$' /etc/group

echo ""
echo "=== Inicios de Sesión Recientes ==="
last -n 10

echo ""
echo "=== Intentos de Inicio de Sesión Fallidos ==="
sudo grep "Failed password" /var/log/auth.log 2>/dev/null | tail -10

echo ""
echo "=== Archivos con SUID/SGID ==="
sudo find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null | head -20

EOF

sudo chmod +x /usr/local/bin/user-audit.sh

Conclusión

La gestión adecuada de usuarios y permisos es fundamental para la seguridad y administración de sistemas Linux. Al implementar las configuraciones y mejores prácticas descritas en esta guía, ha establecido mecanismos robustos de control de acceso que protegen su servidor mientras permiten que los usuarios legítimos realicen sus tareas de manera eficiente.

Logros clave:

  • Comprensión del modelo de usuarios y permisos de Linux
  • Capacidad para crear, modificar y gestionar cuentas de usuario
  • Competencia en la gestión de grupos para organizar usuarios
  • Dominio de permisos de archivos usando chmod y chown
  • Configuración de acceso sudo para tareas administrativas
  • Implementación de permisos especiales (SUID, SGID, sticky bit)
  • Comprensión de umask para permisos predeterminados
  • Conocimiento de ACL para control de acceso detallado
  • Aplicación de políticas de contraseñas para seguridad

Próximos pasos:

  • Implementar aprovisionamiento automatizado de usuarios para entornos más grandes
  • Configurar autenticación centralizada (LDAP, Active Directory)
  • Configurar registro de auditoría para cambios de permisos
  • Auditorías de seguridad y revisiones de permisos regulares
  • Documentar roles y responsabilidades de usuarios

Recuerde que la gestión de permisos es una responsabilidad continua. Las auditorías regulares, la eliminación oportuna de accesos innecesarios y la adhesión al principio de mínimo privilegio son esenciales para mantener un entorno Linux seguro.

Recursos Adicionales

Guías Relacionadas

  • Configuración Inicial de Seguridad en Ubuntu/Debian
  • Configuración Inicial de Seguridad en CentOS/Rocky Linux
  • Fortalecimiento de Servidores Linux: Guía Completa
  • Gestión de Claves SSH: Generación y Mejores Prácticas
  • Cómo Conectarse a Su Servidor vía SSH