Salt la conținutul principal

Prezentare generală

CRM-ul dvs. conține clienții, oportunitățile, e-mailurile și calendarul dvs. Atunci când o remediere de securitate este lansată într-o versiune Twenty, remedierea în sine le indică atacatorilor unde să caute, iar fiecare instanță care nu a fost încă actualizată este o țintă. Actualizarea rapidă este adevărata soluție, dar majoritatea instanțelor auto-găzduite rulează cu câteva versiuni în urmă. Cea mai bună protecție până când actualizați este simplă: asigurați-vă că nimeni de pe internet nu vă poate accesa instanța. Această pagină arată cum să faceți acest lucru cu Tailscale, Cloudflare sau propriul proxy invers.

Privat în mod implicit

Împărțiți instanța în trei zone: Fiecare cale acoperă tot ce se află sub ea. Deschideți zonele publice și AI în cloud numai dacă utilizați funcționalitățile din spatele acestora; consultați Căi publice. În caz contrar, păstrați întreaga instanță privată. Asistenții AI care rulează pe calculatoarele echipei dvs., precum Claude Code, nu necesită deschiderea niciunui acces; consultați Clienți AI.
La ce renunțați: instrumentele de automatizare găzduite care apelează API-ul Twenty din propriul cloud (Zapier, Make, n8n Cloud) nu pot accesa o instanță privată. Rulați-le în schimb în rețeaua dvs. (n8n auto-găzduit funcționează bine) sau utilizați fluxurile de lucru Twenty. Nu faceți publice /graphql sau /rest pentru a ocoli acest lucru: aplicația însăși rulează pe acele endpointuri, deci expunerea lor expune totul.

Alegeți o configurare

community-tailscale
Eșecuri
Complet privat. Cea mai simplă configurare, ideală pentru echipe mici.
community-cloudflare
Cloudflare
Fără porturi deschise, autentifică-te cu furnizorul tău de identitate, căi publice unde este necesar.
community-reverse-proxy
Reverse proxy
Caddy sau Nginx cu permise IP. Fără servicii terțe.

Opțiunea 1: Tailscale

Tailscale plasează serverul și dispozitivele echipei tale într-o rețea privată. Twenty primește o adresă HTTPS care funcționează numai pentru persoanele din acea rețea.
1

Leagă Twenty la localhost

În docker-compose.yml, modifică maparea portului pentru server, astfel încât containerul să fie accesibil numai de pe serverul însuși:
2

Adaugă serverul la tailnet-ul tău

Instalează Tailscale pe server, apoi:
3

Servește Twenty prin HTTPS

Twenty este acum la https://twenty.\<your-tailnet>.ts.net, cu un certificat gestionat de Tailscale. Dacă ți se solicită prin comandă, activează certificatele HTTPS pentru tailnet-ul tău în consola de administrare.
4

Actualizează SERVER_URL

Apoi repornește cu docker compose up -d.
Folosește controalele de acces Tailscale pentru a limita accesul la server la persoanele care au nevoie de el, nu la întregul tău tailnet. Conectarea conturilor Google sau Microsoft funcționează în continuare: redirecționarea OAuth are loc în browserul colegului tău, care se află în tailnet. E-mailurile de invitație conțin linkuri către adresa tailnet, așa că noii colegi trebuie să se alăture tailnet-ului înainte de a accepta.
Tailscale Funnel publică un port întreg pe internet, nu căi individuale. Nu îl poți folosi pentru a face publică ruta /webhooks păstrând aplicația privată. Dacă ai nevoie de căi publice sau conectori AI, folosește opțiunea 2 sau 3.

Opțiunea 2: Cloudflare Tunnel și Access

Un Cloudflare Tunnel conectează serverul tău la Cloudflare printr-o conexiune de ieșire, astfel încât niciun port să nu fie deschis pe server. Cloudflare Access le solicită apoi membrilor echipei tale să se conecteze cu furnizorul tău de identitate înainte ca orice solicitare să ajungă la Twenty.
1

Protejează numele de gazdă cu Access

