
Linux chmod sin misterios: permisos de archivos sin dolores de cabeza
📷 Pixabay / PexelsLinux chmod sin misterios: permisos de archivos sin dolores de cabeza
La notación octal (755, 644) y el modo simbólico (u+x) finalmente tienen sentido. Patrones comunes de permisos y precauciones de seguridad incluidos.
Introducción
Cada archivo y directorio en un sistema Linux tiene un conjunto de permisos que determina quién puede leerlo, escribirlo o ejecutarlo. Entender estos permisos es fundamental para trabajar con Linux, ya sea que estés administrando un servidor web, desplegando aplicaciones o simplemente organizando archivos en tu máquina de desarrollo.
El comando chmod es la herramienta principal para modificar estos permisos. A pesar de su aparente simplicidad, chmod tiene suficiente profundidad para que incluso los desarrolladores experimentados ocasionalmente busquen una referencia. Esta guía cubre todo lo que necesitas saber sobre los permisos de archivos Linux y el comando chmod, desde conceptos básicos hasta permisos especiales avanzados.
Entendiendo los permisos de archivos en Linux
Los permisos de archivos Linux se construyen alrededor de tres tipos de acceso y tres categorías de usuarios.
Los tres tipos de permisos
- Lectura (r): Ver el contenido de un archivo, o listar el contenido de un directorio.
- Escritura (w): Modificar o eliminar un archivo, o agregar y quitar archivos dentro de un directorio.
- Ejecución (x): Ejecutar un archivo como programa o script, o entrar a un directorio con
cd.
Las tres categorías de usuarios
- Propietario (u): El usuario que posee el archivo. Por defecto, es el usuario que lo creó.
- Grupo (g): El grupo asignado al archivo. Todos los usuarios de este grupo comparten los permisos del grupo.
- Otros (o): Todos los demás usuarios del sistema que no son el propietario ni están en el grupo del archivo.
Cada archivo en un sistema Linux tiene exactamente un propietario, pertenece exactamente a un grupo y tiene un conjunto definido de permisos para cada una de estas tres categorías.
Cómo leer las cadenas de permisos
Cuando ejecutas ls -l en una terminal, ves una salida como esta:
ls -l
-rwxr-xr-- 1 alice developers 4096 Mar 22 10:30 deploy.sh
drwxr-x--- 2 alice developers 4096 Mar 22 10:30 config/
La primera columna es la cadena de permisos. Tiene diez caracteres y se desglosa así:
d rwx r-x r--
| | | |
| | | +-- Permisos de otros (solo lectura)
| | +------ Permisos del grupo (lectura + ejecución)
| +---------- Permisos del propietario (lectura + escritura + ejecución)
+------------- Tipo de archivo (d = directorio, - = archivo regular, l = enlace simbólico)
Cada posición es la letra del permiso o un guion (-) que indica que ese permiso no está otorgado. Aquí hay varios ejemplos:
| Cadena de permisos | Significado |
|---|---|
-rw-r--r-- | El propietario puede leer/escribir. El grupo y otros solo pueden leer. |
-rwxr-xr-x | El propietario tiene acceso completo. El grupo y otros pueden leer y ejecutar. |
drwx------ | Directorio. Solo el propietario puede leer, escribir y entrar. |
-rw------- | Solo el propietario puede leer y escribir. Sin acceso para nadie más. |
-rwxrwxrwx | Acceso completo para todos. Generalmente un riesgo de seguridad. |
Notación octal (numérica)
La notación octal representa los permisos como un número de tres dígitos, donde cada dígito corresponde al propietario, grupo y otros respectivamente. Cada dígito es la suma de los valores de permisos:
| Valor | Permiso |
|---|---|
| 4 | Lectura (r) |
| 2 | Escritura (w) |
| 1 | Ejecución (x) |
| 0 | Sin permiso |
Sumas estos valores para cada categoría de usuario. Por ejemplo:
- 7 = 4 + 2 + 1 = lectura + escritura + ejecución (rwx)
- 6 = 4 + 2 = lectura + escritura (rw-)
- 5 = 4 + 1 = lectura + ejecución (r-x)
- 4 = 4 = solo lectura (r--)
- 0 = sin permisos (---)
Entonces cuando ves chmod 755, significa:
7 = rwx (propietario: lectura + escritura + ejecución)
5 = r-x (grupo: lectura + ejecución)
5 = r-x (otros: lectura + ejecución)
Aquí hay una referencia rápida para todos los valores posibles de dígitos:
0 = --- (sin permisos)
1 = --x (solo ejecución)
2 = -w- (solo escritura)
3 = -wx (escritura + ejecución)
4 = r-- (solo lectura)
5 = r-x (lectura + ejecución)
6 = rw- (lectura + escritura)
7 = rwx (lectura + escritura + ejecución)
Si necesitas convertir rápidamente entre cadenas de permisos y valores octales, usa nuestra calculadora chmod para resultados instantáneos.
Notación simbólica
La notación simbólica usa letras y operadores para modificar permisos. Suele ser más intuitiva para hacer cambios específicos porque no necesitas especificar el conjunto completo de permisos.
La sintaxis
chmod [quién][operador][permiso] archivo
Quién:
u-- propietario (user)g-- grupoo-- otrosa-- todos (propietario + grupo + otros)
Operador:
+-- agregar permiso--- quitar permiso=-- establecer permiso exacto
Permiso:
r-- lecturaw-- escriturax-- ejecución
Ejemplos en modo simbólico
# Agregar permiso de ejecución para el propietario
chmod u+x script.sh
# Quitar permiso de escritura del grupo y otros
chmod go-w config.yml
# Establecer solo lectura para todos
chmod a=r readme.txt
# Agregar lectura y ejecución para el grupo
chmod g+rx shared-tool
# Quitar todos los permisos para otros
chmod o= private.key
# Agregar ejecución para todos, quitar escritura para otros
chmod a+x,o-w deploy.sh
# Establecer propietario a rwx, grupo a rx, otros a nada
chmod u=rwx,g=rx,o= project-dir
La notación simbólica es especialmente útil cuando solo quieres cambiar un aspecto de los permisos sin afectar el resto. Por ejemplo, chmod u+x script.sh agrega permiso de ejecución para el propietario sin tocar ningún otro permiso.
Patrones comunes de chmod
Ciertos patrones de permisos aparecen repetidamente en la administración real de Linux. Aquí están los más importantes y cuándo usarlos.
644 -- Archivos estándar
chmod 644 index.html
# Propietario: lectura + escritura | Grupo: lectura | Otros: lectura
Este es el valor predeterminado para la mayoría de los archivos regulares. El propietario puede editar el archivo, y todos los demás pueden leerlo. Úsalo para archivos HTML, archivos de configuración no sensibles y documentos generales.
755 -- Archivos ejecutables y directorios
chmod 755 deploy.sh
chmod 755 /var/www/html
# Propietario: acceso completo | Grupo: lectura + ejecución | Otros: lectura + ejecución
El permiso estándar para scripts, binarios y directorios que necesitan ser accesibles. El propietario tiene control completo, mientras otros pueden leer y ejecutar (o traversar, en el caso de directorios) pero no modificar.
700 -- Directorios privados
chmod 700 ~/.ssh
# Propietario: acceso completo | Grupo: ninguno | Otros: ninguno
Solo el propietario puede acceder al archivo o directorio. Esencial para directorios sensibles como ~/.ssh o directorios de configuración privados.
600 -- Archivos privados
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
# Propietario: lectura + escritura | Grupo: ninguno | Otros: ninguno
Solo el propietario puede leer y escribir el archivo. Nadie más tiene acceso. Requerido para claves privadas SSH, archivos de entorno con secretos y cualquier archivo que contenga credenciales.
444 -- Solo lectura para todos
chmod 444 LICENSE
# Propietario: lectura | Grupo: lectura | Otros: lectura
Nadie puede modificar el archivo, incluyendo el propietario (sin cambiar los permisos primero). Útil para archivos que nunca deberían editarse accidentalmente, como archivos de licencia o configuración bloqueada.
777 -- Acceso completo para todos
chmod 777 /tmp/shared-workspace
# Propietario: completo | Grupo: completo | Otros: completo
Cada usuario puede leer, escribir y ejecutar. Evita esto en producción. Es un riesgo de seguridad significativo porque cualquier usuario o proceso del sistema puede modificar o eliminar el archivo. Úsalo solo en escenarios de desarrollo aislado o depuración temporal.
Tabla de referencia rápida
| Octal | Cadena | Uso típico |
|---|---|---|
644 | -rw-r--r-- | Archivos regulares (HTML, CSS, imágenes) |
755 | -rwxr-xr-x | Scripts, binarios, directorios web |
700 | -rwx------ | Directorios privados (~/.ssh) |
600 | -rw------- | Claves privadas, archivos .env, credenciales |
444 | -r--r--r-- | Archivos de solo lectura, licencias |
664 | -rw-rw-r-- | Archivos colaborativos de grupo |
775 | -rwxrwxr-x | Directorios colaborativos de grupo |
777 | -rwxrwxrwx | Evitar en producción |
Sintaxis y opciones del comando chmod
La sintaxis completa de chmod es:
chmod [opciones] modo archivo...
Opciones clave
# Aplicar permisos recursivamente a directorios y su contenido
chmod -R 755 /var/www/html
# Mostrar salida detallada para cada archivo cambiado
chmod -v 644 *.html
# Mostrar salida solo cuando se hace un cambio
chmod -c u+x scripts/*.sh
# Suprimir mensajes de error
chmod -f 600 missing-file
# Usar un archivo de referencia para copiar sus permisos
chmod --reference=source.conf target.conf
Ejemplos prácticos
# Hacer un script ejecutable
chmod +x backup.sh
# Proteger un directorio SSH y su contenido
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# Establecer permisos de archivos del servidor web
chmod -R 644 /var/www/html/*.html
chmod -R 755 /var/www/html/cgi-bin/
# Restringir un archivo de configuración
chmod 600 /etc/myapp/database.yml
# Hacer ejecutables todos los scripts shell en un directorio
chmod u+x scripts/*.sh
# Quitar acceso de escritura de una configuración de producción
chmod a-w /etc/nginx/nginx.conf
Combinando con find para control granular
Un patrón común es establecer permisos diferentes para archivos y directorios dentro del mismo árbol:
# Establecer directorios a 755 y archivos a 644 recursivamente
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# Hacer ejecutables solo los scripts shell
find /opt/scripts -name "*.sh" -exec chmod u+x {} \;
# Quitar permisos de lectura pública de todos los archivos de config
find /etc/myapp -type f -exec chmod o-r {} \;
Este enfoque es más preciso que chmod -R porque permite diferenciar entre archivos y directorios, que a menudo requieren conjuntos de permisos diferentes.
Permisos especiales
Más allá de los bits estándar de lectura, escritura y ejecución, Linux soporta tres tipos de permisos especiales. Estos se representan como un cuarto dígito octal antepuesto a los tres estándar.
Setuid (4)
Cuando se establece en un ejecutable, el archivo se ejecuta con los permisos del propietario del archivo en lugar del usuario que lo ejecuta.
chmod 4755 /usr/bin/special-tool
chmod u+s /usr/bin/special-tool
El ejemplo clásico es el comando passwd. Necesita modificar /etc/shadow, que pertenece a root. El bit setuid permite que cualquier usuario ejecute passwd con acceso a archivos de nivel root para ese propósito específico.
En la salida de ls -l, un archivo setuid muestra una s en lugar del bit de ejecución del propietario:
-rwsr-xr-x 1 root root 63960 Feb 10 12:00 /usr/bin/passwd
Setgid (2)
Cuando se aplica a un directorio, los nuevos archivos creados dentro heredan el grupo del directorio en lugar del grupo primario del usuario creador. En ejecutables, funciona como setuid pero para la membresía del grupo.
chmod 2775 /opt/team-project
chmod g+s /opt/team-project
Esto es invaluable para directorios de proyectos compartidos. Sin setgid, cada archivo que crea un miembro del equipo pertenecería a su grupo personal, dificultando la colaboración.
drwxrwsr-x 2 root developers 4096 Mar 22 10:30 /opt/team-project
Nota la s en la posición de ejecución del grupo.
Sticky Bit (1)
Cuando se establece en un directorio, solo el propietario del archivo (o root) puede eliminar o renombrar archivos dentro, incluso si otros usuarios tienen acceso de escritura al directorio.
chmod 1777 /tmp
chmod +t /tmp
El directorio /tmp es el ejemplo más común. Todos pueden crear archivos en /tmp, pero los usuarios no pueden eliminar los archivos de otros. En la salida de ls -l, el sticky bit aparece como una t en la posición de ejecución de otros:
drwxrwxrwt 15 root root 4096 Mar 22 10:30 /tmp
Resumen de permisos especiales
| Permiso | Octal | Símbolo | Efecto en archivo | Efecto en directorio |
|---|---|---|---|---|
| Setuid | 4000 | u+s | Se ejecuta como propietario | Sin efecto estándar |
| Setgid | 2000 | g+s | Se ejecuta como grupo | Los nuevos archivos heredan el grupo |
| Sticky Bit | 1000 | +t | Sin efecto estándar | Solo el propietario puede eliminar archivos |
Mejores prácticas de seguridad
Seguir algunos principios mantendrá tus sistemas seguros sin sacrificar la practicidad del trabajo diario.
Aplicar el principio de mínimo privilegio
Otorga solo los permisos mínimos necesarios para una tarea. Si un archivo solo necesita ser leído, no lo hagas escribible. Si un script solo necesita ser ejecutado por el propietario, no otorgues ejecución al grupo u otros.
# Bien: permisos mínimos
chmod 600 .env
chmod 700 ~/.ssh
# Mal: demasiado permisivo
chmod 777 .env
chmod 755 ~/.ssh
Nunca usar 777 en producción
Casi nunca hay una razón legítima para usar chmod 777 en un sistema de producción. Si algo parece requerirlo, el problema subyacente generalmente es un usuario, grupo o propiedad mal configurado en lugar de un problema de permisos. Usa chown o chgrp para corregir la propiedad antes de relajar los permisos.
Proteger archivos sensibles de inmediato
Las claves SSH, tokens de API, archivos de entorno y credenciales de bases de datos siempre deben ser 600 o 640 como máximo. Muchas herramientas, incluyendo OpenSSH, se negarán a trabajar si los archivos de clave tienen configuraciones demasiado permisivas.
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
chmod 600 .env
chmod 600 /etc/myapp/secrets.yml
Usar grupos para la colaboración
En lugar de ampliar permisos para "otros", crea un grupo dedicado, agrega los usuarios relevantes y usa permisos de grupo. Combina esto con el bit setgid en directorios compartidos para que los nuevos archivos hereden automáticamente el grupo correcto.
# Crear un directorio compartido con permisos de grupo apropiados
sudo groupadd webteam
sudo usermod -aG webteam alice
sudo usermod -aG webteam bob
sudo mkdir /var/www/project
sudo chown root:webteam /var/www/project
sudo chmod 2775 /var/www/project
Auditar permisos regularmente
En servidores de producción, verifica periódicamente archivos con permisos peligrosos:
# Encontrar todos los archivos escribibles por todos
find / -type f -perm -o+w 2>/dev/null
# Encontrar todos los archivos setuid (posibles vectores de escalada de privilegios)
find / -type f -perm -4000 2>/dev/null
# Encontrar archivos sin propietario (archivos huérfanos)
find / -nouser -o -nogroup 2>/dev/null
Establecer un umask seguro
El umask define los permisos predeterminados para archivos y directorios recién creados. Un umask de 022 resulta en archivos con 644 y directorios con 755. Un umask más restrictivo de 027 da archivos con 640 y directorios con 750, previniendo que "otros" accedan a nuevos archivos por defecto.
# Verificar umask actual
umask
# Establecer un umask restrictivo para la sesión
umask 027
# Hacerlo permanente agregando a ~/.bashrc o ~/.zshrc
echo "umask 027" >> ~/.bashrc
chmod vs. chown vs. chgrp
Estos tres comandos están relacionados pero sirven propósitos distintos:
| Comando | Propósito | Ejemplo |
|---|---|---|
chmod | Cambiar permisos de archivo | chmod 755 script.sh |
chown | Cambiar propietario (y opcionalmente grupo) | chown alice:devs file.txt |
chgrp | Cambiar grupo del archivo | chgrp webteam index.html |
Al solucionar problemas de acceso, comienza verificando tanto la propiedad (ls -l) como los permisos. A menudo la solución es cambiar la propiedad con chown en lugar de relajar los permisos con chmod.
Usar la calculadora chmod
La conversión manual entre notación simbólica y octal es sencilla una vez que has practicado, pero puede ser tediosa cuando estás configurando un nuevo servidor o revisando conjuntos de permisos complejos. Usa nuestra calculadora chmod para alternar visualmente los permisos y ver instantáneamente el valor octal correspondiente, la notación simbólica y el comando chmod resultante. Es especialmente útil para verificar permisos especiales como setuid, setgid y el sticky bit.
Conclusión
Los permisos de archivos Linux son uno de los pilares fundamentales de la seguridad del sistema. El comando chmod te da control preciso sobre quién puede acceder, modificar y ejecutar cada archivo y directorio de tu sistema. Al entender la notación octal y simbólica, aplicar el principio de mínimo privilegio y usar grupos efectivamente, puedes mantener un entorno seguro sin sacrificar la usabilidad.
Recuerda las reglas clave: mantén los archivos sensibles restringidos a 600 o 700, usa 755 para ejecutables y directorios públicos, evita completamente 777 en producción y audita tus permisos regularmente. Con estas prácticas implementadas, tus sistemas Linux serán tanto funcionales como seguros.