Alex Sarmiento
ES / EN

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:

  1. Tipo de archivo (primer carácter):
    • -: Archivo regular.
    • d: Directorio.
    • l: Enlace simbólico.
  2. Permisos (9 caracteres siguientes): Se dividen en triadas.
    • rwx (Dueño/User): El propietario alex tiene control total.
    • r-x (Grupo/Group): El grupo devops puede 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:

PermisoEn ArchivoEn 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 x a un directorio, nadie podrá hacer cd en él, aunque tengan permiso de lectura r. 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) = rwx
  • 6 (4+2) = rw-
  • 5 (4+1) = r-x
  • 0 = ---
# 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 s en 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:

  1. En archivos: Se ejecuta con los permisos del GRUPO del archivo.
  2. 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 s en 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 t al 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:

  1. El dueño es deployer.
  2. El grupo es web-admin.
  3. Los usuarios del grupo web-admin pueden editar.
  4. Apache/Nginx (usuario www-data) solo puede leer.
  5. 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.