Перейти к основному содержанию

Обзор

Ваша CRM содержит данные о ваших клиентах, ваших сделках, ваших электронных письмах и вашем календаре. Когда исправление безопасности выпускается в релизе Twenty, само это исправление подсказывает злоумышленникам, где искать, и каждый экземпляр, который ещё не обновлён, становится целью. Быстрое обновление — настоящее решение, но большинство самостоятельно размещаемых экземпляров отстают на несколько версий. Лучшая защита, пока вы обновляетесь, проста: убедитесь, что никто из интернета вообще не может получить доступ к вашему экземпляру. На этой странице показано, как сделать это с помощью Tailscale, Cloudflare или собственного обратного прокси-сервера.

Приватность по умолчанию

Разделите свой экземпляр на три зоны: Каждый путь охватывает всё, что находится под ним. Открывайте публичную и облачную зоны ИИ, только если используете доступные через них функции; см. Публичные пути. В противном случае оставьте весь экземпляр приватным. ИИ-помощникам, работающим на компьютерах вашей команды, например Claude Code, не нужно ничего открывать; см. Клиенты ИИ.
От чего вы отказываетесь: размещаемые сервисы автоматизации, которые вызывают API Twenty из собственного облака (Zapier, Make, n8n Cloud), не могут получить доступ к приватному экземпляру. Вместо этого запускайте их внутри своей сети (самостоятельно размещаемый n8n хорошо подходит) или используйте рабочие процессы Twenty. Не делайте /graphql или /rest публичными в обход этого ограничения: само приложение работает на этих конечных точках, поэтому их раскрытие открывает всё.

Выберите настройку

community-tailscale
Tailscale
Полностью приватно. Самая простая настройка, лучше всего подходит для небольших команд.
community-cloudflare
Cloudflare
Нет открытых портов, логин и пароль вашего поставщика, по мере необходимости.
community-reverse-proxy
Обратный прокси
Caddy или Nginx с разрешенными IP списками. Без сторонних сервисов.

Вариант 1: Tailscale

Tailscale объединяет ваш сервер и устройства вашей команды в частную сеть. Twenty получает HTTPS-адрес, который работает только для пользователей этой сети.
1

Привяжите Twenty к localhost

В docker-compose.yml измените сопоставление порта server, чтобы контейнер был доступен только с самого сервера:
2

Подключите сервер к своей tailnet

Установите Tailscale на сервер, затем:
3

Предоставьте Twenty через HTTPS

Twenty теперь доступен по адресу https://twenty.\<your-tailnet>.ts.net с сертификатом, управляемым Tailscale. Если команда запросит это, включите HTTPS-сертификаты для своей tailnet в консоли администратора.
4

Обновите SERVER_URL

Затем перезапустите с помощью docker compose up -d.
Используйте элементы управления доступом Tailscale, чтобы ограничить доступ к серверу только тем, кому он нужен, а не всей вашей tailnet. Подключение аккаунтов Google или Microsoft по-прежнему работает: перенаправление OAuth происходит в браузере вашего коллеги, находящегося в tailnet. В электронных письмах с приглашениями указана ссылка на адрес tailnet, поэтому новые коллеги должны присоединиться к tailnet до принятия приглашения.
Tailscale Funnel публикует в интернете весь порт, а не отдельные пути. Вы не можете использовать его, чтобы сделать /webhooks общедоступным, сохранив приложение приватным. Если вам нужны общедоступные пути или AI-коннекторы, используйте вариант 2 или 3.

Вариант 2: Cloudflare Tunnel и Access

Cloudflare Tunnel подключает ваш сервер к Cloudflare через исходящее соединение, поэтому на сервере нет открытых портов. Затем Cloudflare Access просит вашу команду войти через вашего поставщика идентификации, прежде чем какой-либо запрос достигнет Twenty.
1

Защитите имя хоста с помощью Access

