Ga naar de hoofdinhoud

Veiligheid en verharding

Op deze pagina worden de beveiligingsbeslissingen verzameld voor een zelf-hostende Kanera-implementatie. Het behandelt waar het internet mee te maken heeft, welke geheimen er toe doen, waar de server contact mee maakt en welke instellingen moeten worden aangescherpt zodra de stapel actief is.

Lees het daarna Aan de slag. De gedetailleerde instellingen staan ​​op de andere zelfhostende pagina's, die vanuit elke sectie zijn gelinkt.

Waar het internet mee te maken heeft​

De gebundelde docker-compose.yml publiceert geen van de applicatieservices. Jij beslist wat je publiceert, meestal via een compose.override.yml en een omgekeerde proxy. Zie Diensten en routering.

DienstBlootstellingNotities
webOpenbaar, achter uw HTTPS-proxyDe enige service die browsers nodig hebben. De nginx stuurt app-API en realtime verkeer door naar api intern.
public-apiOptioneel, openbaarPubliceer het alleen voor integraties, de API-referentie of AI-agent OAuth.
mcpOptioneel, openbaarPubliceer het alleen als externe AI-clients verbinding moeten maken.
apiAlleen internGeef de hoofd-API nooit een eigen publiek domein.
workerAlleen internVoert planners en uitgaande leveringen uit.
postgresAlleen host-loopbackGebonden aan 127.0.0.1:5433 standaard (POSTGRES_BIND_PORT). Gebruik een SSH-tunnel voor externe toegang.
valkeyAlleen internGeen gepubliceerde poort. Het werkt zonder wachtwoord op het Compose-netwerk, dus publiceer het nooit.
admin-apiStandaard uitgeschakeldBegint alleen met COMPOSE_PROFILES=admin. Zet het op een eigen domein als je het inschakelt.
ToezichtStandaard uitgeschakeldMet de monitoring profiel, Prometheus en Grafana binden zich aan 127.0.0.1 tenzij je instelt MONITORING_BIND_IP, bijvoorbeeld naar een VPN-adres. Bind ze nooit vast 0.0.0.0.

Hoe minder services u publiceert, hoe minder er valt aan te vallen. Voor een implementatie die alleen de web-app gebruikt, is één openbaar domein nodig.

TLS en de omgekeerde proxy​

De containers van Kanera spreken gewone HTTP. Beëindig TLS bij uw reverse proxy of load balancer (Caddy, Traefik, nginx of een cloud load balancer) en bedien elk openbaar domein via HTTPS.

  • Instellen COOKIE_SECURE=true, en maak WEB_ORIGIN en COOKIE_DOMAIN overeenkomen met het openbare HTTPS-adres.
  • De webcontainer verzendt Strict-Transport-Security met includeSubDomains en een levensduur van één jaar. Browsers zullen dan ook aandringen op HTTPS voor subdomeinen van het app-domein, dus houd API, MCP en admin-subdomeinen op HTTPS.
  • Het verzendt ook een inhoudsbeveiligingsbeleid, X-Frame-Options: SAMEORIGIN, X-Content-Type-Options: nosniffen een restrictief Permissions-Policy. Strip ze niet bij de proxy.

Tarieflimieten en aanmeldingsbeperkingen gebruiken het client-IP. Dat IP-adres is alleen betrouwbaar als een proxy de forwarding headers overschrijft:

InstellingStel standaard samenInstellen op true wanneer
API_TRUST_PROXYfalseDe app bevindt zich achter een proxy die het echte client-IP instelt.
PUBLIC_API_TRUST_PROXYfalseHetzelfde geldt voor de openbare API.
MCP_TRUST_PROXYtrueLaat het liggen true alleen zolang MCP uitsluitend via een dergelijke proxy bereikbaar is.
ADMIN_TRUST_PROXYtrueLaat het liggen true alleen zolang de beheerder API uitsluitend via een dergelijke proxy bereikbaar is.

Als een service proxyheaders vertrouwt, maar klanten deze rechtstreeks kunnen bereiken, kunnen ze hun IP-adres vervalsen en de limieten per IP omzeilen.

Geheimen​

Genereer elk geheim afzonderlijk, bijvoorbeeld met openssl rand -hex 32en bewaar ze in een geheime opslag buiten de server, maar ook binnen .env. Tijdens de productie weigert de API te starten terwijl bekende tijdelijke aanduidingen voor ontwikkeling nog steeds in gebruik zijn. Hij weigert ook wanneer te starten SECRETS_ENCRYPTION_KEY ontbreekt of is gelijk aan JWT_SECRET, of wanneer MCP_INTERNAL_SECRET of ADMIN_JWT_SECRET gelijk aan JWT_SECRET.

