Saltar al contenido principal

Resumen

Tu CRM contiene tus clientes, tus oportunidades, tus correos electrónicos y tu calendario. Cuando se publica una corrección de seguridad en una versión de Twenty, la propia corrección indica a los atacantes dónde buscar, y todas las instancias que aún no se han actualizado son objetivos. Actualizar rápidamente es la verdadera solución, pero la mayoría de las instancias autoalojadas ejecutan versiones con cierto retraso. La mejor protección mientras se ponen al día es sencilla: asegúrate de que nadie en internet pueda acceder a tu instancia. Esta página muestra cómo hacerlo con Tailscale, Cloudflare o tu propio proxy inverso.

Privada de forma predeterminada

Divide tu instancia en tres zonas: Cada ruta abarca todo lo que hay bajo ella. Abre las zonas pública y de IA en la nube solo si utilizas las funciones que hay detrás de ellas; consulta Rutas públicas. De lo contrario, mantén privada toda la instancia. Los asistentes de IA que se ejecutan en los equipos de tu equipo, como Claude Code, no necesitan que se abra nada; consulta Clientes de IA.
A lo que renuncias: las herramientas de automatización alojadas que llaman a la API de Twenty desde su propia nube (Zapier, Make, n8n Cloud) no pueden acceder a una instancia privada. Ejecútalas dentro de tu red (n8n autoalojado funciona bien) o utiliza flujos de trabajo de Twenty. No hagas públicos /graphql ni /rest para solucionar esto: la propia aplicación se ejecuta en esos endpoints, por lo que exponerlos expone todo.

Elige una configuración

community-tailscale
escalas
completamente privadas. La configuración más sencilla, ideal para equipos pequeños.
community-cloudflare
Cloudflare
Sin puertos abiertos, inicia sesión con tu proveedor de identidad, rutas públicas donde sea necesario.
community-reverse-proxy
invertir proxy
Caddy o Nginx con listas permitidas de IP. Sin servicio de terceros.

Opción 1: Tailscale

Tailscale coloca tu servidor y los dispositivos de tu equipo en una red privada. Twenty obtiene una dirección HTTPS que solo funciona para las personas de esa red.
1

Vincula Twenty a localhost

En docker-compose.yml, cambia la asignación de puertos de server para que solo se pueda acceder al contenedor desde el propio servidor:
2

Une el servidor a tu tailnet

Instala Tailscale en el servidor y, a continuación:
3

Sirve Twenty mediante HTTPS

Ahora Twenty está en https://twenty.\<your-tailnet>.ts.net, con un certificado gestionado por Tailscale. Si el comando te lo solicita, habilita los certificados HTTPS para tu tailnet en la consola de administración.
4

Actualiza SERVER_URL

A continuación, reinicia con docker compose up -d.
Usa los controles de acceso de Tailscale para limitar el servidor a las personas que lo necesitan, no a toda tu tailnet. La conexión de cuentas de Google o Microsoft sigue funcionando: la redirección de OAuth se produce en el navegador de tu compañero de equipo, que está en la tailnet. Los correos electrónicos de invitación enlazan a la dirección de la tailnet, por lo que los nuevos compañeros de equipo deben unirse a la tailnet antes de aceptar.
Tailscale Funnel publica un puerto completo en Internet, no rutas individuales. No puedes usarlo para hacer público /webhooks mientras mantienes la aplicación privada. Si necesitas rutas públicas o conectores de IA, usa la opción 2 o 3.

Opción 2: Cloudflare Tunnel y Access

Un Cloudflare Tunnel conecta tu servidor a Cloudflare mediante una conexión saliente, por lo que no hay puertos abiertos en el servidor. Después, Cloudflare Access pide a tu equipo que inicie sesión con tu proveedor de identidad antes de que cualquier solicitud llegue a Twenty.
1

Protege el nombre de host con Access

Hazlo antes de crear el túnel, para que nunca se pueda acceder al nombre de host sin iniciar sesión. Crea aplicaciones de Access autohospedadas. Access aplica la ruta más específica, por lo que las reglas de ruta siguientes prevalecen sobre la regla de nombre de host.Crea una aplicación por ruta. Añade solo las reglas de omisión para las funciones que utilices.Los clientes de IA locales como Claude Code no pueden completar un inicio de sesión en el navegador, por lo que dependen de las IP de la oficina o VPN de la última regla. Si tu equipo trabaja desde cualquier lugar, añade en su lugar una política Permitir para tu equipo a esa aplicación, habilita la autenticación WARP en Access y pídeles que ejecuten el cliente Cloudflare WARP.
2

Crea un túnel

En el panel de Cloudflare Zero Trust, crea un túnel, elige Docker como entorno y copia el token. Añade un nombre de host público, crm.example.com, que apunte a http://server:3000.
3

Ejecuta cloudflared junto a Twenty

Añade este servicio a docker-compose.yml y elimina la sección ports de server. cloudflared llega a Twenty a través de la red de Docker, por lo que el servidor no necesita publicar ningún puerto.
Añade CLOUDFLARE_TUNNEL_TOKEN a tu .env.
4

Actualiza SERVER_URL

A continuación, reinicia con docker compose up -d.
Si usas el WAF o la protección contra bots de Cloudflare, omite los desafíos en las rutas MCP y OAuth. Claude y ChatGPT no pueden resolver una página de desafío.

Opción 3: Tu propio proxy inverso

Si ya ejecutas un proxy inverso, incluye en la lista de permitidos las direcciones IP de tu oficina o VPN para la aplicación y abre solo las rutas públicas. Primero vincula Twenty a localhost, como en la opción 1, para que nada omita el proxy.
Sustituye 203.0.113.0/24 por las direcciones de tu oficina o VPN. CHATGPT_CONNECTOR_IPS contiene los rangos de OpenAI; consulta clientes de IA. Déjalo vacío si no utilizas ChatGPT. Si tu proxy está detrás de un balanceador de carga, realiza la coincidencia con la IP de cliente que reenvía (client_ip con trusted_proxies en Caddy, set_real_ip_from en Nginx), no con la dirección del balanceador de carga.