Сделайте это до создания туннеля, чтобы имя хоста никогда не было доступно без входа в систему. Создайте самостоятельно размещаемые приложения Access. Access применяет наиболее специфичный путь, поэтому приведённые ниже правила пути имеют приоритет над правилом имени хоста.Создайте одно приложение для каждого пути. Добавляйте правила обхода только для используемых функций.Локальные AI-клиенты, такие как Claude Code, не могут выполнить вход через браузер, поэтому они используют IP-адреса офиса или VPN из последнего правила. Если ваша команда работает откуда угодно, вместо этого добавьте для команды политику Allow в это приложение, включите аутентификацию WARP в Access и попросите их запустить клиент Cloudflare WARP.
2

Создайте туннель

На панели Cloudflare Zero Trust создайте туннель, выберите Docker в качестве среды и скопируйте токен. Добавьте общедоступное имя хоста crm.example.com, указывающее на http://server:3000.
3

Запустите cloudflared рядом с Twenty

Добавьте эту службу в docker-compose.yml и удалите раздел ports из server. cloudflared обращается к Twenty через сеть Docker, поэтому серверу не нужно публиковать ни один порт.
Добавьте CLOUDFLARE_TUNNEL_TOKEN в свой .env.
4

Обновите SERVER_URL

Затем перезапустите с помощью docker compose up -d.
Если вы используете WAF или защиту от ботов Cloudflare, пропускайте проверки на путях MCP и OAuth. Claude и ChatGPT не могут пройти страницу проверки.

Вариант 3: Собственный обратный прокси

Если вы уже используете обратный прокси, добавьте в список разрешённых IP-адреса вашего офиса или VPN для приложения и откройте только общедоступные пути. Сначала привяжите Twenty к localhost, как в варианте 1, чтобы ничто не обходило прокси.
Замените 203.0.113.0/24 адресами вашего офиса или VPN. CHATGPT_CONNECTOR_IPS содержит диапазоны OpenAI, см. AI-клиенты; оставьте его пустым, если не используете ChatGPT. Если ваш прокси находится за балансировщиком нагрузки, сопоставляйте с IP-адресом клиента, который он пересылает (client_ip с trusted_proxies в Caddy, set_real_ip_from в Nginx), а не с адресом балансировщика нагрузки.

Общедоступные пути

Это пути, которые вызывают службы за пределами вашей сети. Открывайте только те, которые вам нужны. По умолчанию Twenty опрашивает почтовые ящики и календари, поэтому Google и Microsoft никогда не вызывают ваш экземпляр. Они делают это только если вы установите IS_CONNECTED_ACCOUNT_WEBHOOK_SUBSCRIPTION_ENABLED=true. Как защищён каждый общедоступный путь:
  • Вебхуки рабочих процессов проверяют только существование рабочего пространства и рабочего процесса. Любой, кто знает URL, может запустить рабочий процесс, поэтому считайте URL секретом и проверяйте полезную нагрузку в рабочем процессе перед её обработкой.
  • Маршруты приложений и функций логики общедоступны, если только маршрут не требует аутентификации (isAuthRequired). Для общедоступных маршрутов проверяйте вызывающую сторону в собственном коде, например с помощью подписи отправляющей службы.
  • Вебхуки Google, Microsoft, SES и Resend проверяются Twenty с помощью подписи или токена поставщика.
  • Ссылки в электронных письмах могут зарегистрировать открытие, клик или отписку только для получателя, которому они были отправлены.

AI-клиенты (MCP)

AI-помощники — один из основных способов, которыми ваша команда будет использовать Twenty, через его сервер MCP. То, что нужно открыть, зависит от того, где работает помощник, а не от того, какой это помощник.

Локальные клиенты: ничего открывать не нужно

