Saltar a contenido

Linux - Permisos

El sistema clásico (chmod)

Cada archivo tiene tres bloques de permisos:

-  rw-  r--  r--
↑   ↑    ↑    ↑
│   │    │    └── otros usuarios
│   │    └─────── grupo
│   └──────────── dueño
└──────────────── tipo (- archivo, d directorio)

Cada permiso tiene un valor numérico:

r = 4  (leer)
w = 2  (escribir)
x = 1  (ejecutar / entrar a directorio)
- = 0  (sin permiso)

Se suman por bloque: rwx = 7, rw- = 6, r-- = 4, r-x = 5

Valores más comunes

Número Permisos Uso típico
600 rw------- Archivos privados (.env, claves SSH)
644 rw-r--r-- Archivos normales
700 rwx------ Directorios privados (.ssh/)
755 rwxr-xr-x Directorios normales
chmod 644 archivo.txt
chmod -R 755 /opt/docker/mi-servicio/

Limitación de chmod

Solo tiene tres bloques fijos: dueño, grupo, otros. No se puede dar acceso a un usuario específico sin afectar a todos los demás. Para eso existe setfacl.


chown — Cambiar el dueño

chown usuario:grupo archivo         # cambia dueño y grupo
chown matias archivo                # solo cambia el dueño
chown :matias archivo               # solo cambia el grupo
chown -R matias:matias /directorio/ # recursivo

En Docker

Los contenedores usan UIDs internos que no existen en el host. Linux solo compara números, no nombres. Si un contenedor corre como UID 1000 y los archivos del host son 1000:1000, tiene acceso — no importa que en el host UID 1000 sea matias y en el contenedor sea appuser.

# Ver con qué usuario corre un contenedor
docker exec nombre-contenedor id

# Ver dueños de archivos con números (no nombres)
ls -lan /opt/docker/servicio/

⚠️ Si el archivo lo crea Docker, no cambiar el dueño con chown — rompe el acceso del contenedor. Usar setfacl de solo lectura o editar desde adentro del contenedor.

# Editar un archivo desde adentro del contenedor (sin tocar permisos del host)
docker exec -it nombre-contenedor nano /ruta/dentro/del/contenedor/archivo

setfacl — Control de acceso granular ⭐

chmod tiene solo tres bloques. setfacl permite agregar reglas para usuarios individuales encima del sistema clásico, sin cambiar el dueño ni afectar a otros.

Sintaxis básica

# Dar permiso de lectura a matias en un directorio
sudo setfacl -m u:matias:rX /ruta/

# Recursivo (archivos y carpetas existentes)
sudo setfacl -R -m u:matias:rX /ruta/

# Recursivo + default (archivos futuros también heredan el permiso)
sudo setfacl -R -m u:matias:rX,d:u:matias:rX /ruta/

Permisos disponibles

Letra Permiso
r leer
w escribir
x ejecutar / entrar a directorio
X entrar a directorio (solo si ya es ejecutable) — más seguro que x en recursivo

Ver ACLs de un archivo o directorio

getfacl /ruta/archivo

Quitar un ACL

sudo setfacl -R -x u:matias /ruta/        # quitar solo el de matias
sudo setfacl -R -b /ruta/                 # quitar todos los ACLs

Caso de uso típico en el homelab

Cuando un contenedor Docker crea archivos como root y necesitás leerlos para backup sin cambiar el dueño:

sudo setfacl -R -m u:matias:rX,d:u:matias:rX /opt/docker/adguard
  • -R → aplica a todo lo existente
  • d:u:matias:rX → los archivos nuevos que cree Docker también heredan el permiso
  • El dueño sigue siendo root, el contenedor no se entera de nada

¿Por qué no usar chmod o chown en su lugar?

chmod chown setfacl
Usuarios específicos
No rompe acceso de Docker
Herencia en archivos nuevos ✅ (con -d)
Requiere root para aplicar