Rutas públicas

Estas son las rutas a las que llaman los servicios externos a tu red. Abre solo las que necesites. De forma predeterminada, Twenty sondea los buzones y calendarios, por lo que Google y Microsoft nunca llaman a tu instancia. Solo lo hacen si estableces IS_CONNECTED_ACCOUNT_WEBHOOK_SUBSCRIPTION_ENABLED=true. Cómo se protege cada ruta pública:
  • Los webhooks de flujos de trabajo solo comprueban que existan el espacio de trabajo y el flujo de trabajo. Cualquiera que conozca la URL puede activar el flujo de trabajo, así que trata la URL como un secreto y valida la carga útil en el flujo de trabajo antes de actuar sobre ella.
  • Las rutas de aplicaciones y funciones lógicas son públicas, a menos que la ruta requiera autenticación (isAuthRequired). Para las rutas públicas, verifica quién realiza la llamada en tu propio código, por ejemplo, con la firma del servicio remitente.
  • Los webhooks de Google, Microsoft, SES y Resend son verificados por Twenty mediante la firma o el token del proveedor.
  • Los enlaces de correo electrónico solo pueden registrar una apertura, un clic o una cancelación de suscripción para el destinatario al que se enviaron.

Clientes de IA (MCP)

Los asistentes de IA son una de las principales formas en que tu equipo usará Twenty, a través de su servidor MCP. Lo que debes abrir depende de dónde se ejecute el asistente, no de qué asistente sea.

Clientes locales: nada que abrir

Claude Code, Codex CLI, Cursor y otras herramientas que se ejecutan en tu computadora se conectan a Twenty desde esa computadora. Si está en tu tailnet o VPN, llegan a /mcp de la misma forma en que tu navegador llega a la aplicación. Esta es la configuración más segura, así que priorízala cuando puedas. Claude Desktop es la excepción: los conectores añadidos en Configuración → Conectores se ejecutan en la nube de Anthropic, incluso en la aplicación de escritorio. Para mantener la conexión local, añade Twenty como un servidor MCP local en claude_desktop_config.json:

Conectores en la nube: abre con cuidado

Claude (web, móvil y conectores en la aplicación de escritorio) y ChatGPT llaman a tu servidor desde la infraestructura de Anthropic y OpenAI, no desde tu dispositivo. No pueden acceder a una instancia privada, por lo que debes abrir /mcp, /oauth y /.well-known para sus rangos de IP.
Una lista de IP permitidas comprueba de qué red procede una solicitud, no quién la envió. Cualquiera con una cuenta de Claude o ChatGPT puede añadir tu URL como conector y enviar solicitudes a estas rutas.
Lo que los mantiene fuera es el inicio de sesión. Para obtener un token, un usuario debe iniciar sesión en la página /authorize de Twenty, que permanece en la zona privada. Alguien fuera de tu red puede iniciar el flujo de conexión, pero no puede finalizarlo, y /mcp rechaza todas las solicitudes sin un token válido. Lo que permanece expuesto es el código que se ejecuta antes del inicio de sesión: descubrimiento de OAuth, registro de clientes (/oauth/register) y el endpoint de token. La lista de permitidos reduce eso: los escáneres de todo Internet no pueden acceder directamente a estas rutas, y las solicitudes deben llegar a través de la infraestructura de Claude o ChatGPT. Por sí sola no hace que ese código sea seguro, por lo que las actualizaciones siguen siendo importantes. Si utilizas conectores en la nube:
  • Abre solo /mcp, /oauth y /.well-known. Nunca abras /authorize ni el resto de la aplicación.
  • Permite solo los proveedores que utilizas:
    • Anthropic: 160.79.104.0/21, de la página de direcciones IP de Anthropic.
    • OpenAI: la lista de chatgpt-connectors.json. OpenAI la describe como de máximo esfuerzo y cambia con el tiempo, así que actualízala de forma programada:
  • Actualiza rápidamente cuando las notas de la versión mencionen correcciones de MCP u OAuth.

Verifica tu configuración

Prueba desde ambos lados de tu red después de cualquier cambio:
El encabezado debe apuntar a https://crm.example.com/.well-known/.... Si muestra http:// o 127.0.0.1, tu proxy no está reenviando los encabezados Host y X-Forwarded-Proto.

Lista de verificación básica

Postgres y Redis no se publican. El archivo predeterminado docker-compose.yml no los publica; mantenlo así si lo editas.
Nada omite tu proxy o túnel. Con un proxy en el host, el puerto de Twenty está vinculado a 127.0.0.1. Con cloudflared en Docker, el servicio server no publica ningún puerto. Docker escribe sus propias reglas de firewall, por lo que los puertos que publica omiten ufw y firewalls de host similares.
Los secretos son largos y aleatorios, y sabes cómo rotarlos.
Los miembros del espacio de trabajo usan SSO o autenticación de dos factores.
Se realiza una copia de seguridad de la base de datos de forma programada y has probado una restauración.
TAG está fijado a una versión y actualizas deliberadamente.

Mantente al día

Nada de lo anterior sustituye las actualizaciones. Te da tiempo.
  • Sigue las versiones en GitHub: Ver → Personalizado → Versiones.
  • Cuando una versión incluya una corrección de seguridad, actualiza tan pronto como lo indique su aviso: el mismo día para los problemas críticos. Sigue la guía de actualización.
  • Informa de vulnerabilidades a security@twenty.com, no en incidencias públicas.