Permisos de archivos en Linux: chmod 755, 644 y 777
Los permisos de archivos en Linux deciden quién puede leer, escribir o ejecutar cada archivo y carpeta del sistema. Cada elemento tiene tres clases de usuario (el propietario, un grupo y todos los demás), y cada clase recibe tres bits de permiso: lectura (r), escritura (w) y ejecución (x). Eso son nueve bits por archivo. chmod los establece, y la abreviatura que ves en todas partes es octal: el rwx de cada clase se colapsa en un solo dígito del 0 al 7 (lectura 4 + escritura 2 + ejecución 1).
Tres modos cubren casi todo lo que llegarás a escribir:
- 755 (
rwxr-xr-x) — directorios y scripts: el propietario puede modificarlos, y todos los demás pueden leerlos y ejecutarlos. - 644 (
rw-r--r--) — archivos comunes: el propietario escribe, todos los demás leen. - 777 (
rwxrwxrwx) — acceso completo para todos. Casi siempre es un error; es un agujero de seguridad, no una solución.
Activa cualquier combinación en la calculadora chmod gratuita y observa cómo el octal, la cadena rwx y el comando exacto se actualizan a la vez. El resto de esta guía explica cómo funcionan esos números y dónde encaja cada uno.
Permisos de archivos en Linux en 30 segundos
| Octal | Simbólico | Uso típico |
|---|---|---|
| 400 | r-------- | Clave privada SSH, solo lectura |
| 600 | rw------- | Archivos privados, claves SSH, .env |
| 644 | rw-r--r-- | Páginas web, configuración, la mayoría de archivos |
| 700 | rwx------ | Directorios privados (~/.ssh) |
| 755 | rwxr-xr-x | Scripts, binarios, directorios web |
| 775 | rwxrwxr-x | Directorios compartidos por grupo |
| 777 | rwxrwxrwx | Todos, todo — evítalo |
| 1777 | rwxrwxrwt | Directorios temporales compartidos como /tmp |
Regla general: 644 para archivos, 755 para directorios, y ajusta desde ahí. Afloja un modo solo cuando algo concreto se rompe, nunca de forma preventiva.
El modelo de permisos: propietario, grupo y otros
Tres clases comparten un archivo. El propietario (normalmente quien lo creó), un único grupo y otros, es decir, toda cuenta que no es ni el propietario ni miembro del grupo. Cada clase recibe de forma independiente lectura, escritura y ejecución:
- lectura (r) — ver el contenido de un archivo, o listar las entradas de un directorio.
- escritura (w) — modificar un archivo, o agregar y eliminar entradas en un directorio.
- ejecución (x) — ejecutar un archivo como programa, o entrar (
cd) en un directorio.
El detalle que confunde a la gente: en un directorio, los bits significan algo distinto. r te permite listar nombres, w te permite crear y eliminar entradas dentro, y x te permite atravesarlo para llegar a los archivos de abajo y poder hacer cd. Puedes tener r sin x en un directorio, ejecutar ls sobre él y aun así recibir «Permission denied» en cuanto intentas entrar. Por eso exactamente los directorios son 755, no 644.
Cómo leer una línea de ls -l
Ejecuta ls -l y cada entrada comienza con un bloque de diez caracteres:
$ ls -l
-rw-r--r-- 1 jack staff 1400 Jul 17 10:00 index.html
drwxr-xr-x 5 jack staff 160 Jul 17 10:00 assets
Léelo de izquierda a derecha. El primer carácter es el tipo de archivo, no un permiso: - es un archivo normal, d un directorio, l un enlace simbólico, c o b un dispositivo, p una tubería con nombre, s un socket. Los nueve caracteres siguientes son tres grupos de rwx: propietario, grupo, otros. Así, -rw-r--r-- es un archivo normal donde el propietario lee y escribe (rw-) mientras que grupo y otros solo leen (r-- r--), lo que es 644. drwxr-xr-x es un directorio en 755.
Algunos sistemas añaden un marcador después de los nueve bits. Un . al final indica un contexto de SELinux, un + significa que una ACL agrega reglas más allá de los bits básicos, y en macOS un @ marca atributos extendidos. Ninguno cambia el octal. Ignora el marcador y lee los nueve caracteres.
Notación octal: cómo 755 se convierte en rwxr-xr-x
Los permisos de archivo en octal funcionan porque cada permiso es una potencia de dos:
- lectura = 4
- escritura = 2
- ejecución = 1
Suma los bits que tiene una clase y obtienes su dígito. rwx es 4 + 2 + 1 = 7. r-x es 4 + 1 = 5. r-- es 4. Así que rwxr-xr-x se lee, de tres en tres, como 7 5 5. Haz lo mismo con rw-r--r-- y obtienes 4 + 2, 4, 4 → 644. Ese es todo el truco; los permisos en octal no son más que tres sumas independientes.
Los dígitos de permiso del 0 al 7 de un vistazo
| Dígito | Binario | Permisos |
|---|---|---|
| 0 | 000 | Sin permisos |
| 1 | 001 | Solo ejecución |
| 2 | 010 | Solo escritura |
| 3 | 011 | Escritura + ejecución |
| 4 | 100 | Solo lectura |
| 5 | 101 | Lectura + ejecución |
| 6 | 110 | Lectura + escritura |
| 7 | 111 | Lectura + escritura + ejecución |
El octal es simplemente base 8, así que cada dígito empaqueta tres bits sin solaparse con la clase siguiente. Si la aritmética posicional se te ha oxidado, el convertidor de base muestra cómo la base 8 se corresponde con el binario de la misma forma que lo hace cada dígito de permiso.
chmod 755 vs 644 vs 777: los modos que realmente escribirás
Esta comparación responde de frente a chmod 755 vs 644 vs 777:
| Octal | Simbólico | Propietario | Grupo | Otros | Uso típico | Riesgo |
|---|---|---|---|---|---|---|
| 644 | rw-r--r-- | lectura/escritura | lectura | lectura | Archivos normales | Predeterminado seguro |
| 755 | rwxr-xr-x | todo | lectura/ejec | lectura/ejec | Directorios, scripts | Predeterminado seguro |
| 600 | rw------- | lectura/escritura | — | — | Archivos privados, claves | Muy seguro |
| 700 | rwx------ | todo | — | — | Directorios privados | Muy seguro |
| 775 | rwxrwxr-x | todo | todo | lectura/ejec | Directorios compartidos por grupo | El grupo puede escribir |
| 777 | rwxrwxrwx | todo | todo | todo | (evítalo) | Escribible por todos |
La diferencia entre 755 y 644 es un solo bit: la ejecución. Los directorios, scripts y binarios necesitan x para poder entrar en ellos o ejecutarlos, así que quedan en 755. Un archivo normal como una página HTML, una imagen o una configuración no tiene motivo para ser ejecutable, así que se queda en 644. Confundir los dos está detrás de la mayoría de los errores de permisos cotidianos.
Por qué 777 es peligroso. Entrega acceso de escritura a todas las cuentas de la máquina, incluida una cuenta de servicio comprometida o un proceso web secuestrado. Un directorio raíz de documentos escribible por todos es la vía de manual hacia un sitio desfigurado o malware inyectado, porque cualquiera que llegue a él puede sobrescribir tu código. Cuando una publicación de foro te dice que hagas chmod 777 a algo «para que funcione», el problema real casi siempre es de propiedad, algo que se cubre más abajo.
La excepción del 1777. /tmp es escribible por todos a propósito, pero con una salvaguarda. El modo 1777 agrega el sticky bit, que permite a todos crear archivos mientras impide que los usuarios eliminen o renombren archivos que no les pertenecen. Por eso los directorios temporales compartidos son seguros en 1777 pero nunca en un 777 simple. Escribe 777 en la calculadora chmod y el panel de riesgo lo señala de inmediato, mientras que 1777 se reconoce como el patrón estándar de directorio compartido.
Modo numérico vs simbólico
chmod acepta los mismos bits de dos formas.
El modo numérico (absoluto) indica el resultado completo. chmod 755 file establece los nueve bits en rwxr-xr-x sin importar lo que hubiera antes. Esto es lo que quieres en scripts y despliegues, donde estás imponiendo un estado conocido y correcto.
El modo simbólico (relativo) describe un cambio. chmod u+x file cambia un solo bit (agrega ejecución para el propietario) y deja todo lo demás intacto. chmod u=rwx,go=rx file establece clases completas de forma explícita. El modo simbólico es ideal para ajustes puntuales donde reescribir el modo entero sería excesivo.
# Numeric: overwrite the whole mode
$ chmod 644 report.txt
# Symbolic: change only what you name
$ chmod u+x deploy.sh # add execute for the owner
$ chmod go-w shared.conf # remove write from group and others
$ chmod u=rw,go=r notes.md # set each class explicitly → 644
Una trampa del modo simbólico: chmod +x sin una clase queda filtrado por tu umask. Con la umask común 022, chmod +x script.sh agrega ejecución para todos, así que equivale a chmod a+x. Bajo una umask más estricta como 077 solo afecta al propietario. Cuando quieres un resultado garantizado, nombra la clase: u+x solo para el propietario, a+x para todos.
Permisos especiales: setuid, setgid y el sticky bit
Más allá de los nueve bits estándar, un cuarto dígito octal inicial carga tres modos especiales: setuid, setgid y el sticky bit:
- setuid = 4000 — el programa se ejecuta con los privilegios del propietario del archivo, no los de quien lo invoca. Así es como
passwd, propiedad de root, permite a un usuario común actualizar una base de datos de contraseñas propiedad de root. - setgid = 2000 — la misma idea para el grupo. En un directorio también hace que los archivos nuevos hereden el grupo del directorio, lo que mantiene un proyecto compartido con una propiedad de grupo consistente.
- sticky bit = 1000 — en un directorio compartido, restringe la eliminación para que los usuarios solo puedan quitar sus propios archivos.
/tmpen 1777 es el ejemplo canónico.
$ chmod 4755 /usr/local/bin/mytool # setuid
$ chmod 2775 /srv/shared # setgid on a shared dir
$ chmod 1777 /tmp # sticky bit
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Jul 17 10:00 /usr/bin/passwd
La regla de mayúsculas y minúsculas de s/S y t/T
En ls -l, los bits especiales reutilizan la ranura de ejecución, y el uso de mayúscula o minúscula te dice si la ejecución también está activada. Una s minúscula (setuid/setgid) o t (sticky) significa que el bit especial y la ejecución están activados, el caso normal. Una S o T mayúscula significa que el bit especial está activado pero la ejecución no, lo que suele ser un error, porque un bit especial en un archivo no ejecutable no hace nada útil.
Compara rwsr-xr-x (4755, setuid con ejecución, correcto) con rwSr--r-- (4644, setuid sin ejecución, sospechoso). Siempre que veas una S o T mayúscula, comprueba si alguien quitó el bit de ejecución por accidente.
El detalle de los directorios en GNU
Casi todos los tutoriales explican mal esta diferencia entre plataformas. En Linux (GNU coreutils), un chmod 755 dir numérico no borra un bit setuid o setgid existente en ese directorio. Lo conserva. Si un directorio ya es 2755 (setgid) y ejecutas chmod 755 esperando empezar de cero, el bit setgid permanece, y el directorio en realidad sigue siendo 2755.
Para borrarlo de verdad, sé explícito:
$ chmod 00755 dir # five-digit form zeroes the special digit
$ chmod =755 dir # = clears every bit not listed
$ chmod u-s,g-s dir # remove setuid and setgid by name
BSD y macOS hacen lo contrario: un chmod 755 numérico borra los bits especiales de forma predeterminada. Así que un script de despliegue que «reinicia» los permisos con chmod -R 755 se comporta de forma distinta en una laptop Mac que en un servidor Linux. Esta retención está documentada en el manual de GNU coreutils; en caso de duda, usa la forma de cinco dígitos o u-s,g-s para que el resultado sea idéntico en todas partes.
umask: qué obtienen los archivos recién creados
Rara vez haces chmod a cada archivo a mano; la mayoría obtiene su modo en el momento de la creación, y umask lo decide. Una umask es un conjunto de bits que se desactivan. Los archivos nuevos parten de la base 666 y los directorios nuevos de 777, y la umask enmascara bits:
effective mode = base & ~umask
Los archivos empiezan en 666, no en 777, porque un archivo recién creado no tiene por qué ser ejecutable de forma predeterminada. Ese bit se agrega deliberadamente con chmod +x.
| umask | Archivos nuevos | Directorios nuevos | Significado |
|---|---|---|---|
| 022 | 644 | 755 | Predeterminado — otros leen, no escriben |
| 077 | 600 | 700 | Privado para el propietario |
| 002 | 664 | 775 | Colaboración en grupo |
Trabaja la 022 predeterminada a mano: 666 & ~022 = 666 & 755 = 644, y 777 & ~022 = 755. Comprueba tu valor actual con umask, y establece un valor predeterminado de sesión con, por ejemplo, umask 077 en una máquina donde nada deba ser legible por el grupo ni por todos.
chmod vs chown: permisos vs propiedad
chmod y chown responden a preguntas distintas. chmod cambia lo que el propietario, el grupo y otros pueden hacer: los bits de permiso. chown cambia quiénes son en realidad el propietario y el grupo. Recurrir a 777 suele ser un problema de propiedad disfrazado de permisos.
El caso clásico: un servidor web que corre como www-data no puede escribir en su directorio de subidas. chmod 777 hace desaparecer el error al permitir que todo el mundo escriba, y deja un agujero atrás. La solución correcta asigna la propiedad al proceso que la necesita:
# Wrong: opens the directory to every account on the box
$ sudo chmod -R 777 /var/www/uploads
# Right: give it to the web user, keep a tight mode
$ sudo chown -R www-data:www-data /var/www/uploads
$ sudo find /var/www/uploads -type d -exec chmod 755 {} +
$ sudo find /var/www/uploads -type f -exec chmod 644 {} +
Orden de diagnóstico cuando algo es inesperadamente ilegible: ejecuta ls -l para ver quién lo posee primero, decodifica el modo después, y luego decide si la solución es chown, chmod, o agregar un usuario a un grupo.
Permisos recursivos bien hechos
Un chmod -R 755 . general marca todos los archivos normales como ejecutables, lo que es ruido en el mejor de los casos y un riesgo silencioso en el peor. En su lugar, recurre por tipo:
$ find . -type d -exec chmod 755 {} + # directories → 755
$ find . -type f -exec chmod 644 {} + # files → 644
GNU chmod ofrece un atajo de una línea con la X mayúscula, que agrega ejecución solo a los directorios y a los archivos que ya tienen un bit de ejecución:
$ chmod -R u+rwX,go+rX .
La calculadora chmod genera los comandos find para directorios y archivos por separado para cualquier modo que elijas, así puedes copiar la división correcta en lugar de recurrir a un -R simple.
Buenas prácticas de permisos de archivos en Linux
- Concede el mínimo privilegio que funcione. Empieza desde el modo más restrictivo y abre solo lo que se rompa. Cada bit de escritura de más es superficie de ataque.
- Usa por defecto archivos 644 dentro de directorios 755. Esta combinación sirve para casi cualquier raíz web y copia de repositorio. Los archivos normales rara vez necesitan ejecución; los directorios siempre la necesitan.
- Nunca dejes 777 en nada que un servidor pueda alcanzar. Si varias cuentas deben escribir, usa un grupo compartido con 775 o 2775 (setgid mantiene consistente la propiedad de grupo) en lugar de abrir el modo a todo el mundo.
- Mantén las claves privadas SSH en 600, o en 400 cuando sean definitivas. OpenSSH rechaza de plano las claves privadas legibles por el grupo o por todos. Consulta el manual de OpenSSH para conocer el requisito exacto del archivo de clave. Las claves públicas y
authorized_keysestán bien en 644. - Combina los modos de archivo con otros controles. Los permisos son la base; combínalos con autenticación básica del generador htpasswd cuando una carpeta necesita inicio de sesión, y trata los modos de archivo como una pieza del panorama que cubre nuestra guía de seguridad web esencial.
Preguntas frecuentes
¿Qué significa la d o la l al inicio de drwxr-xr-x?
El primer carácter en una línea de ls -l es el tipo de archivo, no un permiso. d marca un directorio, l un enlace simbólico, - un archivo normal, c o b un dispositivo, p una tubería con nombre, y s un socket. Solo los nueve caracteres que le siguen codifican los bits reales de lectura, escritura y ejecución.
¿Cuál es la diferencia entre una s minúscula y una S mayúscula en los permisos?
Tanto una s minúscula como una S mayúscula significan que el bit setuid o setgid está activado. La s minúscula significa que la ejecución también está activada, el caso de funcionamiento normal. La S mayúscula significa que el bit especial está activado pero la ejecución no (como en 4644), lo que casi siempre es una mala configuración, ya que un bit especial no tiene sentido sin ejecución.
¿Qué es umask y cómo decide los permisos predeterminados?
umask es el conjunto de bits de permiso que se desactivan cuando se crea un archivo. Los archivos nuevos empiezan en la base 666 y los directorios en 777, luego effective = base & ~umask quita los bits enmascarados. La 022 predeterminada da archivos 644 y directorios 755; ejecuta umask para ver la tuya, o umask 077 para un valor predeterminado más privado.
¿Cuándo debo usar 400 o 700 en lugar de 644 o 755?
Usa 400 o 700 cuando un archivo o directorio deba permanecer totalmente privado. 400 (r--------) es un archivo privado de solo lectura, ideal para una clave privada SSH definitiva que nunca editas. 700 (rwx------) es un directorio en el que solo el propietario puede entrar, como ~/.ssh o ~/.gnupg. A diferencia de 644 y 755, no conceden nada a nadie más.
¿Por qué puedo listar un directorio pero no entrar con cd?
Los permisos de directorio separan el listado de la travesía: el bit r te permite listar nombres, el bit x te permite entrar. Un directorio con r pero sin x (un directorio 644) muestra sus nombres con ls pero bloquea cd y cualquier acceso a los archivos de dentro. Agrega ejecución (conviértelo en 755) para que se pueda entrar en él.
¿Funcionan igual los permisos de archivos en macOS que en Linux?
Los permisos de archivos comparten el mismo modelo básico de rwx y octal en ambos, porque los dos siguen POSIX, pero los detalles difieren. BSD y macOS borran el setuid/setgid de un directorio con un chmod numérico de forma predeterminada, mientras que Linux lo conserva. Leer un modo también difiere: stat -c '%a' file en Linux, stat -f '%Lp' file en macOS, y macOS agrega ACL y file flags.
¿Puedo cambiar los permisos de archivos sin la línea de comandos?
Puedes calcular y decodificar permisos sin una terminal. La calculadora chmod gratuita te permite marcar una matriz de permisos, escribir un valor octal, o pegar una línea de ls -l, y luego te devuelve el comando chmod exacto. Aplicarlo a un archivo real todavía necesita ese comando en el servidor, o un cliente gráfico o FTP que exponga los campos de permisos.