GeheimBeschermtAls je het verandert
POSTGRES_PASSWORDDe database-loginUpdate ook de actieve databasegebruiker.
JWT_SECRETApp-sessiesIedereen is afgemeld. Dit is de snelste manier om elke sessie te beëindigen na een vermoedelijk lek.
MFA_ENCRYPTION_KEYAuthenticatorgeheimen en herstelcodesElke geregistreerde authenticator werkt niet meer.
MEDIA_SIGNING_SECRETOndertekende media-URL'sBestaande mediakoppelingen worden niet meer opgelost.
SECRETS_ENCRYPTION_KEYOpgeslagen SMTP-, opslag-, webhook-, chatbestemming- en GitHub-app-inloggegevensOpgeslagen inloggegevens kunnen niet langer worden gedecodeerd en moeten opnieuw worden ingevoerd.
MCP_INTERNAL_SECRETDe privé-uitwisseling tussen mcp en public-apiStel dezelfde nieuwe waarde in voor beide services. MCP-verzoeken tijdens de vlucht kunnen mislukken.
ADMIN_JWT_SECRETManagementportal-sessiesPortalbeheerders zijn afgemeld.
METRICS_TOKEN/metrics schrapenUpdate Prometheus zodat deze overeenkomt.
DB_BACKUP_ENCRYPTION_PASSPHRASEGecodeerde back-upsBack-ups gemaakt met de oude wachtwoordzin hebben nog steeds de oude wachtwoordzin nodig.

Kanera heeft geen ingebouwde manier om opgeslagen gegevens opnieuw te versleutelen onder een nieuwe sleutel. Behandel MFA_ENCRYPTION_KEY en SECRETS_ENCRYPTION_KEY zo langlevend, en plan een rotatie voordat u er een nodig heeft. Zie Geheimen die de moeite waard zijn om te bewaren.

Statistieken zijn standaard ingeschakeld, maar /metrics retourneert 404 tot METRICS_TOKEN is ingesteld. Het monitoringprofiel weigert te starten zonder METRICS_TOKEN en GRAFANA_ADMIN_PASSWORD.

Uitgaand verkeer​

Kanera heeft geen updatecontrole. Productanalyse is standaard uitgeschakeld en alleen bedoeld voor Kanera Cloud. De server maakt alleen contact met bestemmingen die u, uw beheerders of uw gebruikers configureren:

  • Uw SMTP-server, S3-compatibele opslag en back-upbucket.
  • Browser-pushservices, zodra een organisatiebeheerder push heeft ingeschakeld.
  • Werkruimtewebhooks en chatbestemmingen (Slack, Discord, Telegram, Zulip) ingesteld door werkruimtebeheerders.
  • Persoonlijke ntfy-, Gotify- of webhook-kanalen ingesteld door gebruikers.
  • ALERT_WEBHOOK_URL voor operationele waarschuwingen, indien ingesteld.
  • Trello, tijdens een import waarmee bijlagen worden gekopieerd TRELLO_API_KEYen GitHub, wanneer een GitHub-app is geconfigureerd voor linkvoorbeelden.
  • Cloudflare Turnstile, alleen als de sleutels zijn ingesteld. Laat ze uitgeschakeld voor normale zelfhosting.

Eén bestemming is niet door de operator geconfigureerd. Wanneer een AI-client de MCP belt search.docs tool downloadt de MCP-service de openbare documentatie-index van https://www.kanera.app/docs-search.json en zoekt het lokaal op. De zoekopdracht wordt niet verzonden.

Privé netwerken​

Webhooks en chatbestemmingen in de werkruimte moeten openbare HTTPS-adressen gebruiken. Kanera weigert loopback-, privé-, CGNAT-, link-local- en cloud-metagegevens en andere gereserveerde adressen. Het controleert het adres opnieuw op het moment van bezorging en volgt geen omleidingen. Dat voorkomt dat een webhook of chatbestemming naar services binnen uw netwerk wordt verwezen.

Persoonlijke meldingskanalen volgen dezelfde regel, tenzij u zich aanmeldt:

KANERA_ALLOW_PRIVATE_NOTIFICATION_DESTINATIONS=true

