Dominando los permisos de archivos de Linux con el comando 'chmod'
Aprende chmod con modos simbólicos y numéricos, valores predeterminados seguros, cambios recursivos y bits de permiso especiales.
Dominando los Permisos de Archivos en Linux con el Comando 'chmod'
Los permisos de archivos en Linux determinan quién puede leer, modificar o ejecutar un archivo. Cuando un script no se ejecuta, un servidor web no puede leer un archivo o una clave privada es rechazada por ser demasiado abierta, chmod suele ser parte de la solución.
El comando chmod cambia los bits de permiso. Puedes usar modos simbólicos legibles como u+x o modos numéricos compactos como 755.
Leer Cadenas de Permisos
Ejecuta ls -l para ver el tipo y los permisos de un archivo:
ls -l deploy.sh
Ejemplo de salida:
-rwxr-xr-- 1 app deploy 1200 May 23 10:00 deploy.sh
El primer carácter es el tipo de archivo. Un archivo regular comienza con -, un directorio comienza con d y un enlace simbólico comienza con l.
Los siguientes nueve caracteres son tres grupos de permisos:
- Usuario: el propietario del archivo.
- Grupo: los miembros del grupo del archivo.
- Otros: todos los demás.
Cada grupo puede tener:
r: leer el contenido del archivo o listar los nombres del directorio.w: modificar un archivo, o crear/eliminar/renombrar entradas en un directorio.x: ejecutar un archivo o recorrer un directorio.
El permiso de ejecución en directorios es importante. Sin x en un directorio, no puedes entrar ni acceder a los archivos dentro de él por su nombre, incluso si puedes listar algunos metadatos en otro lugar.
Usar Modos Simbólicos para Cambios Pequeños
La sintaxis simbólica se ve así:
chmod [quién][operador][permisos] ruta
quien puede ser u para usuario, g para grupo, o para otros o a para todos. Los operadores son + para agregar, - para quitar y = para establecer exactamente.
Hacer un script ejecutable para el propietario:
chmod u+x deploy.sh
Permitir que el grupo edite un archivo compartido:
chmod g+w shared_document.txt
Eliminar el acceso de escritura para grupo y otros:
chmod go-w config.yml
Establecer a otros solo lectura, reemplazando cualquier permiso existente para otros:
chmod o=r project_plan.txt
Los modos simbólicos son útiles porque solo cambian los bits que mencionas.
Usar Modos Numéricos para Conjuntos Completos de Permisos
Los modos numéricos establecen los permisos de usuario, grupo y otros en un solo comando. Cada permiso tiene un valor:
- Lectura:
4 - Escritura:
2 - Ejecución:
1
Suma los valores para cada grupo:
| Modo | Significado |
|---|---|
7 |
rwx |
6 |
rw- |
5 |
r-x |
4 |
r-- |
0 |
--- |
Establecer un archivo de texto normal para que el propietario pueda leer/escribir y todos los demás solo lectura:
chmod 644 important_file.txt
Establecer un directorio normal para que el propietario pueda administrarlo y otros puedan entrar y leerlo:
chmod 755 public_assets
Bloquear una clave privada para que solo el propietario pueda leerla y escribirla:
chmod 600 private_key.pem
Evita 777 a menos que estés en un entorno de prueba temporal y entiendas el riesgo:
chmod 777 scratch
777 permite que cualquier usuario local lea, escriba y ejecute o recorra la ruta. En sistemas compartidos, rara vez es aceptable.
Manejar Archivos y Directorios de Forma Diferente
Los archivos y directorios generalmente necesitan modos diferentes. Los archivos suelen usar 644; los directorios suelen usar 755. Si ejecutas esto a ciegas, harás que cada archivo sea ejecutable:
chmod -R 755 web_root/
Para un directorio web, un patrón más seguro es:
find web_root -type d -exec chmod 755 {} +
find web_root -type f -exec chmod 644 {} +
Luego agrega permiso de ejecución solo a los scripts que realmente lo necesiten:
chmod 755 web_root/scripts/deploy.sh
Usar Bits de Permiso Especiales con Cuidado
Los modos numéricos pueden incluir un cuarto dígito inicial para bits especiales:
| Valor | Nombre | Efecto común |
|---|---|---|
4 |
SetUID | Un ejecutable se ejecuta con el ID de usuario efectivo del propietario del archivo. |
2 |
SetGID | Un ejecutable se ejecuta con el ID de grupo efectivo del grupo del archivo; en directorios, las nuevas entradas heredan el grupo del directorio. |
1 |
Sticky bit | En directorios, los usuarios solo pueden eliminar archivos que poseen, que posee el propietario del directorio o que root puede eliminar. |
Establecer el bit SetGID en un directorio de proyecto compartido para que los nuevos archivos hereden el grupo del directorio:
chmod 2770 shared_group_files
Establecer el sticky bit en un directorio compartido con escritura:
chmod 1777 /srv/shared-upload
El ejemplo clásico es /tmp, que es escribible por todos pero protegido por el sticky bit.
Ten cuidado con SetUID y SetGID en ejecutables. Pueden crear un riesgo grave de escalada de privilegios si el programa es escribible, está mal diseñado o acepta entrada insegura. Muchos sistemas similares a Unix también ignoran SetUID en scripts por razones de seguridad.
Verificar el Resultado
Después de cambiar los permisos, verifícalos:
ls -ld web_root web_root/index.html
Usa stat cuando quieras el modo numérico:
stat -c '%a %n' web_root/index.html
En macOS, el formato de stat es diferente:
stat -f '%Lp %N' web_root/index.html
Conclusión
Usa chmod simbólico cuando quieras agregar o quitar un permiso. Usa chmod numérico cuando quieras establecer el modo completo exactamente. Trata los cambios recursivos con cuidado, mantén archivos y directorios separados, y verifica con ls -l o stat antes de continuar.