Cómo Resolver Permisos de Escritura en Sistemas Multi-Usuario con Claude CLI
Share
Cómo Resolver Permisos de Escritura en Sistemas Multi-Usuario con Claude CLI
El Desafío de los Sandboxes Aislados
Cuando trabajas con múltiples bots de Telegram que necesitan ejecutar tareas de forma independiente, te enfrentas a un problema común: ¿cómo permitir que cada bot escriba archivos en su propio espacio sin comprometer la seguridad del sistema?
En un proyecto reciente, implementamos una arquitectura donde tres bots diferentes ejecutan Claude CLI a través de un proxy centralizado. Todo funcionaba perfectamente hasta que intentamos escribir archivos. El error era claro: "no tengo permisos de escritura en `/home/er0002`".
Diagnóstico: El Problema de la Identidad del Usuario
La arquitectura inicial parecía correcta en papel:
- Bot de Telegram → n8n workflow → Deploy API → claude_proxy.py → Claude CLI
Cada bot tenía su propio sandbox con permisos restrictivos (700):
- `/home/er0002` para el bot de préstamos
- `/home/gr0002` para el bot de cotizaciones
- `/home/av0004` para el bot corporativo
El problema estaba en una línea de código aparentemente inocente. El servicio `claude_proxy.py` ejecutaba Claude CLI como el usuario `khaleesi` (propietario del servicio), pero intentaba escribir en directorios que pertenecían a otros usuarios.
Código problemático
result = subprocess.run(
['claude', '-p', '--dangerously-skip-permissions', '--model', model, prompt],
cwd=cwd # Solo cambia el directorio, NO el usuario
)
Cambiar el directorio de trabajo (`cwd`) no cambia la identidad del proceso. Es como intentar entrar a una casa ajena solo porque estás parado frente a la puerta.
La Solución: Ejecución con `sudo -u`
La solución requirió tres componentes fundamentales:
1. Ejecutar como el Usuario Correcto
Modificamos el proxy para usar `sudo -u $user`, cambiando la identidad del proceso antes de ejecutar Claude CLI:
Código corregido
result = subprocess.run(
['sudo', '-u', user, 'claude', '-p', '--dangerously-skip-permissions', '--model', model, prompt],
cwd=cwd,
env={
'HOME': cwd,
'PATH': '/usr/local/bin:/usr/bin:/bin:/snap/bin',
'LANG': 'es_MX.UTF-8'
}
)
2. Configurar el Entorno Correcto
No basta con cambiar el usuario. Necesitas que el proceso "piense" que está en su propio home:
- `HOME`: Apunta al directorio sandbox (`/home/er0002`)
- `PATH`: Incluye las rutas necesarias para ejecutar herramientas
- `LANG`: Configura el idioma para salidas correctas
3. Replicar Credenciales de Claude
Claude CLI requiere credenciales de autenticación almacenadas en `~/.claude/.credentials.json`. Copiamos este archivo de la cuenta principal a cada sandbox:
for user in er0002 gr0002 av0004; do
sudo mkdir -p /home/$user/.claude
sudo cp ~/.claude/.credentials.json /home/$user/.claude/
sudo chown -R $user:$user /home/$user/.claude
done
Verificación: Prueba Real del Sistema
La verdadera prueba fue simple y directa:
curl -X POST http://127.0.0.1:3010/claude \
-H "Authorization: Bearer er_prestamos_2026_key" \
-d '{"prompt": "Escribe SANDBOX_OK en /home/er0002/test.txt"}'
Resultado exitoso:
{"client": "er0002", "output": "LISTO", "success": true}
Y lo más importante, el archivo creado tenía el propietario correcto:
-rw------- 1 er0002 er0002 10 ene 11 02:50 /home/er0002/test_sandbox.txt
Arquitectura Final: Tres Bots, Tres Sandboxes
Con esta solución implementada, logramos un sistema multi-inquilino seguro:
| Bot | Prefijo | Sandbox | Estado |
|-----|---------|---------|--------|
| Bot de Cotizaciones | GR-**** | /home/gr0002 | ✓ Funcional |
| Bot de Préstamos | ER-**** | /home/er0002 | ✓ Funcional |
| Bot Corporativo | AV-**** | /home/av0004 | ✓ Funcional |
Cada bot puede:
- Escribir archivos en su propio directorio
- Ejecutar comandos sin interferir con otros bots
- Mantener sus propios logs y estado
- Operar de forma completamente aislada
Lecciones Aprendidas
1. Cambiar el directorio no cambia los permisosUsar `cwd` en `subprocess.run()` solo cambia dónde ejecutas el comando, no quién lo ejecuta.
2. El entorno importa tanto como el usuarioNo basta con ejecutar como otro usuario. Necesitas configurar variables de entorno (`HOME`, `PATH`) para que el proceso funcione correctamente.
3. Las credenciales deben estar donde el proceso las buscaClaude CLI busca credenciales en `~/.claude/`. Si ejecutas como `er0002`, debe existir `/home/er0002/.claude/.credentials.json`.
Esta arquitectura demuestra que es posible construir sistemas multi-usuario seguros con herramientas de IA modernas, siempre que respetes los fundamentos de permisos de Unix y entiendas cómo funcionan los procesos bajo el capó.
Sobre el Autor
Irving Alberto Varela Bedoya, Ph.D.
Experto en Inteligencia Artificial y Automatización Empresarial
Ayudo a empresas a transformar sus operaciones con IA y automatización, generando ROI medible en 90 días o menos.