Fă acest lucru înainte de a crea tunelul, astfel încât numele de gazdă să nu fie niciodată accesibil fără autentificare. Creează aplicații Access auto-găzduite. Access aplică cea mai specifică rută, astfel încât regulile de cale de mai jos au prioritate față de regula numelui de gazdă.Creează o aplicație pentru fiecare cale. Adaugă regulile de ocolire numai pentru funcționalitățile pe care le folosești.Clienții AI locali precum Claude Code nu pot finaliza o autentificare în browser, așa că se bazează pe IP-urile biroului sau VPN-ului din ultima regulă. Dacă echipa ta lucrează de oriunde, adaugă în schimb o politică Permite pentru echipa ta la acea aplicație, activează autentificarea WARP în Access și cere-le să ruleze clientul Cloudflare WARP.
2

Creează un tunel

În tabloul de bord Cloudflare Zero Trust, creează un tunel, alege Docker ca mediu și copiază tokenul. Adaugă un nume de gazdă public, crm.example.com, care indică spre http://server:3000.
3

Rulează cloudflared alături de Twenty

Adaugă acest serviciu în docker-compose.yml și elimină secțiunea ports din server. cloudflared accesează Twenty prin rețeaua Docker, astfel încât serverul nu trebuie să publice niciun port.
Adaugă CLOUDFLARE_TUNNEL_TOKEN în .env.
4

Actualizează SERVER_URL

Apoi repornește cu docker compose up -d.
Dacă folosești WAF-ul sau protecția împotriva boților de la Cloudflare, omite provocările pe căile MCP și OAuth. Claude și ChatGPT nu pot rezolva o pagină de provocare.

Opțiunea 3: propriul proxy invers

Dacă rulezi deja un proxy invers, adaugă pe lista de permisiuni adresele IP ale biroului sau VPN-ului tău pentru aplicație și deschide numai căile publice. Leagă mai întâi Twenty la localhost, ca în opțiunea 1, astfel încât nimic să nu ocolească proxy-ul.
Înlocuiește 203.0.113.0/24 cu adresele biroului sau VPN-ului tău. CHATGPT_CONNECTOR_IPS conține intervalele OpenAI, vezi clienți AI; lasă-l gol dacă nu folosești ChatGPT. Dacă proxy-ul tău se află în spatele unui echilibrator de încărcare, potrivește după IP-ul clientului pe care îl redirecționează (client_ip cu trusted_proxies în Caddy, set_real_ip_from în Nginx), nu după adresa echilibratorului de încărcare.

Căi publice

Acestea sunt căile apelate de serviciile din afara rețelei tale. Deschide numai cele de care ai nevoie. În mod implicit, Twenty interoghează căsuțele poștale și calendarele, astfel încât Google și Microsoft nu apelează niciodată instanța ta. O fac numai dacă setezi IS_CONNECTED_ACCOUNT_WEBHOOK_SUBSCRIPTION_ENABLED=true. Cum este protejată fiecare cale publică:
  • Webhook-urile fluxurilor de lucru verifică numai că spațiul de lucru și fluxul de lucru există. Oricine cunoaște URL-ul poate declanșa fluxul de lucru, așa că tratează URL-ul ca pe un secret și validează sarcina utilă în fluxul de lucru înainte de a acționa asupra ei.
  • Rutele aplicațiilor și funcțiilor logice sunt publice, cu excepția cazului în care ruta necesită autentificare (isAuthRequired). Pentru rutele publice, verifică apelantul în propriul cod, de exemplu cu semnătura serviciului expeditor.
  • Webhook-urile Google, Microsoft, SES și Resend sunt verificate de Twenty, folosind semnătura sau tokenul furnizorului.
  • Linkurile de e-mail pot înregistra numai o deschidere, un clic sau o dezabonare pentru destinatarul căruia i-au fost trimise.

Clienți AI (MCP)

Asistenții AI reprezintă unul dintre principalele moduri în care echipa ta va folosi Twenty, prin serverul său MCP. Ce trebuie să deschizi depinde de locul în care rulează asistentul, nu de asistentul utilizat.

Clienți locali: nimic de deschis

