FlowingDev

Chmod, explicado: el saludo secreto para tus archivos y carpetas

Entiende los permisos de archivo de Unix, el sistema de derechos de lectura, escritura y ejecución que protege archivos y directorios en Linux, macOS y servidores web.

Probar la herramienta: Calculadora Chmod

En una oración

chmod es el comando de Unix que define quién puede leer, escribir o ejecutar un archivo, actuando como el sistema de control de acceso fundamental para la mayoría de los servidores y máquinas de desarrolladores del mundo.

El problema que resuelve

Imagina los primeros días de la computación: una persona, una máquina, una tarea a la vez. En un sistema así, los permisos de archivo son una solución en busca de un problema. Si eres la única persona que usará la computadora, ¿de quién estás protegiendo los archivos? ¿De ti mismo?

Luego llegó Unix a finales de la década de 1960 en los Laboratorios Bell. Su idea revolucionaria fue ser un sistema operativo multiusuario y multitarea desde su concepción. De repente, tenías a varios programadores conectados al mismo computador mainframe a través de diferentes terminales, todos trabajando al mismo tiempo. Esto creó un problema nuevo y urgente: ¿cómo evitas que Dennis borre accidentalmente (o "accidentalmente") el nuevo compilador de C de Ken? ¿Cómo dejas que tu compañero de proyecto lea tu código pero evitas que lo modifique? ¿Cómo proteges los archivos principales del sistema operativo de un pasante torpe?

La solución fue un sistema de propiedad y permisos, maravillosamente simple y robusto, integrado en el propio sistema de archivos. Cada archivo y directorio tendría un propietario, pertenecería a un grupo y tendría un conjunto específico de permisos para tres clases de usuarios: el propietario, los miembros del grupo y todos los demás.

El comando para "cambiar el modo" de un archivo —es decir, para modificar estos permisos— fue nombrado chmod. Se convirtió en la herramienta universal para que los administradores de sistemas y los usuarios declararan: "Este archivo es mío, y aquí están las reglas para interactuar con él". Resolvió el problema del caos multiusuario de manera tan efectiva que el mismo modelo central se sigue utilizando hoy en día en prácticamente todos los servidores Linux, máquinas con macOS, teléfonos Android y dispositivos de IoT del planeta.

Cómo funciona por debajo del capó

En esencia, el sistema chmod es una matriz de reglas de 3x3, con algunas banderas especiales para darle más estilo. Para entenderlo, necesitas conocer los tres tipos de permisos y las tres clases de usuarios a los que se pueden aplicar.

Los tres permisos: Lectura, Escritura, Ejecución

Todo gira en torno a tres acciones básicas que puedes realizar en un archivo o directorio. Se representan con las letras r, w y x.

  • Lectura (r de read): La capacidad de abrir y ver el contenido de un archivo.
  • Escritura (w de write): La capacidad de modificar, cambiar o eliminar el contenido de un archivo.
  • Ejecución (x de execute): La capacidad de ejecutar el archivo como un programa o script.

Pero aquí viene la primera trampa: estos permisos significan cosas ligeramente diferentes para un directorio. Este es un punto de confusión súper común.

Permiso En un Archivo En un Directorio
Lectura (r) Se puede ver el contenido del archivo Se pueden listar los nombres de los archivos en el directorio (ls)
Escritura (w) Se puede cambiar el contenido del archivo Se pueden crear, renombrar o eliminar archivos dentro del directorio
Ejecución (x) Se puede ejecutar el archivo Se puede entrar al directorio (cd) y acceder a los archivos que contiene

Piensa en ese último punto. Si un directorio no tiene permiso de ejecución para ti, ¡no puedes hacer cd para entrar en él, incluso si puedes ver su contenido! Necesitas el permiso x para pasar por la "puerta" del directorio.

Las tres clases de usuarios: Propietario, Grupo, Otros

Los permisos de Unix no son universales; se asignan a categorías específicas de usuarios.

  • Propietario (u de user): Un único usuario que es dueño del archivo. Típicamente, es la persona que lo creó. El propietario tiene el mayor control.
  • Grupo (g): Cada archivo pertenece a un grupo. Esto permite al propietario compartir el acceso con miembros específicos del equipo. Por ejemplo, todos los archivos del "Proyecto Apolo" podrían pertenecer al grupo apollo-devs.
  • Otros (o): Literalmente, todos los demás. Cualquier usuario en el sistema que no sea el propietario y no pertenezca al grupo del archivo.

