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:
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 |
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¶
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:
-R→ aplica a todo lo existented: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 | ❌ | ✅ | ✅ |