Saltearse al contenido
↑↓Navegar ↵Abrir escCerrar

Seguridad

OpenChamber da acceso a tu máquina y a tu código, así que bloquéalo antes de que nadie más que tú pueda alcanzarlo. Esta página cubre la contraseña de UI, las passkeys y lo que debes saber antes de exponer OpenChamber a una red.

Define una contraseña de UI

Inicia OpenChamber con una contraseña y la UI del navegador la pedirá:

Ventana de terminal
openchamber --ui-password be-creative-here

También puedes definirla con la variable de entorno OPENCHAMBER_UI_PASSWORD en lugar de ponerla en la línea de comandos. Tras iniciar sesión, OpenChamber recuerda el dispositivo durante un tiempo para no pedírtela cada vez.

Define siempre una contraseña si la instancia es accesible para alguien más, especialmente a través de un túnel o de internet público.

Passkeys

Una vez definida una contraseña, puedes añadir passkeys (Face ID, Touch ID, una llave de seguridad) para un inicio de sesión más rápido. Añádelas en Settings → OpenChamber → Passkeys.

Las passkeys están vinculadas a la contraseña actual. Si cambias o eliminas la contraseña, las passkeys guardadas se borran y tendrás que añadirlas de nuevo.

Tokens de dispositivo

Los dispositivos vinculados mediante Conectar un dispositivo se autentican con sus propios tokens por dispositivo, no con la contraseña de UI. Los enlaces de vinculación son de un solo uso y caducan si no se usan; cada dispositivo vinculado aparece en Settings → Remote Instances → Conectarse a este servidor, donde puedes revocar cualquiera en cualquier momento. Las conexiones fuera de casa pasan por el Private Relay, que está cifrado de extremo a extremo y no puede leer tu tráfico.

Antes de exponerlo

  • De forma predeterminada, OpenChamber solo escucha en tu propia máquina (127.0.0.1). Hace falta un cambio deliberado para escuchar más ampliamente, y deberías definir una contraseña primero.
  • Para tus propios dispositivos, prefiere la vinculación con el Private Relay: no se expone nada públicamente.
  • Si necesitas una URL pública, prefiere un túnel o una red privada (como una VPN) antes que abrir un puerto a internet.
  • Si pones OpenChamber detrás de tu propio servidor HTTPS, consulta Proxy inverso.

Modo empresa

Si tu equipo solo puede enviar el contenido de las conversaciones a los proveedores de modelos que configuraste en OpenCode, activa el modo empresa. Hay dos formas de hacerlo, y basta con una.

Un archivo de políticas en la máquina

Es la opción para los portátiles que administras. Pon un archivo llamado policy.json en una carpeta en la que solo un administrador pueda escribir:

SistemaRuta
macOS/Library/Application Support/OpenChamber/policy.json
WindowsC:\ProgramData\OpenChamber\policy.json
Linux/etc/openchamber/policy.json

La ruta no depende de cómo esté instalado OpenChamber. La app de escritorio, el servidor web iniciado desde npm, la CLI y la extensión de VS Code leen el mismo archivo. Puedes distribuirlo con tu gestor de dispositivos (Jamf, Intune y similares). Para un servidor en Docker, monta el archivo en la ruta de Linux.

{
"enterpriseMode": true,
"organization": "Acme",
"relayUrl": "wss://relay.acme.com/ws",
"allowNetworkAccess": false,
"allowedExtensions": ["https://github.com/acme/"],
"jev": {
"url": "https://llm.acme.com/v1/systemone",
"model": "acme-classifier",
"apiKey": "..."
}
}