Cuando ves una cadena de permisos como rwxr-xr--, en realidad son tres conjuntos de permisos rwx unidos para Propietario, Grupo y Otros, en ese orden.

  • rwx: El Propietario puede leer, escribir y ejecutar.
  • r-x: El Grupo puede leer y ejecutar, pero no escribir.
  • r--: Otros solo pueden leer.

Las dos notaciones: Simbólica vs. Octal

Hay dos maneras de decirle a chmod lo que quieres, y los desarrolladores están constantemente traduciendo entre ellas.

1. Notación Simbólica (la forma "amigable") La notación simbólica usa las letras que ya hemos aprendido (r, w, x y u, g, o, a donde a significa "all", todos). Usas + para agregar un permiso, - para quitarlo y = para establecerlo de forma exacta.

# Darle al propietario permiso de ejecución
$ chmod u+x mi_script.sh

# Quitar el permiso de escritura para el grupo y otros
$ chmod go-w datos_sensibles.txt

# Establecer permisos exactos: propietario puede leer/escribir, grupo puede leer, otros sin acceso
$ chmod u=rw,g=r,o= config.yml

Esto es genial para hacer cambios pequeños y específicos.

2. Notación Octal (la forma "nerd") La notación octal es más rápida, más común en scripts y se basa en el sistema binario. Cada permiso (r, w, x) es un bit en un número de 3 bits.

  • r (lectura) es el primer bit, con un valor de 4.
  • w (escritura) es el segundo bit, con un valor de 2.
  • x (ejecución) es el tercer bit, con un valor de 1.

Sumas los números para obtener los permisos que deseas.

Número Binario (rwx) Permisos Otorgados
0 000 (---) Ninguno
1 001 (--x) Ejecución
2 010 (-w-) Escritura
3 011 (-wx) Escritura y ejecución
4 100 (r--) Lectura
5 101 (r-x) Lectura y ejecución
6 110 (rw-) Lectura y escritura
7 111 (rwx) Lectura, escritura, ejecución

Un código octal de tres dígitos como 755 representa los permisos para Propietario, Grupo y Otros.

chmod 755 mi_script.sh significa:

  • Propietario: 7 (rwx) - Leer, escribir y ejecutar.
  • Grupo: 5 (r-x) - Leer y ejecutar.
  • Otros: 5 (r-x) - Leer y ejecutar.

Este es un permiso muy común para scripts ejecutables que son seguros para que otros los ejecuten. Un permiso común para un archivo es 644 (el propietario puede leer/escribir, todos los demás solo pueden leer).

Los invitados especiales: SUID, SGID y el Sticky Bit

Más allá de los básicos rwx, hay tres modos especiales, representados por un cuarto dígito octal al principio (p. ej., chmod 4755).

  • SUID (Set User ID) - Octal 4: Cuando un archivo ejecutable con este bit se ejecuta, lo hace con los permisos del propietario del archivo, no del usuario que lo ejecutó. El ejemplo clásico es el comando passwd, que necesita modificar el archivo protegido /etc/shadow. El ejecutable passwd es propiedad de root y tiene el bit SUID activado, por lo que cuando un usuario normal lo ejecuta, obtiene temporalmente privilegios de root solo para esa operación. Es poderoso pero peligroso.
  • SGID (Set Group ID) - Octal 2: Similar al SUID, pero un ejecutable se ejecuta con la identidad del grupo del archivo. Más útil aún, cuando se establece en un directorio, cualquier nuevo archivo o directorio creado dentro de él heredará automáticamente el grupo del directorio padre, no el grupo principal del usuario creador. Esto es esencial para las carpetas de proyectos compartidas.
  • Sticky Bit - Octal 1: Este tiene una historia extraña, pero hoy en día se usa casi exclusivamente en directorios. Cuando un directorio tiene el sticky bit (como la carpeta /tmp del sistema), todos los usuarios pueden crear archivos en él, pero un usuario solo puede eliminar o renombrar los archivos que él mismo posee. Evita que la gente se meta con las cosas de los demás en un espacio compartido.

Historias del mundo real

El caso del script que no se podía ejecutar

Un desarrollador junior, Alex, escribe un brillante script de shell para automatizar el despliegue de un servidor. Hace commit de deploy.sh a Git. En el servidor de producción, clona el repositorio, teclea ./deploy.sh y presiona Enter. La respuesta: bash: ./deploy.sh: Permission denied. Pánico. ¿Rompió el servidor? Un desarrollador senior teclea calmadamente ls -l deploy.sh y le muestra la salida: -rw-r--r--. El archivo tenía permisos de lectura y escritura, pero no de ejecución (x). Git no conserva los permisos de ejecución por defecto. Un rápido chmod +x deploy.sh después, el script se ejecutó perfectamente. Lección: Los archivos, especialmente los que provienen de fuentes como Git o archivos zip, no son ejecutables por defecto. Debes otorgar explícitamente el permiso para ejecutarlos.

