Saltar al contenido

Linux

chmod explicado: permisos de archivos en Unix sin adivinar

10 min de lectura

«¿Por qué no puedo borrar este archivo?» es la primera pregunta clásica en Linux. La respuesta casi siempre es que tienes permiso de escritura sobre el archivo, pero el directorio que lo contiene no te lo permite — y los números de chmod no tienen sentido hasta que dejas de leer 644 como un código abstracto. En cuanto ves que cada dígito de permiso es solo tres interruptores (leer, escribir, ejecutar) sumados en un número, todo el sistema se abre. Esta guía va desde esa única idea hasta los números octales, la salida de ls -l y los valores por defecto de cada día, como 644 y 755, que mantienen a los servidores web y a los directorios personales haciendo lo correcto.

Cada archivo tiene tres dueños: propietario, grupo, otros

Cada archivo y directorio en Unix lleva una pequeña tarjeta de identidad que dice quién puede hacer qué. Tres identidades importan, y cada carácter de permiso en un listado aparece una vez por identidad:

  • Propietario (u) — el usuario que creó el archivo. Aquí se suele asumir el control total.
  • Grupo (g) — los usuarios que comparten un grupo con el propietario. La membresía es como cooperan los equipos sin abrirlo todo al mundo.
  • Otros (o) — todos los demás del sistema. El público.

A cada identidad se le cuelgan tres acciones: leer (r), escribir (w) y ejecutar (x). Su significado cambia sutilmente cuando el objeto es un directorio en lugar de un archivo, y es ahí donde nace la mayor parte de la confusión.

Los números octales: por qué 4, 2 y 1

La forma numérica de chmod — lo que todo el mundo teclea de verdad — son tres dígitos octales, uno por identidad, siempre en el orden propietario, grupo, otros. Cada dígito es una suma de valores de acción: leer vale 4, escribir 2, ejecutar 1. Como son potencias de dos (4 + 2 + 1 = 7), cada suma del 0 al 7 describe una combinación única, nunca ambigua:

OctalSimbólicoSignificado
7rwxLeer, escribir y ejecutar
6rw-Leer y escribir, sin ejecutar
5r-xLeer y ejecutar, sin escribir
4r--Solo leer
3-wxSolo escribir y ejecutar
2-w-Solo escribir
1--xSolo ejecutar
0---Sin permisos

Así que 644 se descompone en 6 para el propietario (leer + escribir), 4 para el grupo (solo leer) y 4 para otros (solo leer). La raya es simplemente «este interruptor está apagado»: rw- significa leer y escribir, ejecutar apagado.

Leer la salida de ls -l: qué significa -rwxr-xr--

Mira la primera columna de ls -l. Es la cadena de diez caracteres que intimida a la gente sin ninguna razón:

$ ls -l
-rw-r--r--  1 mustafa web   18740 sep 16 09:12 index.html
drwxr-xr-x  2 mustafa web    4096 sep 16 09:12 assets
-rw-------  1 mustafa web     512 sep 16 09:12 id_rsa

El primer carácter es el tipo: - para un archivo normal, d para un directorio, l para un enlace simbólico. Los nueve restantes son tres tríos — propietario, grupo, otros — cada uno con las posiciones fijas r w x y una raya donde falta un derecho. Así que -rw-r--r-- es un archivo cuyo propietario puede leer y escribir, mientras que el resto solo puede leer; drwxr-xr-x es un directorio donde el propietario tiene libertad total y grupo más otros pueden leer y atravesar.

La herramienta de Convrs regenera exactamente esta cadena a partir de las mismas casillas que marcarías a mano, lo que hace seguro interiorizar el paso de «marcar r, w, x» al texto final.

chmod 644 frente a 755: por qué archivos y directorios se llevan mal

Los dos argumentos de chmod más comunes en la práctica son 644 y 755. Ambos dejan al propietario con control total y dan a todos lectura; la diferencia está en el bit de ejecución para grupo y otros. En archivos normales, ejecutar es un privilegio raro y deliberado — no quieres que cualquier archivo sea ejecutable. En directorios significa otra cosa: tránsito.

