Introducción
En los sistemas tipo Unix, cada archivo y directorio posee un conjunto de permisos que determinan quién puede leer, modificar o ejecutar ese recurso. El comando chmod (change mode) es la herramienta estándar para cambiar esos permisos desde la línea de comandos. Comprender su funcionamiento es esencial para administradores de sistemas, desarrolladores y cualquier usuario que trabaje con Linux.
Conceptos básicos de permisos
Los permisos se representan mediante tres tipos de acceso: lectura (r), escritura (w) y ejecución (x). Cada uno se asigna a tres categorías de usuarios: el propietario (user), el grupo (group) y los demás (others). Por lo tanto, vemos una cadena como -rwxr-xr– donde el primer carácter indica el tipo de archivo y los nueve siguientes corresponden a los permisos de user, group y others en ese orden.
Una forma compacta de expresar esos permisos es usando notación octal. Cada permiso se vale de un valor: r=4, w=2, x=1. Sumando los valores de cada categoría obtenemos un dígito entre 0 y 7. Por ejemplo, rwx = 4+2+1 = 7, r-x = 4+0+1 = 5 y –x = 0+0+1 = 1. Así, -rwxr-xr– se escribe como 754.
Modo simbólico vs modo octal
chmod acepta dos formas de especificar el nuevo modo: simbólica y octal.
- Modo octal: se escribe directamente como un número de tres dígitos (o cuatro si se incluyen bits especiales). Ejemplo: chmod 755 archivo.txt.
- Modo simbólico: se combina quién (u, g, o, a), el operador (+, -, =) y el permiso (r, w, x). Ejemplo: chmod u+x,go-r archivo.txt.
El modo simbólico resulta más legible cuando se quiere modificar solo un bit, mientras que el octal es rápido para asignar un conjunto completo de permisos.
Ejemplos prácticos
chmod 600 archivo.conf→ solo el propietario puede leer y escribir (uso típico para archivos de configuración sensibles).chmod 644 index.html→ propietario puede leer y escribir; grupo y otros solo pueden leer (común en páginas web).chmod 755 script.sh→ propietario puede leer, escribir y ejecutar; grupo y otros pueden leer y ejecutar (ideal para scripts ejecutables).chmod go+w carpeta→ otorga permiso de escritura al grupo y a otros sobre el directorio.chmod a-x programa→ quita el permiso de ejecución a todas las categorías.chmod u+s binario→ establece el bit setuid (se representará con un cuarto dígito, por ejemplo 4755).
Bits especiales: setuid, setgid y sticky bit
Más allá de los nueve bits básicos, Linux permite tres bits especiales que influyen en la forma en que se ejecutan los archivos o se usan los directorios.
- setuid (4): al ejecutar un archivo con este bit, el proceso se ejecuta con los privilegios del propietario del archivo, no con los del usuario que lo invoca. Se representa añadiendo un 4 como primer dígito octal (ej. 4755).
- setgid (2): similar al setuid, pero el proceso se ejecuta con el grupo del archivo. En un directorio, hace que los archivos creados dentro hereden el grupo del directorio.
- sticky bit (1): principalmente usado en directorios de intercambio como /tmp; solo permite que el propietario de un archivo lo elimine o renombre, incluso si otros tienen escritura en el directorio.
Para asignarlos con chmod se usa un cuarto dígito al inicio: chmod 1755 /tmp asigna el sticky bit junto con los permisos 755.
Opciones útiles de chmod
- -R o –recursive: aplica los cambios de forma recursiva a todos los archivos y subdirectorios dentro de un directorio. Ejemplo: chmod -R 755 /var/www.
- -c o –changes: muestra un informe solo de los archivos que realmente fueron modificados.
- -v o –verbose: muestra un mensaje para cada archivo procesado, útil para depuración.
- -f o –silent: suprime la mayoría de los mensajes de error.
- –reference=archivo_ref: copia los permisos de un archivo de referencia al destino. Ejemplo: chmod –reference=plantilla.txt nuevo.txt.
Uso con find
Es frecuente combinar find con chmod para aplicar permisos a conjuntos de archivos que cumplen ciertos criterios. Por ejemplo:
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
Estas órdenes ponen permisos de lectura y escritura para archivos y de lectura, escritura y ejecución para directorios, típicos en un sitio web.
También se pueden usar operadores lógicos: find /home -user juan -perm /u+w -exec chmod u-w {} \; para quitar el permiso de escritura del propietario en archivos donde él lo tiene.
Buenas prácticas
- Aplica el principio de menor privilegio: da solo los permisos estrictamente necesarios.
- Revisa los permisos con ls -l antes y después de usar chmod.
- En scripts de instalación, evita usar chmod 777; prefiera permisos más restrictivos y ajusta según sea necesario.
- Utiliza grupos de UNIX para compartir acceso entre varios usuarios sin necesidad de dar permisos a “otros”.
- Audita periódicamente los bits especiales, especialmente setuid y setgid, pues pueden ser vectores de escalada de privilegios si se asignan incorrectamente.
- Documenta los cambios de permisos en entornos de producción mediante sistemas de control de cambios o registros de auditoría.
- Cuando trabajes con contenedores o máquinas virtuales, verifica que los permisos dentro del sistema de archivos coincidan con los requeridos por la aplicación.
Conclusión
El comando chmod es una pieza fundamental del manejo de permisos en Linux. Dominar tanto la notación octal como la simbólica, conocer los bits especiales y saber usar sus opciones avanzadas te permitirá mantener un sistema seguro y ordenado. Con la práctica y la aplicación de las buenas prácticas descritas, podrás evitar riesgos de seguridad y garantizar que cada archivo y directorio tenga exactamente el nivel de acceso que necesita.