Solo hace falta enterpriseMode. organization aparece en Configuración como “Gestionado por Acme”, para que la gente sepa quién tomó la decisión. relayUrl y jev fijan tu propio relay y tu propio endpoint de Jev, allowNetworkAccess permite que otros dispositivos lleguen a OpenChamber por la red, y allowedExtensions enumera los repositorios de extensiones en los que confías. Todos se describen más abajo.

  • Nada que configure un usuario, ni en Configuración ni en el entorno, desactiva lo que el archivo activa.
  • Cuando el archivo activa el modo empresa, solo decide el archivo. Las variables de entorno de más abajo para el relay, Jev y el acceso de red se ignoran, porque un usuario puede definirlas por su cuenta.
  • Si el archivo existe pero no se puede leer o no es JSON válido, el modo empresa sigue activado y no se fija nada. Configuración indica que no se pudo leer la política. Un archivo roto nunca levanta la protección en silencio.
  • Los cambios se aplican sin reiniciar.
  • OpenChamber se ejecuta como el usuario, así que el usuario puede leer el archivo. Tenlo en cuenta antes de poner una clave de API en él.

Una variable de entorno

En un servidor o en un contenedor, donde tú controlas el entorno, basta con esto:

Ventana de terminal
OPENCHAMBER_ENTERPRISE_MODE=1

En un portátil es un bloqueo más débil: la app de escritorio la lee del perfil del shell de inicio de sesión (por ejemplo, ~/.zshrc), y el usuario puede editarlo. Ahí usa el archivo de políticas.

Con la variable, el relay, Jev, el acceso de red y las extensiones permitidas también salen de sus propias variables: OPENCHAMBER_RELAY_URL, OPENCHAMBER_JEV_URL, OPENCHAMBER_ALLOW_NETWORK_ACCESS=1, OPENCHAMBER_ALLOWED_EXTENSIONS (URL de repositorios separadas por comas) y OPENCHAMBER_ALLOW_LOCAL_EXTENSIONS=1. En Docker vas a necesitar la del acceso de red, porque el servidor tiene que escuchar más allá del contenedor.

Fijar la CLI de OpenCode

Si tus equipos ya tienen OpenCode instalado y OpenChamber debe usar esa instalación, pon su ruta en el archivo de políticas. Funciona con o sin el modo empresa.

{
"opencodeBinary": "/usr/local/bin/opencode"
}
  • OpenChamber inicia OpenCode solo desde esa ruta. Ignora la ruta de Ajustes, OPENCODE_BINARY y la copia incluida en la app de escritorio, que se queda en el disco sin usarse.
  • Si en esa ruta no hay nada ejecutable, OpenChamber no recurre a otra copia. Se detiene con un error que indica la ruta.
  • Ajustes muestra la ruta en solo lectura, con una nota de que la fijó el administrador.
  • OpenChamber no instala ni actualiza un OpenCode fijado y no anuncia versiones nuevas. Las actualizaciones llegan con tu despliegue.
  • La CLI tiene que ser OpenCode 2.x, como mínimo la versión que pide OpenChamber. Con una más antigua, OpenChamber se queda en la pantalla de “actualizar OpenCode”.
  • También sirve una carpeta, si contiene opencode (opencode.exe en Windows). No hay variable de entorno para esto, porque un usuario puede definirlas por su cuenta.

Ocultar los catálogos de skills incluidos

OpenChamber incluye algunos catálogos públicos de skills (Anthropic, OpenAI, Cursor, Matt Pocock). Si tu organización mantiene uno propio, añádelo como catálogo personalizado y oculta los incluidos en el archivo de políticas. Funciona con o sin el modo empresarial.

{
"hideBuiltinSkillCatalogs": true
}

Así Ajustes solo ofrece los catálogos que la gente añade por su cuenta, y OpenChamber no carga uno incluido aunque se le pida directamente. No hay variable de entorno para esto, porque un usuario puede definirlas.

Ejemplos

Para poner el archivo de políticas en un Mac, ejecuta en Terminal como administrador:

Ventana de terminal
sudo mkdir -p "/Library/Application Support/OpenChamber"
sudo tee "/Library/Application Support/OpenChamber/policy.json" > /dev/null <<'JSON'
{
"enterpriseMode": true,
"organization": "Acme"
}
JSON

En Linux es igual, con /etc/openchamber como carpeta.