Claude Code, Codex CLI, Cursor и другие инструменты, работающие на вашем компьютере, подключаются к Twenty с этого компьютера. Если он находится в вашей tailnet или VPN, они получают доступ к /mcp так же, как ваш браузер получает доступ к приложению. Это самая безопасная конфигурация, поэтому отдавайте ей предпочтение, когда возможно. Claude Desktop — исключение: коннекторы, добавленные в Settings → Connectors, работают в облаке Anthropic даже в настольном приложении. Чтобы сохранить подключение локальным, вместо этого добавьте Twenty как локальный сервер MCP в claude_desktop_config.json:

Облачные коннекторы: открывайте с осторожностью

Claude (веб-версия, мобильное приложение и коннекторы в настольном приложении) и ChatGPT вызывают ваш сервер из инфраструктуры Anthropic и OpenAI, а не с вашего устройства. Они не могут получить доступ к приватному экземпляру, поэтому необходимо открыть /mcp, /oauth и /.well-known для их диапазонов IP-адресов.
Список разрешённых IP-адресов проверяет, из какой сети поступает запрос, а не кто его отправил. Любой, у кого есть аккаунт Claude или ChatGPT, может добавить ваш URL как коннектор и отправлять запросы на эти пути.
Не пускает их только вход в систему. Чтобы получить токен, пользователь должен войти на странице Twenty /authorize, которая остаётся в приватной зоне. Кто-то за пределами вашей сети может начать процесс подключения, но не может завершить его, а /mcp отклоняет каждый запрос без действительного токена. Открытым остаётся код, который выполняется до входа в систему: обнаружение OAuth, регистрация клиента (/oauth/register) и конечная точка токена. Список разрешённых адресов сужает доступ: сканеры по всему интернету не могут напрямую обращаться к этим путям, а запросы должны поступать через инфраструктуру Claude или ChatGPT. Сам по себе он не делает этот код безопасным, поэтому обновления по-прежнему важны. Если вы используете облачные коннекторы:
  • Откройте только /mcp, /oauth и /.well-known. Никогда не открывайте /authorize или остальную часть приложения.
  • Разрешайте только тех поставщиков, которых используете:
    • Anthropic: 160.79.104.0/21, со страницы IP-адресов Anthropic.
    • OpenAI: список в chatgpt-connectors.json. OpenAI описывает его как best effort, и он со временем меняется, поэтому обновляйте его по расписанию:
  • Быстро обновляйтесь, когда в примечаниях к выпуску упоминаются исправления MCP или OAuth.

Проверьте свою конфигурацию

Проверяйте с обеих сторон вашей сети после любого изменения:
Заголовок должен указывать на https://crm.example.com/.well-known/.... Если он показывает http:// или 127.0.0.1, ваш прокси не пересылает заголовки Host и X-Forwarded-Proto.

Базовый контрольный список

Postgres и Redis не опубликованы. По умолчанию docker-compose.yml не публикует их; сохраните это, если редактируете его.
Ничто не обходит ваш прокси или туннель. При использовании прокси на хосте порт Twenty привязан к 127.0.0.1. При использовании cloudflared в Docker служба server не публикует порт. Docker создаёт собственные правила брандмауэра, поэтому публикуемые им порты обходят ufw и аналогичные брандмауэры хоста.
Секреты длинные и случайные, и вы знаете, как ротировать их.
Участники рабочего пространства используют SSO или двухфакторную аутентификацию.
Для базы данных по расписанию создаются резервные копии, и вы протестировали восстановление.
TAG закреплён за версией, и вы обновляетесь осознанно.

Оставайтесь в курсе обновлений

Ничто из вышеперечисленного не заменяет обновления. Это даёт вам время.
  • Отслеживайте выпуски на GitHub: Watch → Custom → Releases.
  • Если выпуск содержит исправление безопасности, обновитесь, как только это рекомендовано в бюллетене: в тот же день для критических проблем. Следуйте руководству по обновлению.
  • Сообщайте об уязвимостях на security@twenty.com, а не в публичных issues.