Cómo Resolver Permisos de Escritura en Sistemas Multi-Usuario con Claude CLI

Cómo Resolver Permisos de Escritura en Sistemas Multi-Usuario con Claude CLI

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 Telegramn8n workflowDeploy APIclaude_proxy.pyClaude 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 permisos

Usar `cwd` en `subprocess.run()` solo cambia dónde ejecutas el comando, no quién lo ejecuta.

2. El entorno importa tanto como el usuario

No 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 busca

Claude 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.

Regresar al blog

Deja un comentario