tutoriales.com

Configuración y Gestión Avanzada de Usuarios y Grupos en Linux: Permisos y ACLs 🛡️

Este tutorial profundiza en la gestión avanzada de usuarios y grupos en sistemas Linux, cubriendo desde la creación y modificación hasta la implementación de permisos de ficheros, permisos especiales y Listas de Control de Acceso (ACLs). Aprenderás a fortalecer la seguridad y optimizar la administración de tu servidor Linux.

Intermedio20 min de lectura13 views
Reportar error

La gestión de usuarios y grupos es una piedra angular en la administración de cualquier sistema Linux. Comprender cómo crear, modificar y eliminar usuarios y grupos, así como manejar sus permisos asociados, es crucial para la seguridad, la estabilidad y la eficiencia de tu entorno. Este tutorial te guiará a través de las complejidades de estos conceptos, desde lo básico hasta técnicas avanzadas como las ACLs y los permisos especiales.

🚀 Introducción a Usuarios y Grupos en Linux

En Linux, cada proceso y cada archivo está asociado a un usuario y un grupo. Esto es fundamental para el modelo de seguridad del sistema operativo, que controla quién puede hacer qué y a qué recursos puede acceder. Imagina un sistema operativo como una gran comunidad: los usuarios son los individuos, y los grupos son los diferentes clubes o departamentos a los que pertenecen.

¿Por qué son importantes los usuarios y grupos?

  • Seguridad: Restringen el acceso a recursos críticos, evitando que usuarios no autorizados modifiquen o lean archivos sensibles.
  • Administración: Permiten organizar a los usuarios según sus roles y responsabilidades, simplificando la aplicación de políticas de seguridad.
  • Auditoría: Cada acción realizada en el sistema se registra con el ID del usuario que la realizó, facilitando el seguimiento y la resolución de problemas.
💡 Consejo: Siempre opera con el principio de mínimo privilegio. Asigna a los usuarios solo los permisos necesarios para realizar sus tareas.

🧑‍💻 Gestión Básica de Usuarios

Para interactuar con el sistema de usuarios en Linux, utilizaremos varias herramientas de línea de comandos. Estas herramientas son universales en la mayoría de las distribuciones.

Creación de Usuarios con useradd

El comando useradd es la herramienta principal para crear nuevas cuentas de usuario.

sudo useradd -m -s /bin/bash -c "Nombre Completo del Usuario" nombre_de_usuario
  • -m: Crea el directorio home del usuario (/home/nombre_de_usuario).
  • -s /bin/bash: Establece /bin/bash como el shell predeterminado para el usuario. Otros shells comunes incluyen /bin/sh o /bin/zsh.
  • -c "Nombre Completo del Usuario": Añade un comentario o descripción para el usuario.

Ejemplo:

sudo useradd -m -s /bin/bash -c "Juan Pérez" juanp

Establecer Contraseña con passwd

Después de crear un usuario, es esencial establecer una contraseña para que pueda iniciar sesión.

sudo passwd nombre_de_usuario

El sistema te pedirá que ingreses la nueva contraseña dos veces.

Modificación de Usuarios con usermod

El comando usermod permite cambiar atributos de un usuario existente.

OpciónDescripciónEjemplo
---------
-lCambiar nombre de usuariosudo usermod -l nuevo_nombre_usuario antiguo_nombre_usuario
-dCambiar directorio homesudo usermod -d /nuevo/home/path nombre_de_usuario
---------
-sCambiar shellsudo usermod -s /bin/zsh nombre_de_usuario
-aGAñadir a grupos adicionalessudo usermod -aG adm,lpadmin nombre_de_usuario
---------
-eEstablecer fecha de expiraciónsudo usermod -e YYYY-MM-DD nombre_de_usuario
🔥 Importante: Para cambiar el nombre de un usuario (`-l`), el usuario no debe estar conectado al sistema.

Eliminación de Usuarios con userdel

Para eliminar un usuario del sistema, usa userdel.

sudo userdel nombre_de_usuario

Para eliminar también el directorio home del usuario y su spool de correo:

sudo userdel -r nombre_de_usuario
⚠️ Advertencia: `userdel -r` elimina permanentemente el directorio home del usuario y su contenido. Asegúrate de hacer una copia de seguridad si es necesario.

👥 Gestión Básica de Grupos

Los grupos son colecciones de usuarios. Permiten asignar permisos a múltiples usuarios de una sola vez, simplificando la administración.

Creación de Grupos con groupadd

sudo groupadd nombre_de_grupo

Ejemplo:

sudo groupadd desarrolladores

Modificación de Grupos con groupmod