En Windows, ejecuta PowerShell como administrador. La última línea deja la carpeta con permiso de escritura solo para los administradores y el sistema:

Ventana de terminal
New-Item -ItemType Directory -Force "C:\ProgramData\OpenChamber" | Out-Null
@'
{
"enterpriseMode": true,
"organization": "Acme"
}
'@ | Set-Content -Encoding UTF8 "C:\ProgramData\OpenChamber\policy.json"
icacls "C:\ProgramData\OpenChamber" /inheritance:r /grant:r "Administrators:(OI)(CI)F" "SYSTEM:(OI)(CI)F" "Users:(OI)(CI)RX"

Un servidor en Docker, añadido al environment de docker-compose.yml. El contenedor escucha más allá de sí mismo, así que necesita el acceso de red permitido:

environment:
OPENCHAMBER_UI_PASSWORD: ${OPENCHAMBER_UI_PASSWORD}
OPENCHAMBER_ENTERPRISE_MODE: "1"
OPENCHAMBER_ALLOW_NETWORK_ACCESS: "1"
# Optional:
OPENCHAMBER_RELAY_URL: wss://relay.acme.com/ws
OPENCHAMBER_JEV_URL: https://llm.acme.com/v1/systemone
OPENCHAMBER_JEV_MODEL: acme-classifier
OPENCHAMBER_JEV_API_KEY: ${ACME_JEV_KEY}
OPENCHAMBER_ALLOWED_EXTENSIONS: https://github.com/acme/

Para comprobar que funcionó, abre Configuración → Proveedores: arriba aparece un aviso de modo empresa con el nombre de tu organización.

