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.
| Dienst | Blootstelling | Notities |
|---|---|---|
web | Openbaar, achter uw HTTPS-proxy | De enige service die browsers nodig hebben. De nginx stuurt app-API en realtime verkeer door naar api intern. |
public-api | Optioneel, openbaar | Publiceer het alleen voor integraties, de API-referentie of AI-agent OAuth. |
mcp | Optioneel, openbaar | Publiceer het alleen als externe AI-clients verbinding moeten maken. |
api | Alleen intern | Geef de hoofd-API nooit een eigen publiek domein. |
worker | Alleen intern | Voert planners en uitgaande leveringen uit. |
postgres | Alleen host-loopback | Gebonden aan 127.0.0.1:5433 standaard (POSTGRES_BIND_PORT). Gebruik een SSH-tunnel voor externe toegang. |
valkey | Alleen intern | Geen gepubliceerde poort. Het werkt zonder wachtwoord op het Compose-netwerk, dus publiceer het nooit. |
admin-api | Standaard uitgeschakeld | Begint alleen met COMPOSE_PROFILES=admin. Zet het op een eigen domein als je het inschakelt. |
| Toezicht | Standaard uitgeschakeld | Met 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 maakWEB_ORIGINenCOOKIE_DOMAINovereenkomen met het openbare HTTPS-adres. - De webcontainer verzendt
Strict-Transport-SecuritymetincludeSubDomainsen 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 restrictiefPermissions-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:
| Instelling | Stel standaard samen | Instellen op true wanneer |
|---|---|---|
API_TRUST_PROXY | false | De app bevindt zich achter een proxy die het echte client-IP instelt. |
PUBLIC_API_TRUST_PROXY | false | Hetzelfde geldt voor de openbare API. |
MCP_TRUST_PROXY | true | Laat het liggen true alleen zolang MCP uitsluitend via een dergelijke proxy bereikbaar is. |
ADMIN_TRUST_PROXY | true | Laat 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.
| Geheim | Beschermt | Als je het verandert |
|---|---|---|
POSTGRES_PASSWORD | De database-login | Update ook de actieve databasegebruiker. |
JWT_SECRET | App-sessies | Iedereen is afgemeld. Dit is de snelste manier om elke sessie te beëindigen na een vermoedelijk lek. |
MFA_ENCRYPTION_KEY | Authenticatorgeheimen en herstelcodes | Elke geregistreerde authenticator werkt niet meer. |
MEDIA_SIGNING_SECRET | Ondertekende media-URL's | Bestaande mediakoppelingen worden niet meer opgelost. |
SECRETS_ENCRYPTION_KEY | Opgeslagen SMTP-, opslag-, webhook-, chatbestemming- en GitHub-app-inloggegevens | Opgeslagen inloggegevens kunnen niet langer worden gedecodeerd en moeten opnieuw worden ingevoerd. |
MCP_INTERNAL_SECRET | De privé-uitwisseling tussen mcp en public-api | Stel dezelfde nieuwe waarde in voor beide services. MCP-verzoeken tijdens de vlucht kunnen mislukken. |
ADMIN_JWT_SECRET | Managementportal-sessies | Portalbeheerders zijn afgemeld. |
METRICS_TOKEN | /metrics schrapen | Update Prometheus zodat deze overeenkomt. |
DB_BACKUP_ENCRYPTION_PASSPHRASE | Gecodeerde back-ups | Back-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_URLvoor 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_ENABLEDstandaard ingesteld optrue, 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_URLenPUBLIC_API_OAUTH_ISSUERnaar 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.