Al igual que usermod, groupmod permite modificar un grupo existente.

sudo groupmod -n nuevo_nombre_grupo antiguo_nombre_grupo

Eliminación de Grupos con groupdel

sudo groupdel nombre_de_grupo
📌 Nota: No se puede eliminar un grupo si es el grupo primario de algún usuario. Primero, asigna un nuevo grupo primario a esos usuarios o elimínalos.

🔍 Verificación de Usuarios y Grupos

Es fundamental saber cómo ver la información de usuarios y grupos para verificar la configuración.

  • id nombre_de_usuario: Muestra el ID de usuario (UID), ID de grupo primario (GID) y los grupos a los que pertenece el usuario.
  • groups nombre_de_usuario: Muestra solo los grupos a los que pertenece el usuario.
  • /etc/passwd: Contiene información sobre cada usuario (nombre de usuario, UID, GID, directorio home, shell).
  • /etc/shadow: Almacena las contraseñas cifradas y la información de caducidad.
  • /etc/group: Contiene información sobre cada grupo (nombre de grupo, GID, miembros del grupo).
id juanp
groups juanp
cat /etc/passwd | grep juanp

🔐 Permisos de Ficheros y Directorios (Modo Tradicional)

El sistema de permisos tradicional de Linux es fundamental para controlar el acceso a los recursos. Cada archivo y directorio tiene un propietario (usuario) y un grupo propietario, y se le asignan permisos para el propietario, el grupo y "otros".

Entendiendo los Permisos

Los permisos se representan con una secuencia de 10 caracteres, como -rwxr-xr--.

  1. Tipo de archivo (1er carácter):
    • -: Archivo regular
    • d: Directorio
    • l: Enlace simbólico
  2. Permisos para el propietario (3 caracteres): rwx (lectura, escritura, ejecución)
  3. Permisos para el grupo (3 caracteres): r-x
  4. Permisos para otros (3 caracteres): r--
⚠️ Advertencia: La "ejecución" para un directorio significa la capacidad de entrar en él y listar su contenido (si también tiene permiso de lectura).

Cambiar Propietario y Grupo Propietario con chown y chgrp

  • chown: Cambia el propietario de un archivo o directorio.
sudo chown nuevo_propietario archivo.txt
sudo chown -R nuevo_propietario:nuevo_grupo_propietario /ruta/a/directorio/
  • chgrp: Cambia el grupo propietario de un archivo o directorio.
sudo chgrp nuevo_grupo archivo.txt
O, más comúnmente, usar `chown` con la sintaxis `usuario:grupo`.

Cambiar Permisos con chmod

chmod es el comando para cambiar los permisos de acceso. Se puede usar en formato simbólico o numérico (octal).

Formato Simbólico

  • u: usuario (propietario), g: grupo, o: otros, a: todos
  • +: añadir permiso, -: quitar permiso, =: establecer permisos exactos
  • r: lectura, w: escritura, x: ejecución

Ejemplos:

chmod u+x mi_script.sh         # Añade permiso de ejecución al propietario
chmod g-w archivo.txt          # Quita permiso de escritura al grupo
chmod o=r archivo.txt          # Establece solo lectura para otros
chmod a+rw directorio/         # Añade lectura y escritura para todos (peligroso!)
chmod -R u+rwX,go-w /mi/app    # Recursivamente: propietario rwx, grupo y otros sin escritura. 'X' da ejecucion a directorios si tienen lectura/escritura y a archivos si ya son ejecutables.

Formato Numérico (Octal)

Cada permiso (lectura, escritura, ejecución) tiene un valor numérico:

  • r (lectura) = 4
  • w (escritura) = 2
  • x (ejecución) = 1
  • - (ningún permiso) = 0

Se suma el valor de los permisos para cada categoría (propietario, grupo, otros).

PermisoValorDescripción
---------
rwx7Lectura, escritura, ejecución
rw-6Lectura, escritura
---------
r-x5Lectura, ejecución
r--4Solo lectura
---------
--x1Solo ejecución
---0Sin permisos

Ejemplos:

chmod 755 mi_script.sh         # Propietario rwx, Grupo r-x, Otros r-x
chmod 644 archivo.txt          # Propietario rw-, Grupo r--, Otros r--
chmod 700 mi_directorio/       # Solo el propietario tiene rwx
📌 Nota: Los permisos comunes para archivos son `644` y para directorios `755`. Los scripts ejecutables suelen ser `755` o `700`.

✨ Permisos Especiales (SUID, SGID, Sticky Bit)

Además de los permisos estándar, Linux ofrece tres permisos especiales que añaden capas adicionales de control y funcionalidad.

