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 más buscados, uno a uno
- chmod 755 (
rwxr-xr-x): el dueño puede leer, escribir y ejecutar; el resto solo leer y ejecutar. Es el valor correcto para directorios y para scripts o binarios compartidos. - chmod 644 (
rw-r--r--): estándar para archivos de contenido: HTML, CSS, imágenes, configuraciones no sensibles. - chmod 600 (
rw-------): solo el dueño. Obligatorio en claves privadas,.env, tokens y credenciales de base de datos. - chmod 700: carpeta privada del usuario, típico en
~/.ssh. - chmod 775 / 664: cuando un grupo entero debe escribir (deploys en equipo) combinado con setgid.
- chmod 777: absolutamente todo el mundo puede escribir y ejecutar. No es una solución: si algo "solo funciona con 777", el problema es el propietario o el grupo. Comprueba el valor exacto con la calculadora chmod.
Del número a los bits en 10 segundos
Cada dígito es la suma de lectura (4), escritura (2) y ejecución (1):
7 = 4+2+1 = rwx 5 = 4+1 = r-x 4 = r--
6 = 4+2 = rw- 3 = 2+1 = -wx 0 = ---
Y el orden es siempre usuario, grupo, otros. Así que 640 es rw-r-----: dueño escribe, grupo lee, nadie más entra.
Ejemplos nuevos de uso real
WordPress / PHP sin exponerse:
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod 600 wp-config.php
chmod 775 wp-content/uploads
Script de backup en cron:
chmod 750 /usr/local/bin/backup.sh # ejecutable por root y su grupo
chmod 600 /etc/backup.env # credenciales
Carpeta de intercambio tipo /tmp (sticky bit):
chmod 1777 /srv/intercambio # cada usuario solo borra lo suyo
Deshacer un 777 mal dado:
sudo chown -R www-data:www-data /var/www/app
sudo find /var/www/app -type d -exec chmod 755 {} \;
sudo find /var/www/app -type f -exec chmod 644 {} \;
Herramientas relacionadas
Genera el valor octal exacto con la calculadora chmod, automatiza el ajuste con el generador de scripts Bash y programa la auditoría periódica con el generador de crontab o un servicio systemd.
Los permisos POSIX son un modelo sencillo con esquinas peligrosas. Aprenderlos una vez ahorra años de chmod 777 desperados.
Preguntas frecuentes
?¿Qué significa chmod 777 y por qué es peligroso?
777 concede lectura, escritura y ejecución al dueño, al grupo y a cualquier otro usuario del sistema. Cualquier proceso o cuenta comprometida puede modificar o sustituir el archivo, así que nunca debe usarse en webroots ni scripts.
?¿Cuándo uso 755 y cuándo 644?
755 para directorios y para archivos que deban ejecutarse; 644 para archivos de datos o contenido. Un directorio necesita el bit de ejecución para poder entrar en él.
?¿Cómo cambio permisos solo a los directorios y no a los archivos?
Con find: find ruta -type d -exec chmod 755 {} \; para directorios y find ruta -type f -exec chmod 644 {} \; para archivos. También sirve chmod -R a+X, que añade ejecución solo donde tiene sentido.
?¿Por qué SSH rechaza mi clave privada?
Porque tiene permisos demasiado abiertos. La clave debe ser 600 y el directorio ~/.ssh 700; si otros pueden leerla, OpenSSH la ignora por seguridad.
?¿Qué diferencia hay entre chmod y chown?
chmod cambia los permisos (qué se puede hacer), chown cambia el propietario y el grupo (quién puede hacerlo). Muchos problemas atribuidos a permisos se resuelven en realidad con el chown correcto.
?¿Qué son setuid, setgid y sticky bit?
Son bits especiales: setuid (4000) ejecuta el programa con los privilegios del dueño, setgid (2000) fuerza el grupo heredado en directorios, y el sticky bit (1000) impide que un usuario borre archivos ajenos en carpetas compartidas como /tmp.