Zum Hauptinhalt springen

Sicherheit und Härtung

Auf dieser Seite werden die Sicherheitsentscheidungen für eine selbstgehostete Kanera-Bereitstellung gesammelt. Es deckt ab, was mit dem Internet zu tun hat, welche Geheimnisse wichtig sind, was der Server kontaktiert und welche Einstellungen verschärft werden müssen, sobald der Stack läuft.

Lesen Sie es anschließend Erste Schritte. Die detaillierten Einstellungen finden Sie auf den anderen Selbsthostseiten, die von jedem Abschnitt aus verlinkt sind.

Was steht dem Internet bevor?​

Das gebündelte docker-compose.yml veröffentlicht keinen der Anwendungsdienste. Sie entscheiden, was Sie veröffentlichen möchten, normalerweise durch a compose.override.yml und ein Reverse-Proxy. Siehe Dienste und Routing.

ServiceBelichtungNotizen
webÖffentlich, hinter Ihrem HTTPS-ProxyDer einzige Dienst, den Browser benötigen. Sein Nginx leitet App-API und Echtzeitverkehr an weiter api intern.
public-apiOptional, öffentlichVeröffentlichen Sie es nur für Integrationen, die API-Referenz oder AI Agent OAuth.
mcpOptional, öffentlichVeröffentlichen Sie es nur, wenn Remote-KI-Clients eine Verbindung herstellen sollen.
apiNur internGeben Sie der Haupt-API niemals eine eigene öffentliche Domäne.
workerNur internFührt Planer und ausgehende Lieferungen aus.
postgresNur Host-LoopbackGebunden an 127.0.0.1:5433 standardmäßig (POSTGRES_BIND_PORT). Verwenden Sie einen SSH-Tunnel für den Fernzugriff.
valkeyNur internKein veröffentlichter Port. Es läuft ohne Passwort im Compose-Netzwerk, also veröffentlichen Sie es niemals.
admin-apiStandardmäßig deaktiviertBeginnt nur mit COMPOSE_PROFILES=admin. Platzieren Sie es in einer eigenen Domäne, wenn Sie es aktivieren.
ÜberwachungStandardmäßig deaktiviertMit dem monitoring Profil, an das Prometheus und Grafana binden 127.0.0.1 es sei denn, Sie legen fest MONITORING_BIND_IP, zum Beispiel an eine VPN-Adresse. Binden Sie sie niemals an sich 0.0.0.0.

Je weniger Dienste Sie veröffentlichen, desto weniger Angriffsmöglichkeiten gibt es. Eine Bereitstellung, die nur die Web-App verwendet, benötigt eine einzige öffentliche Domäne.

TLS und der Reverse-Proxy​

Kaneras Container sprechen reines HTTP. Beenden Sie TLS an Ihrem Reverse-Proxy oder Load-Balancer (Caddy, Traefik, Nginx oder einem Cloud-Load-Balancer) und bedienen Sie jede öffentliche Domain über HTTPS.

  • Set COOKIE_SECURE=true, und machen WEB_ORIGIN und COOKIE_DOMAIN mit der öffentlichen HTTPS-Adresse übereinstimmen.
  • Der Webcontainer sendet Strict-Transport-Security mit includeSubDomains und eine Lebensdauer von einem Jahr. Browser bestehen dann auch für Subdomains der App-Domain auf HTTPS, also belassen Sie API, MCP und Admin-Subdomains auf HTTPS.
  • Außerdem wird eine Inhaltssicherheitsrichtlinie gesendet. X-Frame-Options: SAMEORIGIN, X-Content-Type-Options: nosniffund eine restriktive Permissions-Policy. Entfernen Sie sie nicht am Proxy.

Ratenbegrenzungen und Anmeldedrosseln verwenden die Client-IP. Diese IP ist nur vertrauenswürdig, wenn ein Proxy die Weiterleitungsheader überschreibt:

EinstellungStandard verfassenStellen Sie auf ein true wann
API_TRUST_PROXYfalseDie App sitzt hinter einem Proxy, der die echte Client-IP festlegt.
PUBLIC_API_TRUST_PROXYfalseDas Gleiche gilt für die öffentliche API.
MCP_TRUST_PROXYtrueLass es true nur solange MCP ausschließlich über einen solchen Proxy erreichbar ist.
ADMIN_TRUST_PROXYtrueLass es true Nur solange die Admin-API ausschließlich über einen solchen Proxy erreichbar ist.

Wenn ein Dienst Proxy-Headern vertraut, Clients ihn aber direkt erreichen können, können sie ihre IP fälschen und IP-Beschränkungen umgehen.

Geheimnisse​

Generieren Sie jedes Geheimnis separat, zum Beispiel mit openssl rand -hex 32und bewahren Sie sie in einem geheimen Speicher sowohl außerhalb als auch innerhalb des Servers auf .env. In der Produktion verweigert die API den Start, solange bekannte Entwicklungsplatzhalter noch verwendet werden. Es weigert sich auch, wann zu starten SECRETS_ENCRYPTION_KEY fehlt oder ist gleich JWT_SECRET, oder wann MCP_INTERNAL_SECRET oder ADMIN_JWT_SECRET gleicht JWT_SECRET.