SUID (Set User ID) - 4xxx

Cuando se establece el bit SUID en un ejecutable, el programa se ejecuta con los permisos del propietario del archivo, no del usuario que lo ejecuta. Es muy útil para programas que necesitan acceso privilegiado, como passwd.

  • Se representa con una s en lugar de x en la parte del propietario (rwsr-xr-x).

Ejemplo: El comando passwd necesita escribir en /etc/shadow, un archivo al que solo root tiene acceso.

# Ver los permisos de passwd
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root 47032 Sep 27  2023 /usr/bin/passwd

Para establecer SUID:

chmod u+s mi_programa.sh
# o en octal
chmod 4755 mi_programa.sh
⚠️ Advertencia: Usar SUID incorrectamente puede crear serias vulnerabilidades de seguridad. Úsalo con extrema precaución y solo en programas de confianza.

SGID (Set Group ID) - 2xxx

El bit SGID tiene dos usos:

  1. En ejecutables: El programa se ejecuta con los permisos del grupo propietario del archivo, no del grupo primario del usuario que lo ejecuta. Se representa con una s en lugar de x en la parte del grupo (rwxr-sr-x).
  2. En directorios: Todos los archivos y subdirectorios creados dentro de ese directorio heredarán el grupo propietario del directorio padre, en lugar del grupo primario del usuario que los creó. Esto es muy útil para directorios de trabajo compartidos.

Para establecer SGID:

chmod g+s mi_ejecutable.sh
chmod g+s /mi/directorio_compartido/
# o en octal
chmod 2775 mi_ejecutable.sh
chmod 2775 /mi/directorio_compartido/

Sticky Bit - 1xxx

Cuando se establece el sticky bit en un directorio, solo el propietario de un archivo dentro de ese directorio (o root) puede eliminarlo o renombrarlo, incluso si otros usuarios tienen permisos de escritura en el directorio. Es común en directorios públicos como /tmp.

  • Se representa con una t en lugar de x en la parte de "otros" (rwxrwxrwt).

Ejemplo:

ls -ld /tmp
# drwxrwxrwt 14 root root 4096 Apr  9 10:30 /tmp

Para establecer Sticky Bit:

chmod o+t /mi/directorio_publico/
# o en octal
chmod 1777 /mi/directorio_publico/
📌 Nota: Los bits especiales se usan con `chmod` añadiendo un prefijo numérico (4, 2 o 1) al inicio de los permisos octales. Por ejemplo, `4755` para SUID, `2775` para SGID, `1777` para Sticky Bit.

📋 Listas de Control de Acceso (ACLs)

El sistema de permisos tradicional es simple pero a veces insuficiente. Las ACLs (Access Control Lists) permiten una granularidad de permisos mucho mayor, pudiendo especificar permisos para usuarios y grupos específicos más allá del propietario, el grupo propietario y "otros".

🔥 Importante: Para usar ACLs, tu sistema de archivos (por ejemplo, `ext4`) debe estar montado con la opción `acl`. Esto suele ser el caso por defecto.

Instalación de Herramientas ACL

Si no están instaladas, puedes instalarlas:

  • Debian/Ubuntu: sudo apt install acl
  • CentOS/RHEL/Fedora: sudo yum install acl o sudo dnf install acl

Visualizar ACLs con getfacl

Para ver las ACLs de un archivo o directorio:

getfacl archivo_o_directorio

Salida de ejemplo:

# file: mi_archivo.txt
# owner: juanp
# group: desarrolladores
user::rw-
group::r--
other::r--

Establecer ACLs con setfacl

setfacl es el comando para modificar las ACLs.

Sintaxis básica

setfacl -m u:usuario:permisos archivo_o_directorio  # Modificar/Añadir ACL para un usuario
setfacl -m g:grupo:permisos archivo_o_directorio  # Modificar/Añadir ACL para un grupo

Los permisos se especifican con r (lectura), w (escritura), x (ejecución).

Ejemplos:

  1. Dar permisos de lectura y escritura al usuario pedro sobre informe.txt:
setfacl -m u:pedro:rw informe.txt
getfacl informe.txt
Verás una nueva entrada `user:pedro:rw-` y una entrada `mask`. La máscara es el máximo de permisos efectivos que pueden tener los usuarios o grupos definidos por ACLs.

2. Dar permisos de ejecución al grupo testers sobre el directorio scripts_qa:

setfacl -m g:testers:r-x scripts_qa/
getfacl scripts_qa/
  1. Eliminar una ACL específica:
setfacl -x u:pedro informe.txt
  1. Eliminar todas las ACLs (excepto las estándar):
setfacl -b archivo_o_directorio

ACLs por defecto en directorios (-d)

Para que los nuevos archivos y subdirectorios creados dentro de un directorio hereden las ACLs, debes establecer ACLs por defecto con la opción -d.

setfacl -m d:u:pedro:rwx /proyecto/compartido/

Ahora, cualquier archivo o directorio creado en /proyecto/compartido/ tendrá pedro con permisos rwx por defecto.

ACLs Recursivas (-R)

Para aplicar ACLs a un directorio y a todo su contenido de forma recursiva:

setfacl -R -m u:ana:r-x /documentos/
⚠️ Advertencia: Las ACLs pueden complicar el entendimiento de los permisos. Usa `getfacl` con frecuencia para verificar. Cuando se usan ACLs, el campo de permisos tradicional de `ls -l` mostrará un `+` al final (ej: `-rwxr-xr-x+`).
Propietario ¿Es el usuario el dueño del archivo? No ACL de Usuario ¿Tiene una ACL específica definida? No ACL de Grupo ¿Es miembro de un grupo con ACL? No Grupo Propietario ¿Pertenece al grupo dueño? (Sin ACL) No Otros Permisos para el resto de usuarios

🛡️ Gestión de Permisos con sudo

El comando sudo (substitute user do) permite a usuarios autorizados ejecutar comandos como root u otro usuario, de forma controlada y segura, sin compartir la contraseña de root.

El archivo sudoers

La configuración de sudo se encuentra en el archivo /etc/sudoers. Siempre edita este archivo con el comando visudo, que valida la sintaxis antes de guardar, evitando dejar el sistema inutilizable si hay un error.

sudo visudo

Una línea típica en sudoers se ve así:

nombre_de_usuario ALL=(ALL:ALL) ALL
  • nombre_de_usuario: El usuario al que se le concede el permiso.
  • ALL=(ALL:ALL):
    • Primer ALL: Puede ejecutarse desde cualquier host.
    • Segundo (ALL): Puede ejecutar comandos como cualquier usuario.
    • Tercer :ALL: Puede ejecutar comandos como cualquier grupo.
  • ALL: Puede ejecutar cualquier comando.

Concediendo permisos específicos

Para dar más granularidad, puedes especificar qué comandos puede ejecutar un usuario o grupo.

Ejemplo: Permitir al usuario desarrollador reiniciar el servicio Apache y gestionar directorios específicos:

User_Alias WEBADMINS = desarrollador
Cmnd_Alias APACHECTL = /usr/sbin/systemctl restart apache2, /usr/sbin/systemctl stop apache2
Cmnd_Alias WEBDIRS = /bin/mkdir /var/www/html/proyectos/*, /bin/rm -rf /var/www/html/proyectos/*

WEBADMINS ALL=(root) NOPASSWD: APACHECTL, WEBDIRS
  • NOPASSWD: El usuario no necesita introducir su contraseña para ejecutar estos comandos. ¡Úsalo con precaución!

Grupos sudo o wheel

Muchas distribuciones tienen un grupo sudo (Debian/Ubuntu) o wheel (CentOS/RHEL) que ya tiene permisos para ejecutar comandos con sudo. Simplemente añade el usuario a ese grupo:

sudo usermod -aG sudo juanp
# O en CentOS/RHEL
sudo usermod -aG wheel juanp

Después de añadir un usuario a un grupo, es posible que deba cerrar la sesión y volver a iniciarla para que los cambios surtan efecto.

💡 Consejo: Para verificar los permisos de sudo de un usuario sin ejecutar comandos, puedes usar `sudo -l -U nombre_de_usuario`.

📝 Mejores Prácticas de Gestión de Usuarios y Grupos

Adoptar buenas prácticas es esencial para mantener un sistema seguro y fácil de administrar.

  • Principio de Mínimo Privilegio: Asigna solo los permisos necesarios. No des acceso root a menos que sea absolutamente imprescindible.
  • Usuarios con Rol Específico: Crea usuarios para roles específicos (ej. web_admin, db_user) en lugar de usar usuarios genéricos.
  • Grupos para Colaboración: Utiliza grupos para compartir acceso a recursos entre múltiples usuarios. Es más fácil añadir/quitar usuarios de un grupo que modificar permisos en cada archivo.
  • Contraseñas Fuertes: Fuerza el uso de contraseñas complejas y periodos de caducidad.
  • Auditoría Regular: Revisa periódicamente las cuentas de usuario, los grupos y los permisos para asegurarte de que sigan siendo adecuados.
  • Elimina Cuentas Inactivas: Deshabilita o elimina cuentas de usuarios que ya no necesiten acceso.
  • Usa sudo en lugar de su -: sudo proporciona un registro de qué comandos ejecutó quién, mejorando la auditabilidad.
  • Documenta tu Configuración: Mantén un registro claro de quién tiene acceso a qué y por qué.
⚠️ Advertencia: Nunca uses la cuenta `root` para tareas diarias o no administrativas. Siempre usa una cuenta de usuario normal y eleva privilegios con `sudo` cuando sea necesario.

📊 Escenario Práctico: Configurando un Servidor Web Compartido

Imagina que tienes un servidor web y varios desarrolladores necesitan acceder a diferentes proyectos, pero con permisos controlados.

Objetivo:

  • Un directorio /var/www/proyectos.
  • Dos proyectos: proyecto_a y proyecto_b.
  • Desarrolladores dev1 y dev2.
  • dev1 necesita acceso completo a proyecto_a y solo lectura a proyecto_b.
  • dev2 necesita acceso completo a proyecto_b y solo lectura a proyecto_a.
  • Los archivos creados dentro de cada proyecto deben mantener la propiedad del grupo webdevs.

Pasos:

  1. Crear el grupo y usuarios:
sudo groupadd webdevs
sudo useradd -m -s /bin/bash -g webdevs dev1
sudo useradd -m -s /bin/bash -g webdevs dev2
sudo passwd dev1
sudo passwd dev2
  1. Crear los directorios de proyectos:
sudo mkdir -p /var/www/proyectos/proyecto_a
sudo mkdir -p /var/www/proyectos/proyecto_b
sudo chown -R root:webdevs /var/www/proyectos
sudo chmod -R 2775 /var/www/proyectos # SGID para heredar grupo, rwx para propietario y grupo, r-x para otros
  1. Configurar ACLs específicas:

    • dev1 en proyecto_a (completo), proyecto_b (lectura):
sudo setfacl -m u:dev1:rwx /var/www/proyectos/proyecto_a
sudo setfacl -m d:u:dev1:rwx /var/www/proyectos/proyecto_a
sudo setfacl -m u:dev1:r-x /var/www/proyectos/proyecto_b
sudo setfacl -m d:u:dev1:r-x /var/www/proyectos/proyecto_b
*   `dev2` en `proyecto_b` (completo), `proyecto_a` (lectura):
sudo setfacl -m u:dev2:rwx /var/www/proyectos/proyecto_b
sudo setfacl -m d:u:dev2:rwx /var/www/proyectos/proyecto_b
sudo setfacl -m u:dev2:r-x /var/www/proyectos/proyecto_a
sudo setfacl -m d:u:dev2:r-x /var/www/proyectos/proyecto_a
  1. **Verificar ACLs (como dev1 o dev2):
getfacl /var/www/proyectos/proyecto_a
getfacl /var/www/proyectos/proyecto_b

Con esta configuración, dev1 y dev2 tienen el acceso preciso que necesitan, y cualquier archivo nuevo creado en proyecto_a o proyecto_b heredará el grupo webdevs gracias al bit SGID, simplificando la colaboración.

⚠️ Advertencia: Recuerda siempre hacer pruebas exhaustivas de los permisos después de cualquier cambio, utilizando diferentes usuarios para verificar que el acceso sea el esperado.

💡 Recursos Adicionales y Herramientas

Para seguir profundizando en la gestión de usuarios y grupos, considera explorar:

  • man pages: Siempre son tu mejor amigo. man useradd, man chmod, man setfacl.
  • PAM (Pluggable Authentication Modules): Un sistema modular para autenticación que permite configurar políticas de seguridad avanzadas, como la complejidad de contraseñas, bloqueos de cuenta, etc.
  • LDAP (Lightweight Directory Access Protocol): Para entornos con muchos usuarios y servidores, LDAP centraliza la gestión de identidades.
  • Herramientas de automatización: Ansible, Puppet o Chef pueden ayudarte a gestionar usuarios y permisos en múltiples servidores de manera programática.

Conclusión 🎯

La gestión de usuarios, grupos y permisos en Linux es un pilar fundamental para la seguridad y administración efectiva de cualquier sistema. Dominar los comandos useradd, groupadd, chmod, chown, setfacl y sudo te empoderará para construir entornos robustos, seguros y eficientes. Recuerda siempre seguir las mejores prácticas y priorizar el principio de mínimo privilegio para proteger tus sistemas de accesos no deseados.

¡Ahora estás listo para aplicar estas técnicas avanzadas en tus propios servidores Linux!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!