Permisos en Linux: chmod, chown y cuándo usar cada nivel
Guía práctica del sistema de permisos POSIX: los tres tríos, notación octal, setuid/setgid/sticky, y buenas prácticas para no acabar con un chmod 777.
El modelo POSIX en 30 segundos
Cada archivo tiene un propietario (user), un grupo y todos los demás (other). Cada uno de estos tres actores tiene tres permisos: read (r), write (w) y execute (x). En total nueve bits. Para directorios el significado cambia ligeramente:
r— listar contenidow— crear/borrar archivos dentrox— entrar (acceder a metadatos y a archivos por nombre)
Notación octal: los dígitos
Cada trío se traduce a un número:
rwx= 7 (4+2+1)rw-= 6 (4+2)r-x= 5 (4+1)r--= 4-w-= 2--x= 1---= 0
Así 755 es rwxr-xr-x: el owner puede todo, el resto solo lee y ejecuta. Nuestra calculadora chmod hace la conversión en cualquier dirección.
Los permisos por defecto (umask)
Cuando creas un archivo nuevo, el sistema aplica 0666 & ~umask. Con umask 022 (default en la mayoría de distros) los archivos nuevos nacen con 644 (rw-r--r--) y los directorios con 755.
En entornos multi-usuario endurecidos usa umask 027 (o 077 para máximo aislamiento): los nuevos archivos serán 640 y los directorios 750, invisibles a "other".
Bits especiales: setuid, setgid, sticky
Los cuatro números que a veces ves (4755) son 12 bits, no 9:
- setuid (4000) — un ejecutable con setuid corre con los permisos del propietario del archivo, no de quien lo ejecuta. Así
passwdpuede modificar/etc/shadowaunque tú seas un usuario normal. Peligrosísimo si el propietario es root: un fallo en el binario escala privilegios. - setgid (2000) — igual pero para grupo. Aplicado a un directorio, hace que los archivos nuevos hereden el grupo del directorio (útil en carpetas compartidas).
- sticky bit (1000) — solo el propietario puede borrar sus archivos. Es el permiso mágico de
/tmp: cualquiera escribe, pero solo tú borras lo tuyo.
Ver bits especiales:
find / -perm -4000 -type f 2>/dev/null # setuid — auditar mensualmente
find / -perm -2000 -type f 2>/dev/null # setgid
chown: dueño y grupo
chown alice archivo # cambiar dueño
chown alice:devs archivo # dueño y grupo
chown -R alice:devs /app # recursivo
chgrp devs archivo # solo grupo
Regla: el proceso debe ser dueño de los archivos que necesita escribir. Un servicio corriendo como nginx no debe escribir en un directorio propiedad de root:root, y tampoco en uno con 777.
ACLs: cuando POSIX se queda corto
Si tres actores no bastan (varios grupos con distintos permisos sobre el mismo archivo), usa ACLs POSIX:
setfacl -m u:bob:rw archivo # dar rw a bob
setfacl -m g:auditores:r /var/log # el grupo auditores lee logs
setfacl -m d:u:app:rw /var/lib/app # default: nuevos archivos heredan
getfacl archivo # ver ACL completa
Un signo + al final del ls -l indica que hay ACLs extendidas.
Casos reales y comandos correctos
Claves SSH:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 # privada
chmod 644 ~/.ssh/id_ed25519.pub # pública
chmod 644 ~/.ssh/authorized_keys
Directorio compartido de un equipo:
chown root:equipo /srv/compartido
chmod 2770 /srv/compartido # setgid + rwx grupo, cero others
Todos los archivos nuevos heredarán el grupo equipo y serán editables por todo el grupo.
Web app tras deploy:
chown -R www-data:www-data /var/www/app
find /var/www/app -type d -exec chmod 750 {} \;
find /var/www/app -type f -exec chmod 640 {} \;
chmod 660 /var/www/app/storage/*.log # los que la app deba escribir
Errores clásicos
- chmod 777 — abrir escritura a todo el mundo. Si un tutorial te dice que hagas 777, el tutorial está mal. El problema es de ownership o de grupo.
- chown -R root:root en un webroot — el servicio no podrá escribir uploads ni sesiones.
- Perder los bits especiales —
chmod 755 /usr/bin/sudoelimina el setuid. Restauras conchmod 4755. - Cambiar recursivamente sin cuidado —
chmod -R 777 /como root te destruye el sistema.chown -Rsobre/es igual de peligroso.
Checklist de auditoría
1. find / -perm -o=w -type f — archivos escribibles por others (deberían ser muy pocos) 2. find / -perm -4000 — ejecutables setuid (revisa que solo estén los del sistema) 3. find / -nouser -o -nogroup — archivos huérfanos tras borrar usuarios 4. ls -la /var/log/ — logs deben ser 640 root:adm o similar, no world-readable si contienen datos sensibles
Los permisos POSIX son un modelo sencillo con esquinas peligrosas. Aprenderlos una vez ahorra años de chmod 777 desperados.