GeheimnisSchütztWenn Sie es ändern
POSTGRES_PASSWORDDer Datenbank-LoginAktualisieren Sie auch den laufenden Datenbankbenutzer.
JWT_SECRETApp-SitzungenAlle sind abgemeldet. Dies ist der schnellste Weg, jede Sitzung nach einem vermuteten Leck zu beenden.
MFA_ENCRYPTION_KEYGeheimnisse des Authentifikators und WiederherstellungscodesJeder registrierte Authentifikator funktioniert nicht mehr.
MEDIA_SIGNING_SECRETSignierte Medien-URLsVorhandene Medienlinks werden nicht mehr aufgelöst.
SECRETS_ENCRYPTION_KEYGespeicherte SMTP-, Speicher-, Webhook-, Chat-Ziel- und GitHub-App-AnmeldeinformationenGespeicherte Zugangsdaten können nicht mehr entschlüsselt werden und müssen erneut eingegeben werden.
MCP_INTERNAL_SECRETDer private Austausch zwischen mcp und public-apiLegen Sie für beide Dienste denselben neuen Wert fest. MCP-Anfragen während des Flugs schlagen möglicherweise fehl.
ADMIN_JWT_SECRETManagement-Portal-SitzungenPortaladministratoren sind abgemeldet.
METRICS_TOKEN/metrics SchabenAktualisieren Sie Prometheus entsprechend.
DB_BACKUP_ENCRYPTION_PASSPHRASEVerschlüsselte BackupsBackups, die mit der alten Passphrase erstellt wurden, benötigen weiterhin die alte Passphrase.

Kanera verfügt über keine integrierte Möglichkeit, gespeicherte Daten unter einem neuen Schlüssel erneut zu verschlüsseln. Behandeln MFA_ENCRYPTION_KEY und SECRETS_ENCRYPTION_KEY möglichst langlebig und planen Sie eine Rotation ein, bevor Sie sie benötigen. Siehe Geheimnisse, die es wert sind, bewahrt zu werden.

Metriken sind standardmäßig aktiviert, aber /metrics kehrt zurück 404 bis METRICS_TOKEN eingestellt ist. Das Überwachungsprofil weigert sich, ohne zu starten METRICS_TOKEN und GRAFANA_ADMIN_PASSWORD.

Ausgehender Verkehr​

Kanera hat keine Update-Prüfung. Die Produktanalyse ist standardmäßig deaktiviert und nur für Kanera Cloud gedacht. Der Server kontaktiert nur Ziele, die Sie, Ihre Administratoren oder Ihre Benutzer konfigurieren:

  • Ihr SMTP-Server, S3-kompatibler Speicher und Backup-Bucket.
  • Browser-Push-Dienste, sobald ein Organisationsadministrator Push aktiviert.
  • Workspace-Webhooks und Chat-Ziele (Slack, Discord, Telegram, Zulip), eingerichtet von Workspace-Administratoren.
  • Von Benutzern eingerichtete persönliche NTFY-, Gotify- oder Webhook-Kanäle.
  • ALERT_WEBHOOK_URL für Betriebswarnungen, sofern festgelegt.
  • Trello, während eines Imports, der Anhänge mit kopiert TRELLO_API_KEYund GitHub, wenn eine GitHub-App für Linkvorschauen konfiguriert ist.
  • Cloudflare-Drehkreuz, nur wenn die Schlüssel festgelegt sind. Lassen Sie sie für normales Selbsthosting deaktiviert.

Ein Ziel ist nicht vom Betreiber konfiguriert. Wenn ein KI-Client den MCP anruft search.docs Mit diesem Tool lädt der MCP-Dienst den öffentlichen Dokumentationsindex herunter https://www.kanera.app/docs-search.json und durchsucht es lokal. Die Suchanfrage wird nicht gesendet.

Private Netzwerke​

Workspace-Webhooks und Chat-Ziele müssen öffentliche HTTPS-Adressen verwenden. Kanera lehnt Loopback-, private, CGNAT-, Link-Local- und Cloud-Metadaten sowie andere reservierte Adressen ab. Es überprüft die Adresse zum Zeitpunkt der Zustellung erneut und folgt keinen Weiterleitungen. Dadurch wird verhindert, dass ein Webhook oder Chat-Ziel auf Dienste in Ihrem Netzwerk verweist.

Persönliche Benachrichtigungskanäle folgen derselben Regel, sofern Sie sich nicht dafür entscheiden:

KANERA_ALLOW_PRIVATE_NOTIFICATION_DESTINATIONS=true