Para entrar en un directorio, listar su contenido, abrir un archivo dentro o alcanzar cualquier cosa anidada bajo él, necesitas el bit x en el propio directorio. No es opcional. De ahí la regla práctica del administrador:

  • Archivos: 644 (rw-r--r--) — legibles por todos, escribibles por el propietario, ejecutables solo cuando de verdad debe ser.
  • Directorios: 755 (rwxr-xr-x) — todos pueden entrar y leer; solo el propietario modifica.

Los mismos valores por defecto alimentan a los servidores web

Nginx y Apache sirven archivos que el usuario web puede leer, dentro de directorios que el usuario web puede atravesar: 644 para archivos, 755 para directorios. Las claves privadas se quedan en 600 (solo propietario) y tu carpeta ~/.ssh debería ser 700 — el propietario lee/escribe/ejecuta, nadie más. Si aplicas esto, los sitios en producción se rompen mucho menos.

Notación simbólica: u+x, g-w, a=r

El octal es genial para fijar un conjunto completo de permisos; pero para un único cambio quirúrgico, la forma simbólica se lee mejor. La sintaxis es el destinatario (u propietario, g grupo, o otros, a todos), el operador (+ añadir, - quitar, = fijar exacto) y las letras r, w, x. Unos ejemplos cotidianos:

$ chmod u+x script.sh        # el propietario puede ejecutar
$ chmod g-w config.php       # el grupo ya no puede escribir
$ chmod a=r notes.txt        # todos: exactamente leer, nada más
$ chmod u=rw,g=r,o= file.txt # propietario rw, grupo r, otros nada

a=r es un truco que conviene conocer: = fija en exacto, así que a=r quita a todos la escritura y la ejecución — no se limita a añadir lectura.

Bits especiales: suid, sgid y el bit sticky

Tres bits extra rara vez se necesitan, pero conviene reconocerlos. setuid (chmod u+s, visible como s en la columna de ejecución del propietario) hace que un programa corra con los privilegios del dueño del archivo — así /usr/bin/passwd escribe en un archivo que los usuarios normales no pueden tocar. setgid (chmod g+s) hace lo mismo para el grupo y, en directorios, hace que los archivos nuevos hereden el grupo del directorio padre. El bit sticky (chmod +t, visible como t) aparece como el último carácter: en directorios donde todos escriben significa «todos pueden crear archivos aquí, pero solo el dueño borra el suyo». /tmp es el ejemplo canónico — ls -ld /tmp muestra drwxrwxrwt.

Con moderación, por favor

setuid y setgid son tijeras de seguridad: un error otorga a usuarios sin privilegios poderes elevados. En veinte años, un administrador de sistemas medio los cambia menos veces de las que crees.

El momento de tener cuidado: el reflejo del 777

La mayor fuente de agujeros de seguridad por permisos en Linux son los chmod -R 777 que pueblan las respuestas de Stack Overflow. 777 se lo da todo a todos, y -R lo aplica recursivamente a cada archivo y directorio por debajo. Un solo chmod -R 777 mal colocado en un directorio web deja tus archivos subidos ejecutables para todo el mundo y permite que cualquier script futuro lea tus copias de seguridad.

La solución honesta rara vez son permisos más laxos; son dueños equivocados. Ejecuta el servidor web como su propio usuario, haz que tus archivos sean de ese usuario y deja que 644/755 hagan el resto. Cuando algo dice «permiso denegado», chmod -R 777 enmascara el síntoma en lugar de revelar el verdadero problema de propietario o grupo.

Calcula chmod sin adivinar en Convrs

La calculadora de chmod de Convrs reproduce la misma lógica que las tablas de arriba: marca leer, escribir y ejecutar para propietario, grupo y otros, cambia el interruptor archivo/directorio, y obtienes al instante el valor octal (chmod 644), la cadena simbólica (-rw-r--r--) y botones de copiar para ambos. Todo corre en tu navegador: los números que calculas para un servidor de producción nunca salen de tu dispositivo.

Buy me a coffee