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.
| Service | Belichtung | Notizen |
|---|---|---|
web | Öffentlich, hinter Ihrem HTTPS-Proxy | Der einzige Dienst, den Browser benötigen. Sein Nginx leitet App-API und Echtzeitverkehr an weiter api intern. |
public-api | Optional, öffentlich | Veröffentlichen Sie es nur für Integrationen, die API-Referenz oder AI Agent OAuth. |
mcp | Optional, öffentlich | Veröffentlichen Sie es nur, wenn Remote-KI-Clients eine Verbindung herstellen sollen. |
api | Nur intern | Geben Sie der Haupt-API niemals eine eigene öffentliche Domäne. |
worker | Nur intern | Führt Planer und ausgehende Lieferungen aus. |
postgres | Nur Host-Loopback | Gebunden an 127.0.0.1:5433 standardmäßig (POSTGRES_BIND_PORT). Verwenden Sie einen SSH-Tunnel für den Fernzugriff. |
valkey | Nur intern | Kein veröffentlichter Port. Es läuft ohne Passwort im Compose-Netzwerk, also veröffentlichen Sie es niemals. |
admin-api | Standardmäßig deaktiviert | Beginnt nur mit COMPOSE_PROFILES=admin. Platzieren Sie es in einer eigenen Domäne, wenn Sie es aktivieren. |
| Überwachung | Standardmäßig deaktiviert | Mit 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 machenWEB_ORIGINundCOOKIE_DOMAINmit der öffentlichen HTTPS-Adresse übereinstimmen. - Der Webcontainer sendet
Strict-Transport-SecuritymitincludeSubDomainsund 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 restriktivePermissions-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:
| Einstellung | Standard verfassen | Stellen Sie auf ein true wann |
|---|---|---|
API_TRUST_PROXY | false | Die App sitzt hinter einem Proxy, der die echte Client-IP festlegt. |
PUBLIC_API_TRUST_PROXY | false | Das Gleiche gilt für die öffentliche API. |
MCP_TRUST_PROXY | true | Lass es true nur solange MCP ausschließlich über einen solchen Proxy erreichbar ist. |
ADMIN_TRUST_PROXY | true | Lass 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.
| Geheimnis | Schützt | Wenn Sie es ändern |
|---|---|---|
POSTGRES_PASSWORD | Der Datenbank-Login | Aktualisieren Sie auch den laufenden Datenbankbenutzer. |
JWT_SECRET | App-Sitzungen | Alle sind abgemeldet. Dies ist der schnellste Weg, jede Sitzung nach einem vermuteten Leck zu beenden. |
MFA_ENCRYPTION_KEY | Geheimnisse des Authentifikators und Wiederherstellungscodes | Jeder registrierte Authentifikator funktioniert nicht mehr. |
MEDIA_SIGNING_SECRET | Signierte Medien-URLs | Vorhandene Medienlinks werden nicht mehr aufgelöst. |
SECRETS_ENCRYPTION_KEY | Gespeicherte SMTP-, Speicher-, Webhook-, Chat-Ziel- und GitHub-App-Anmeldeinformationen | Gespeicherte Zugangsdaten können nicht mehr entschlüsselt werden und müssen erneut eingegeben werden. |
MCP_INTERNAL_SECRET | Der private Austausch zwischen mcp und public-api | Legen Sie für beide Dienste denselben neuen Wert fest. MCP-Anfragen während des Flugs schlagen möglicherweise fehl. |
ADMIN_JWT_SECRET | Management-Portal-Sitzungen | Portaladministratoren sind abgemeldet. |
METRICS_TOKEN | /metrics Schaben | Aktualisieren Sie Prometheus entsprechend. |
DB_BACKUP_ENCRYPTION_PASSPHRASE | Verschlüsselte Backups | Backups, 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_URLfü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_ENABLEDStandardmäßig isttrue, 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_URLundPUBLIC_API_OAUTH_ISSUERzu 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.