Auf diese Weise können Benutzer NTFY-, Gotify- und persönliche Webhook-Benachrichtigungen an senden http:// und private Netzwerkempfänger. Link-Local- und Metadatenadressen, Multicast und andere reservierte Bereiche bleiben blockiert. Die Regel für Workspace-Webhooks oder Chat-Ziele wird dadurch nicht gelockert. Aktivieren Sie es nur, wenn Sie akzeptieren, dass jeder Benutzer den Server veranlassen kann, Anfragen an Hosts in Ihrem internen Netzwerk zu senden. Siehe E-Mail und Benachrichtigungen.

Backups​

Das optionale db-backup Der Dienst verschlüsselt jeden PostgreSQL-Dump mit GPG symmetrischem AES-256, bevor er ihn in einen S3-kompatiblen Speicher hochlädt. Ein Handbuch pg_dump ist nicht verschlüsselt, also verschlüsseln Sie es selbst, bevor es den Server verlässt. Hochgeladene Dateien im kanera_uploads Volumen werden nicht abgedeckt db-backup und benötigen ein eigenes Backup. Halten Sie Backups und die Backup-Passphrase von der primären Festplatte des Servers fern. Siehe Speicherung und Backups.

Aktualisierungen​

Für die neueste getaggte Version werden Sicherheitsfixes bereitgestellt. Führen Sie eine getaggte Veröffentlichung anstelle der aus main Zweig, aktualisieren Sie, wenn ein neuer Zweig ausgeliefert wird, lesen Sie die Versionshinweise und erstellen Sie vor dem Update eine Sicherungskopie. Drittanbieter-Images in der Compose-Datei sind an exakte Versionen angeheftet, sodass eine routinemäßige Neubereitstellung PostgreSQL oder Valkey ohne überprüfte Änderung nicht ändert. Siehe Updates und Skalierung.

Konten und Anmeldung​

  • Öffentliche Anmeldung schließen. Nachdem Sie Ihre Organisation erstellt haben, legen Sie fest SIGNUPS_ENABLED=false. Einladungslinks funktionieren weiterhin.
  • E-Mail-Adressen überprüfen. Sobald die ausgehende E-Mail funktioniert, stellen Sie sie ein EMAIL_VERIFICATION_ENABLED=true.
  • Behalten Sie die Authentifizierungsdrosselung bei. AUTH_RATE_LIMIT_ENABLED Standardmäßig ist true, was 10 Versuche pro Minute und IP ermöglicht.
  • MFA erforderlich. Organisationsadministratoren können für alle unten aufgeführten Personen einen Authentifikator verlangen Einstellungen -> Organisation -> Sicherheit. Siehe Profil und Sicherheit.
  • Sitzungsdauer. App-Zugriffstokens dauern 5 Minuten und Aktualisierungssitzungen 10 Tage (JWT_ACCESS_TTL, JWT_REFRESH_TTL_DAYS).
  • Verwaltungsportal. Es ist standardmäßig deaktiviert und verwendet seine eigenen Konten und Geheimnisse. Wenn Sie es aktivieren, fungieren seine Supportsitzungen als Eigentümer einer Zielorganisation. Jeder einzelne wird in einem Überwachungsprotokoll aufgezeichnet und läuft standardmäßig nach 60 Minuten von selbst ab (SUPPORT_SESSION_TTL_MINUTES, höchstens 480).

Zugriff auf KI-Agenten​

Entlarven mcp und die OAuth-Routen weiter public-api nur, wenn Sie Remote-KI-Clients wünschen. Plan-Gating gilt nicht für selbstgehostete Bereitstellungen. Sobald also MCP erreichbar ist, kann jedes Mitglied eine Verbindung zu einem Agenten herstellen, der mit den Berechtigungen dieses Mitglieds handelt.

  • Set MCP_SERVER_PUBLIC_URL und PUBLIC_API_OAUTH_ISSUER zu Ihren eigenen Domains. OAuth-Tokens sind an diese MCP-Adresse gebunden und werden von dieser abgelehnt /api/v1.
  • Jeder Kunde kann sich bei registrieren /oauth/register. Durch die Registrierung wird nichts gewährt, bis ein angemeldeter Benutzer die Verbindung auf dem Zustimmungsbildschirm genehmigt.
  • Authentifizierte öffentliche API- und MCP-Anfragen sind standardmäßig auf 400 pro Minute und Anmeldeinformation begrenzt. Fehlgeschlagene Schlüsselversuche sind auf 10 pro Minute und IP begrenzt. Siehe Umgebungsreferenz.
  • Der MCP-Dienst protokolliert den Namen, die Dauer und das Ergebnis jedes Tool-Aufrufs, nicht jedoch seine Argumente.

Siehe Integrationen und APIs zum Einrichten und Agentenberechtigungen und Sicherheit für das, was ein Agent tun kann.

Melden Sie eine Sicherheitslücke​

Öffnen Sie keine öffentliche Ausgabe wegen eines Sicherheitsproblems. E-Mail [email protected] mit einer Beschreibung, Reproduktionsschritten, der betroffenen Komponente und ob sie sich auf die selbstgehostete Standardkonfiguration auswirkt. Meldungen werden innerhalb von fünf Werktagen bestätigt. Siehe SECURITY.md im Kanera-Repository für Umfang und Offenlegung.