Hiermee kunnen gebruikers ntfy-, Gotify- en persoonlijke webhook-meldingen sturen naar http:// en particuliere netwerkontvangers. Link-local- en metadata-adressen, multicast- en andere gereserveerde bereiken blijven geblokkeerd. De regel voor webhooks voor werkruimten of chatbestemmingen wordt niet versoepeld. Schakel dit alleen in als u accepteert dat elke gebruiker de server verzoeken kan laten sturen naar hosts op uw interne netwerk. Zie E-mail en meldingen.

Back-ups​

De optionele db-backup service codeert elke PostgreSQL-dump met GPG symmetrische AES-256 voordat deze wordt geüpload naar S3-compatibele opslag. Een handleiding pg_dump is niet gecodeerd, dus codeer het zelf voordat het de server verlaat. Geüploade bestanden in de kanera_uploads volume valt daar niet onder db-backup en hebben hun eigen back-up nodig. Bewaar back-ups en de back-upwachtwoordzin van de primaire schijf van de server. Zie Opslag en back-ups.

Updates​

Er zijn beveiligingsoplossingen beschikbaar voor de nieuwste getagde release. Voer een getagde release uit in plaats van de main branch, update wanneer een nieuwe wordt verzonden, lees de release-opmerkingen en maak een back-up voordat u bijwerkt. Afbeeldingen van derden in het opstelbestand zijn vastgemaakt aan exacte versies, dus een routinematige herimplementatie verandert PostgreSQL of Valkey niet zonder een beoordeelde wijziging. Zie Updates en schaling.

Accounts en inloggen​

  • Sluit de openbare aanmelding. Nadat u uw organisatie heeft aangemaakt, stelt u in SIGNUPS_ENABLED=false. Uitnodigingslinks blijven werken.
  • Controleer e-mailadressen. Zodra uitgaande e-mail werkt, stelt u dit in EMAIL_VERIFICATION_ENABLED=true.
  • Blijf de auth-throttling inschakelen. AUTH_RATE_LIMIT_ENABLED standaard ingesteld op true, waardoor 10 pogingen per minuut per IP mogelijk zijn.
  • MFA vereisen. Organisatiebeheerders kunnen een authenticator vereisen voor iedereen hieronder Instellingen -> Organisatie -> Beveiliging. Zie Profiel en beveiliging.
  • Sessielevens. App-toegangstokens duren 5 minuten en vernieuwingssessies 10 dagen (JWT_ACCESS_TTL, JWT_REFRESH_TTL_DAYS).
  • Beheerportaal. Het is standaard uitgeschakeld en gebruikt zijn eigen accounts en geheim. Als u dit inschakelt, fungeren de ondersteuningssessies als de eigenaar van de doelorganisatie. Elke auditlog wordt vastgelegd in een auditlogboek en verloopt automatisch, standaard na 60 minuten (SUPPORT_SESSION_TTL_MINUTES, maximaal 480).

Toegang tot AI-agenten​

Blootstellen mcp en de OAuth-routes aan public-api alleen als u externe AI-clients wilt. Plangating is niet van toepassing op zelf-gehoste implementaties, dus zodra MCP bereikbaar is, kan elk lid verbinding maken met een agent die handelt met de machtigingen van dat lid.

  • Instellen MCP_SERVER_PUBLIC_URL en PUBLIC_API_OAUTH_ISSUER naar uw eigen domeinen. OAuth-tokens zijn gebonden aan dat MCP-adres en worden afgewezen door /api/v1.
  • Elke klant kan zich registreren op /oauth/register. Registreren levert niets op totdat een aangemelde gebruiker de verbinding goedkeurt op het toestemmingsscherm.
  • Geauthenticeerde openbare API- en MCP-verzoeken zijn standaard beperkt tot 400 per minuut per referentie. Mislukte sleutelpogingen zijn beperkt tot 10 per minuut per IP. Zie Milieureferentie.
  • De MCP-service registreert de naam, de duur en het resultaat van elke toolaanroep, maar niet de argumenten ervan.

Zie Integraties en API's voor installatie en Agentmachtigingen en beveiliging voor wat een agent kan doen.

Meld een kwetsbaarheid​

Open geen openbaar probleem vanwege een beveiligingsprobleem. E-mail [email protected] met een beschrijving, reproductiestappen, het betreffende onderdeel en of dit van invloed is op de standaard zelf-hostende configuratie. Meldingen worden binnen vijf werkdagen bevestigd. Zie SECURITY.md in de Kanera-repository voor reikwijdte en openbaarmaking.