Linux··9 min de lectura

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 contenido
  • w — crear/borrar archivos dentro
  • x — 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í passwd puede modificar /etc/shadow aunque 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 especialeschmod 755 /usr/bin/sudo elimina el setuid. Restauras con chmod 4755.
  • Cambiar recursivamente sin cuidadochmod -R 777 / como root te destruye el sistema. chown -R sobre / 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.

Herramientas relacionadas

Sigue leyendo