Parte de la serie: Linux
En Linux, la seguridad y la organización del sistema operativo giran en torno a una premisa fundamental: todo es un archivo. Si entiendes cómo controlar quién puede leer, escribir o ejecutar esos archivos, tienes el control del sistema.
Si vienes de Windows, olvida lo que sabes. Aquí la precisión es absoluta y un chmod mal tirado puede romper tu servidor. Vamos a desglosar desde lo básico hasta técnicas avanzadas de gestión de acceso.
1. Gestión de Usuarios y Grupos
Antes de asignar permisos, necesitas entender las entidades a las que se los asignas: Usuarios (Users) y Grupos (Groups). Cada proceso en Linux corre bajo un UID (User ID) y un GID (Group ID).
1.1 Creación de usuarios y grupos
No uses herramientas gráficas. Acostúmbrate a la terminal para automatizar esto después.
# Crear un grupo nuevo llamado 'devops'
sudo groupadd devops
# Crear un usuario 'alex' que pertenezca al grupo principal 'alex'
# y al grupo secundario 'devops', con shell bash y home
sudo useradd -m -s /bin/bash -G devops alex
# Asignar contraseña
sudo passwd alex
1.2 Verificación de identidad
Comprueba siempre qué usuario y grupos tienes asignados.
# Ver tu propia identidad
id
# Ver la de otro usuario
id alex
# Salida esperada: uid=1001(alex) gid=1001(alex) groups=1001(alex),1002(devops)
1.3 Archivos críticos
La información de usuarios y grupos reside en texto plano (excepto las contraseñas hasheadas).
/etc/passwd: Información de usuarios./etc/group: Información de grupos./etc/shadow: Hashes de contraseñas (solo root puede leerlo).
2. El Modelo de Permisos Clásico (UGO)
Linux utiliza el modelo UGO (User, Group, Others) y tres tipos de permisos básicos: r (read), w (write), x (execute).
2.1 Interpretando ls -l
Ejecuta ls -l en cualquier directorio. Verás algo así:
drwxr-xr-x 2 alex devops 4096 oct 25 10:00 scripts
-rw-r--r-- 1 alex devops 512 oct 25 10:05 config.yaml
Desglosemos la primera columna drwxr-xr-x:
- Tipo de archivo (primer carácter):
-: Archivo regular.d: Directorio.l: Enlace simbólico.
- Permisos (9 caracteres siguientes): Se dividen en triadas.
rwx(Dueño/User): El propietarioalextiene control total.r-x(Grupo/Group): El grupodevopspuede leer y ejecutar.r-x(Otros/Others): El resto del mundo puede leer y ejecutar.
2.2 Diferencia entre Archivos y Directorios
Esto confunde a muchos principiantes. El permiso de ejecución (x) no significa lo mismo:
| Permiso | En Archivo | En Directorio |
|---|---|---|
| Read (r) | Ver contenido del archivo. | Listar archivos (ls) dentro de la carpeta. |
| Write (w) | Modificar/Borrar contenido. | Crear/Borrar archivos DENTRO de la carpeta. |
| Execute (x) | Ejecutar como programa/script. | Entrar en la carpeta (cd) y acceder a sus inodos. |
Nota Crítica: Si quitas el permiso
xa un directorio, nadie podrá hacercden él, aunque tengan permiso de lecturar. Podrán listar los nombres de archivos, pero no acceder a sus metadatos ni contenido.
3. Manipulación de Propiedad (Chown) y Modos (Chmod)
3.1 Cambiando el Propietario (chown)
Solo root puede ceder la propiedad de un archivo a otro usuario.
# Cambiar solo el usuario dueño
sudo chown alex archivo.txt
# Cambiar usuario y grupo a la vez (usuario:grupo)
sudo chown alex:devops archivo.txt
# Cambiar recursivamente (toda una carpeta y su contenido)
sudo chown -R www-data:www-data /var/www/html
3.2 Cambiando Permisos (chmod)
Existen dos modos de usar chmod: Simbólico y Octal. Como profesional, debes dominar el Octal por velocidad, pero el Simbólico es útil para ajustes rápidos.
Método Octal (Numérico)
Cada permiso tiene un valor:
- r = 4
- w = 2
- x = 1
Sumas los valores para obtener el número de la triada.
7(4+2+1) =rwx6(4+2) =rw-5(4+1) =r-x0=---
# Permisos estándar para archivos privados (rw- --- ---)
chmod 600 id_rsa
# Permisos estándar para scripts (rwx r-x r-x)
chmod 755 script.sh
# Permisos para documentos compartidos (rw- rw- r--)
chmod 664 proyecto.doc
Método Simbólico
Usas u (user), g (group), o (others) o a (all), seguido de + (agregar), - (quitar) o = (asignar).
# Agregar ejecución al dueño
chmod u+x script.sh
# Quitar escritura a grupo y otros
chmod go-w archivo_critico.conf
# Resetear permisos exactos
chmod u=rw,g=r,o= archivo.txt
4. Permisos Especiales (SUID, SGID, Sticky Bit)
Aquí es donde pasas de usuario básico a administrador. Linux tiene 3 bits especiales que alteran el comportamiento de ejecución y propiedad.
4.1 SetUID (SUID) - Valor 4
Cuando se ejecuta un binario con SUID, corre con los permisos del DUEÑO del archivo, no del usuario que lo lanzó.
- Ejemplo:
/usr/bin/passwd. Necesita ser root para modificar/etc/shadow, pero lo ejecuta un usuario normal. - Identificador: Aparece una
sen la posición del usuario:-rwsr-xr-x.
# Asignar SUID (Cuidado: riesgo de seguridad)
chmod u+s binario_especial
# O en octal (el 4 va delante)
chmod 4755 binario_especial
4.2 SetGID (SGID) - Valor 2
Tiene dos funciones:
- En archivos: Se ejecuta con los permisos del GRUPO del archivo.
- En directorios (Muy útil): Todo archivo creado dentro heredará el grupo del directorio padre, en lugar del grupo principal del usuario que lo creó. Fundamental para carpetas compartidas.
- Identificador: Aparece una
sen la posición del grupo:drwxr-sr-x.
# Crear directorio compartido para desarrolladores
mkdir /srv/dev-shared
chown root:devops /srv/dev-shared
chmod 2775 /srv/dev-shared
# Verificación
# Si el usuario 'alex' crea un archivo ahí, el grupo será 'devops', no 'alex'.
4.3 Sticky Bit - Valor 1
Se usa en directorios con permisos de escritura para todos (como /tmp). Asegura que solo el dueño del archivo (o root) pueda borrarlo, aunque otros tengan permiso de escritura en la carpeta.
- Identificador: Aparece una
tal final:drwxrwxrwt.
# Asignar Sticky Bit
chmod +t /carpeta_publica
# O en octal
chmod 1777 /carpeta_publica
5. Listas de Control de Acceso (ACLs)
El modelo UGO es rígido. ¿Qué pasa si quieres que alex tenga rwx, maria tenga r— y el grupo becarios tenga rw- sobre el mismo archivo? UGO no permite esa granularidad. Usamos ACLs.
5.1 Instalación y Estado
Generalmente vienen instaladas, pero el sistema de archivos debe montarse con soporte ACL (estándar en ext4/xfs modernos).
# Ver ACLs actuales
getfacl archivo.txt
5.2 Asignando ACLs (setfacl)
# Dar permisos específicos al usuario 'maria' (rw) sobre un archivo
setfacl -m u:maria:rw archivo.txt
# Dar permisos a un grupo específico
setfacl -m g:becarios:r archivo.txt
# Eliminar una entrada de ACL específica
setfacl -x u:maria archivo.txt
# Eliminar todas las ACLs (volver a UGO puro)
setfacl -b archivo.txt
5.3 ACLs por defecto (Herencia real)
Si quieres que todos los archivos nuevos en una carpeta tengan ciertos permisos complejos automáticamente:
# La 'd' indica default. Afecta a lo que se cree a futuro.
setfacl -R -m d:u:maria:rwx /proyecto
setfacl -R -m d:g:devops:rx /proyecto
Indicador visual: Si haces un ls -l y ves un + al final de los permisos (ej: -rw-rwxr--+), significa que ese archivo tiene ACLs activas.
6. Inmutabilidad y Atributos (Chattr)
A veces root no es suficiente. Si un hacker consigue root, puede borrar logs o instalar backdoors. Los atributos de archivo son una capa extra de protección a nivel de sistema de archivos (ext4/xfs).
6.1 El bit inmutable (+i)
Ni siquiera root puede borrar, renombrar o modificar un archivo con este bit.
# Hacer un archivo indestructible
sudo chattr +i configuracion_critica.conf
# Intentar borrarlo (fallará incluso con sudo)
sudo rm configuracion_critica.conf
# Error: Operation not permitted
# Quitar el atributo
sudo chattr -i configuracion_critica.conf
6.2 El bit “Append Only” (+a)
Útil para logs. Solo se puede añadir información al final del archivo, pero no se puede sobrescribir ni borrar lo existente.
sudo chattr +a /var/log/mis_logs_seguros.log
6.3 Verificando atributos
ls no muestra esto. Necesitas lsattr.
lsattr archivo_seguro
# Salida: ----i---------e---- archivo_seguro
7. Caso Práctico: Arquitectura de Servidor Web
Vamos a aplicar todo lo aprendido para configurar un entorno web seguro y colaborativo en /var/www/proyecto.
Objetivo:
- El dueño es
deployer. - El grupo es
web-admin. - Los usuarios del grupo
web-adminpueden editar. - Apache/Nginx (usuario
www-data) solo puede leer. - Los archivos nuevos heredan el grupo automáticamente.
7.1 Pasos de implementación
# 1. Crear estructura y asignar propiedad inicial
sudo mkdir -p /var/www/proyecto
sudo chown deployer:web-admin /var/www/proyecto
# 2. Configurar permisos base (Usuario: rwx, Grupo: rwx, Otros: r-x)
# Otros necesita r-x para que Apache (www-data) pueda leer y entrar.
sudo chmod 775 /var/www/proyecto
# 3. Activar el SGID para herencia de grupo
sudo chmod g+s /var/www/proyecto
# Ahora es 2775
# 4. Asegurar permisos recursivos para archivos existentes (si los hubiera)
# Directorios a 2775, Archivos a 0664
find /var/www/proyecto -type d -exec chmod 2775 {} \;
find /var/www/proyecto -type f -exec chmod 0664 {} \;
# 5. Verificación
ls -ld /var/www/proyecto
# Salida esperada: drwxrwsr-x 2 deployer web-admin ...
Con esta configuración, cualquier miembro de web-admin puede desplegar código, los permisos se mantienen consistentes gracias al SGID, y el servidor web puede servir el contenido sin riesgo de modificarlo.