Claude Code, Codex CLI, Cursor și alte instrumente care rulează pe computerul tău se conectează la Twenty de pe acel computer. Dacă se află în tailnet-ul sau VPN-ul tău, acestea accesează /mcp în același mod în care browserul tău accesează aplicația. Aceasta este cea mai sigură configurare, așa că prefer-o atunci când poți. Claude Desktop este excepția: conectorii adăugați în Setări → Conectori rulează în cloud-ul Anthropic, chiar și în aplicația desktop. Pentru a păstra conexiunea locală, adaugă în schimb Twenty ca server MCP local în claude_desktop_config.json:

Conectori cloud: deschide cu grijă

Claude (web, mobil și conectorii din aplicația desktop) și ChatGPT apelează serverul tău din infrastructura Anthropic și OpenAI, nu de pe dispozitivul tău. Nu pot accesa o instanță privată, deci trebuie să deschizi /mcp, /oauth și /.well-known pentru intervalele lor IP.
O listă de permisiuni IP verifică din ce rețea provine o solicitare, nu cine a trimis-o. Oricine are un cont Claude sau ChatGPT poate adăuga URL-ul tău ca conector și trimite solicitări către aceste căi.
Autentificarea este cea care îi ține departe. Pentru a obține un token, un utilizator trebuie să se conecteze pe pagina /authorize a Twenty, care rămâne în zona privată. O persoană din afara rețelei tale poate începe fluxul de conectare, dar nu îl poate finaliza, iar /mcp respinge fiecare solicitare fără un token valid. Ceea ce rămâne expus este codul care rulează înainte de autentificare: descoperirea OAuth, înregistrarea clientului (/oauth/register) și endpointul de token. Lista de permisiuni restrânge acest lucru: scanerele de pe întregul internet nu pot accesa direct aceste căi, iar solicitările trebuie să provină prin infrastructura Claude sau ChatGPT. Nu face acel cod sigur de unul singur, așa că actualizările rămân importante. Dacă folosești conectori cloud:
  • Deschide numai /mcp, /oauth și /.well-known. Nu deschide niciodată /authorize sau restul aplicației.
  • Permite numai furnizorii pe care îi folosești:
    • Anthropic: 160.79.104.0/21, din pagina cu adresele IP Anthropic.
    • OpenAI: lista din chatgpt-connectors.json. OpenAI o descrie ca fiind depusă cu bună-credință și se modifică în timp, așa că actualizeaz-o periodic:
  • Actualizează rapid când notele de lansare menționează remedieri MCP sau OAuth.

Verifică configurarea

Testează de pe ambele părți ale rețelei tale după orice modificare:
Antetul ar trebui să indice către https://crm.example.com/.well-known/.... Dacă afișează http:// sau 127.0.0.1, proxy-ul tău nu redirecționează antetele Host și X-Forwarded-Proto.

Listă de verificare de bază

Postgres și Redis nu sunt publicate. Fișierul implicit docker-compose.yml nu le publică; păstrează această configurare dacă îl editezi.
Nimic nu ocolește proxy-ul sau tunelul tău. Cu un proxy pe gazdă, portul Twenty este legat la 127.0.0.1. Cu cloudflared în Docker, serviciul server nu publică niciun port. Docker își scrie propriile reguli de firewall, astfel încât porturile pe care le publică ocolesc ufw și firewall-urile similare ale gazdei.
Secretele sunt lungi și aleatorii și știi cum să le rotești.
Membrii spațiului de lucru folosesc SSO sau autentificare cu doi factori.
Baza de date este salvată conform unei planificări și ai testat o restaurare.
TAG este fixat la o versiune și faci actualizări în mod intenționat.

Rămâi la zi

Niciunul dintre cele de mai sus nu înlocuiește actualizarea. Îți oferă timp.
  • Urmărește lansările pe GitHub: Urmărește → Personalizat → Lansări.
  • Când o lansare include o remediere de securitate, actualizează imediat ce recomandarea aferentă indică acest lucru: în aceeași zi pentru problemele critice. Urmează ghidul de actualizare.
  • Raportează vulnerabilitățile la security@twenty.com, nu în probleme publice.