Qué cambia

  • Los proveedores de modelos salen solo de tu configuración de OpenCode. Conectar un proveedor, iniciar sesión en uno, añadir una clave o crear un proveedor personalizado está desactivado en OpenChamber; quitar o cambiar las cuentas que ya existen sigue funcionando. Esto solo cierra la entrada a través de la app; el bloqueo en sí es la política de OpenCode que se describe más abajo. Iniciar sesión en un servidor MCP de tu configuración de OpenCode sigue funcionando, porque llega a ese servidor y no a un proveedor de modelos.
  • Los Proveedores de clasificación (Jev) se quedan desactivados, incluido un endpoint personalizado que alguien escriba en Configuración. La red de seguridad y Auto no se ofrecen, y las sesiones en curso no reciben la pista «parece terminado». Para usar Jev a través de tu propia infraestructura, fija un endpoint con jev en el archivo de políticas o con OPENCHAMBER_JEV_URL (más OPENCHAMBER_JEV_MODEL y, si lo necesita, OPENCHAMBER_JEV_API_KEY). Pasa a ser el predeterminado, se puede seguir desactivando y no se puede elegir nada más.
  • La lectura en voz alta a través de OpenAI está desactivada. Un servidor propio de voz o de transcripción tiene que ejecutarse en la misma máquina. Las voces locales y los modelos de dictado locales siguen funcionando.
  • Las notificaciones push a teléfonos y navegadores solo llevan un título genérico como “Agent response is ready”, sin el texto del mensaje ni el nombre de la sesión. Las notificaciones de escritorio se quedan en tu máquina y conservan el texto completo.
  • Las comprobaciones de actualizaciones siguen funcionando, así que las correcciones de seguridad te siguen llegando, pero nunca informan del uso, ni siquiera del ID de instalación anónimo.
  • Los túneles externos (Cloudflare, ngrok) están desactivados. Un proveedor de túneles descifra el tráfico en su borde y ve cada solicitud en texto plano.
  • Los diagramas .drawio se abren como su texto XML. El editor de diagramas es una página de diagrams.net, y abrir un diagrama allí le entrega el archivo.
  • Las fuentes de interfaz y de código que se cargan desde una CDN pública pasan a las fuentes del sistema. Tu elección se guarda para cuando el modo esté desactivado.
  • El Private Relay solo funciona a través de tu propio relay. Ejecuta un relay autoalojado y apunta OpenChamber hacia él con relayUrl en el archivo de políticas o con OPENCHAMBER_RELAY_URL=wss://relay.example.com/ws. El relay compartido tampoco puede leer tu tráfico, ya que está cifrado de extremo a extremo, pero el tuyo mantiene los metadatos de conexión y la entrada a esta máquina dentro de tu red. Sin tu propio relay, no se puede vincular ningún dispositivo.
  • OpenChamber escucha solo en la máquina donde se ejecuta. El ajuste de escritorio que permite a otros dispositivos de la red local abrir la app está desactivado, y el servidor se niega a arrancar en una dirección de red, ya sea desde la CLI (--host, --lan) o desde el entorno. Si el archivo de políticas aparece mientras la app está en marcha, las conexiones desde otras máquinas se cortan hasta el siguiente arranque. Permite el acceso de red con "allowNetworkAccess": true en el archivo de políticas, o con OPENCHAMBER_ALLOW_NETWORK_ACCESS=1 donde el entorno activa el modo empresa. Ten en cuenta que la conexión es HTTP sin cifrar, así que en una red compartida cualquiera puede leerla; pon un servidor al que accedan otros detrás de tu propio HTTPS.
  • Las extensiones que pueden enviar datos fuera de la máquina (las que hablan con una API externa, cargan desde direcciones externas o ejecutan un servicio en segundo plano) solo se instalan desde un repositorio Git que figure en allowedExtensions. Las extensiones que no hacen nada de esto se instalan como siempre. Una extensión instalada desde cualquier otro sitio queda desactivada, y Configuración explica por qué. La lista contiene URL de repositorios, porque cada extensión elige su propio nombre; una entrada que termina en /, como https://github.com/acme/, permite todos los repositorios que hay debajo. En las máquinas de quienes desarrollan extensiones, "allowLocalExtensions": true también permite instalar desde una carpeta local. Un ZIP sigue bloqueado en cualquier caso.
  • Las variables de entorno de Configuración → General y de opencode service set env no llegan a OpenCode, porque una de ellas podría llevar una clave de proveedor. Git, la terminal y las acciones de proyecto las siguen recibiendo.
  • En la extensión de VS Code, conectar proveedores está desactivado y las comprobaciones de actualizaciones no informan del uso. De por sí no tiene Jev, relay, túneles, notificaciones push ni voz en la nube.

Las tareas del modelo pequeño (títulos de sesión, resúmenes, mensajes de commit, el recorrido de cambios) no necesitan ningún modo especial. Siempre se ejecutan con el modelo pequeño que elegiste en Configuración, con un modelo pequeño del proveedor con el que estás trabajando o con el modelo predeterminado de tu configuración de OpenCode. Nunca recurren a otro proveedor que simplemente tengas conectado.

Qué proveedores de modelos se pueden usar lo decide OpenCode, no OpenChamber. Fíjalo con las políticas de OpenCode: deniega todos los proveedores y luego permite los que aprobaste.

{
"experimental": {
"policies": [
{ "action": "provider.use", "resource": "*", "effect": "deny" },
{ "action": "provider.use", "resource": "anthropic", "effect": "allow" }
]
}
}

Un proveedor denegado desaparece aunque alguien añada una clave para él. Pon las políticas en el archivo global ~/.config/opencode/opencode.jsonc, donde un proyecto no puede levantarlas, o entrégalas desde un espacio de trabajo de OpenCode Console, que tiene la última palabra. El modo empresa cubre además lo que envía el propio OpenChamber.

Las búsquedas web y las descargas de páginas del agente también pasan por OpenCode, hacia el servicio de búsqueda y hacia las propias páginas. Si no deben salir de tu red, deniégalas con el mismo tipo de política:

{ "action": "permission", "resource": "websearch:*", "effect": "deny" },
{ "action": "permission", "resource": "webfetch:*", "effect": "deny" }

Relacionado