La pesadilla de la carpeta de proyecto compartida

Un equipo de diseño y un equipo de desarrollo necesitaban compartir recursos en una carpeta en un servidor Linux: /data/project-x. El administrador del sistema puso a todos en el grupo project-x-team y le dio al grupo acceso de escritura a la carpeta. Pero se desató el caos. Cuando un diseñador subía un archivo, era propiedad de diseñador:diseñadores, y los desarrolladores no podían modificarlo. Cuando un desarrollador creaba una subcarpeta, era propiedad de desarrollador:desarrolladores, y los diseñadores no podían agregar archivos. Todos le pedían constantemente al sysadmin que arreglara los permisos. ¿La solución? El admin ejecutó chmod g+s /data/project-x. Esto activó el bit SGID en el directorio. A partir de entonces, cada nuevo archivo y carpeta creado dentro de /data/project-x heredó automáticamente el grupo project-x-team. La armonía fue restaurada. Lección: SGID en un directorio es la forma correcta y no un "hack" para gestionar carpetas de grupo compartidas.

El agujero de seguridad del sitio web público

Un desarrollador web freelance lanzó un sitio web simple en PHP para un cliente. Por comodidad, dejó el archivo de configuración de la base de datos, config.inc.php, en el mismo directorio que la página de inicio. El archivo contenía el nombre de usuario y la contraseña de la base de datos en texto plano. Sus permisos eran el 644 por defecto (-rw-r--r--), lo que significaba que el usuario del servidor web podía leerlo (bien), pero también podía hacerlo cualquier persona en el planeta que adivinara la URL. Un escáner de seguridad encontró el archivo y el atacante descargó las credenciales de la base de datos. La solución debería haber sido chmod 600 config.inc.php, haciéndolo legible solo por el propietario (el proceso del servidor web). Lección: Nunca asumas que los permisos por defecto son seguros. Los archivos sensibles como configuraciones y claves privadas deben ser bloqueados para ser lo más restrictivos posible.

Errores y trampas comunes

  • El martillazo de chmod 777. Cuando se frustran, muchos se sienten tentados a ejecutar chmod -R 777 . en un directorio. Esto le da recursivamente a todo el mundo permiso para leer, escribir y ejecutar todo. Es una vulnerabilidad de seguridad catastrófica y el equivalente digital a quitar las puertas de tu casa y dejar un cartel que dice "Cosas gratis adentro". No lo hagas.
  • Olvidar el permiso x en los directorios. Puedes tener permiso r en un archivo pero no poder acceder a él porque no tienes permiso x en uno de los directorios padres en su ruta. Necesitas permiso de ejecución en todos los directorios que desees atravesar.
  • El misterio de umask. ¿Alguna vez te has preguntado por qué los nuevos archivos que creas son 644 y no 777? Es tu umask en acción. Un umask es una "máscara" que tu shell aplica, eliminando permisos de los archivos y directorios a medida que se crean. Un umask común de 022 elimina el permiso de "escritura" para el Grupo y Otros, convirtiendo un 666 predeterminado en 644.
  • Pensar que chmod +x es lo mismo que chmod 755. No lo es. chmod 755 mi_archivo establece los permisos de forma absoluta. chmod +x mi_archivo agrega el bit de ejecución para cualquier clase de usuario (propietario, grupo, otros) que ya tenga el bit de lectura, sin cambiar ningún otro bit. El modo simbólico es relativo; el modo octal es absoluto.

Por qué debe estar en tu radar

Si usas una línea de comandos que no sea de Windows, necesitas entender chmod. No es opcional. Este conocimiento es crucial cuando:

  • Despliegas cualquier aplicación en un servidor Linux.
  • Escribes scripts (Shell, Python, Node.js) que necesitan ser ejecutados.
  • Trabajas con Git, que tiene sus propias ideas sobre los permisos de archivo.
  • Configuras recursos compartidos de archivos o entornos colaborativos.
  • Refuerzas la seguridad de un servidor restringiendo el acceso a archivos sensibles.
  • Usas Docker, donde los permisos de archivo dentro del contenedor son primordiales.

chmod es uno de los primeros y más fundamentales comandos que separa a un usuario casual de un verdadero operador de sistemas o desarrollador. Entenderlo es un rito de iniciación para controlar la máquina, no solo para usarla.

Para profundizar

Teoría lista. Hora de ensuciarse las manos — 100% en tu navegador.

Probar la herramienta: Calculadora Chmod