Passer au contenu principal

Sécurité et durcissement

Cette page rassemble les décisions de sécurité pour un déploiement Kanera auto-hébergé. Il couvre ce qui fait face à Internet, quels secrets sont importants, ce que le serveur contacte et quels paramètres resserrer une fois la pile en cours d'exécution.

Lisez-le après Commencer. Les paramètres détaillés se trouvent sur les autres pages auto-hébergées, qui sont liées depuis chaque section.

À quoi fait face Internet​

Le groupé docker-compose.yml ne publie aucun des services d'application. Vous décidez quoi publier, généralement via un compose.override.yml et un proxy inverse. Voir Services et routage.

ServiceExpositionNotes
webPublic, derrière votre proxy HTTPSLe seul service dont les navigateurs ont besoin. Son nginx transmet l'API de l'application et le trafic en temps réel vers api en interne.
public-apiFacultatif, publicPubliez-le uniquement pour les intégrations, la référence API ou l'agent IA OAuth.
mcpFacultatif, publicPubliez-le uniquement si les clients IA distants doivent se connecter.
apiInterne uniquementNe donnez jamais à l'API principale son propre domaine public.
workerInterne uniquementExécute les planificateurs et la livraison sortante.
postgresBouclage de l'hôte uniquementLié à 127.0.0.1:5433 par défaut (POSTGRES_BIND_PORT). Utilisez un tunnel SSH pour l'accès à distance.
valkeyInterne uniquementAucun port publié. Il s'exécute sans mot de passe sur le réseau Compose, donc ne le publiez jamais.
admin-apiDésactivé par défautCommence seulement par COMPOSE_PROFILES=admin. Mettez-le sur son propre domaine si vous l'activez.
SurveillanceDésactivé par défautAvec le monitoring profil, Prometheus et Grafana se lient à 127.0.0.1 à moins que vous ne définissiez MONITORING_BIND_IP, par exemple à une adresse VPN. Ne les liez jamais à 0.0.0.0.

Moins vous publiez de services, moins il y a de risques d’attaque. Un déploiement qui utilise uniquement l'application Web nécessite un seul domaine public.

TLS et le proxy inverse​

Les conteneurs de Kanera parlent simplement HTTP. Terminez TLS sur votre proxy inverse ou équilibreur de charge (Caddy, Traefik, nginx ou un équilibreur de charge cloud) et servez chaque domaine public via HTTPS.

  • Ensemble COOKIE_SECURE=true, et faire WEB_ORIGIN et COOKIE_DOMAIN correspondre à l’adresse HTTPS publique.
  • Le conteneur Web envoie Strict-Transport-Security avec includeSubDomains et une durée de vie d'un an. Les navigateurs insisteront alors également sur HTTPS pour les sous-domaines du domaine de l'application, alors conservez les sous-domaines API, MCP et admin sur HTTPS.
  • Il envoie également une politique de sécurité du contenu, X-Frame-Options: SAMEORIGIN, X-Content-Type-Options: nosniff, et un restrictif Permissions-Policy. Ne les déshabillez pas chez le proxy.

Les limites de débit et les limitations de connexion utilisent l’adresse IP du client. Cette adresse IP n'est digne de confiance que lorsqu'un proxy écrase les en-têtes de transfert :

ParamètreComposer par défautRégler sur true quand
API_TRUST_PROXYfalseL'application se trouve derrière un proxy qui définit la véritable adresse IP du client.
PUBLIC_API_TRUST_PROXYfalseIdem pour l'API publique.
MCP_TRUST_PROXYtrueLaisse-le true seulement tant que MCP est accessible uniquement via un tel proxy.
ADMIN_TRUST_PROXYtrueLaisse-le true uniquement lorsque l'API d'administration est accessible uniquement via un tel proxy.

Si un service fait confiance aux en-têtes de proxy mais que les clients peuvent y accéder directement, ils peuvent falsifier leur adresse IP et contourner les limites par IP.

Secrets​

Générez chaque secret séparément, par exemple avec openssl rand -hex 32, et conservez-les dans un magasin secret en dehors du serveur ainsi que dans .env. En production, l'API refuse de démarrer tant que des espaces réservés de développement connus sont toujours utilisés. Il refuse également de démarrer lorsque SECRETS_ENCRYPTION_KEY est manquant ou égal à JWT_SECRET, ou quand MCP_INTERNAL_SECRET ou ADMIN_JWT_SECRET est égal JWT_SECRET.

SecretProtègeSi tu le change
POSTGRES_PASSWORDLa connexion à la base de donnéesMettez également à jour l'utilisateur de la base de données en cours d'exécution.
JWT_SECRETSessions d'applicationTout le monde est déconnecté. C'est le moyen le plus rapide de mettre fin à chaque session après une fuite suspectée.
MFA_ENCRYPTION_KEYSecrets d'authentification et codes de récupérationChaque authentificateur inscrit cesse de fonctionner.
MEDIA_SIGNING_SECRETURL de médias signésLes liens multimédias existants ne sont plus résolus.
SECRETS_ENCRYPTION_KEYSMTP stocké, stockage, webhook, destination de discussion et informations d'identification de l'application GitHubLes informations d'identification stockées ne peuvent plus être déchiffrées et doivent être saisies à nouveau.
MCP_INTERNAL_SECRETL'échange privé entre mcp et public-apiDéfinissez la même nouvelle valeur sur les deux services. Les requêtes MCP en vol peuvent échouer.
ADMIN_JWT_SECRETSessions du portail de gestionLes administrateurs du portail sont déconnectés.
METRICS_TOKEN/metrics grattageMettez à jour Prometheus pour qu'il corresponde.
DB_BACKUP_ENCRYPTION_PASSPHRASESauvegardes cryptéesLes sauvegardes effectuées avec l’ancienne phrase secrète nécessitent toujours l’ancienne phrase secrète.

Kanera ne dispose d'aucun moyen intégré pour recrypter les données stockées sous une nouvelle clé. Traiter MFA_ENCRYPTION_KEY et SECRETS_ENCRYPTION_KEY aussi longtemps que possible et planifiez une rotation avant d’en avoir besoin. Voir Des secrets à garder.

Les métriques sont activées par défaut, mais /metrics retours 404 jusqu'à METRICS_TOKEN est réglé. Le profil de surveillance refuse de démarrer sans METRICS_TOKEN et GRAFANA_ADMIN_PASSWORD.

Trafic sortant​

Kanera n'a pas de contrôle de mise à jour. L'analyse des produits est désactivée par défaut et destinée uniquement à Kanera Cloud. Le serveur contacte uniquement les destinations que vous, vos administrateurs ou vos utilisateurs configurez :

  • Votre serveur SMTP, votre stockage compatible S3 et votre compartiment de sauvegarde.
  • Services push du navigateur, une fois qu'un administrateur de l'organisation active le push.
  • Webhooks de l'espace de travail et destinations de discussion (Slack, Discord, Telegram, Zulip) configurés par les administrateurs de l'espace de travail.
  • Canaux personnels ntfy, Gotify ou webhook configurés par les utilisateurs.
  • ALERT_WEBHOOK_URL pour les alertes opérationnelles, si elles sont définies.
  • Trello, lors d'un import qui copie les pièces jointes avec TRELLO_API_KEY, et GitHub, lorsqu'une application GitHub est configurée pour les aperçus de liens.
  • Cloudflare Turnstile, uniquement lorsque ses clés sont définies. Laissez-les désactivés pour un auto-hébergement normal.

Une destination n'est pas configurée par l'opérateur. Lorsqu'un client AI appelle le MCP search.docs outil, le service MCP télécharge l'index de la documentation publique à partir de https://www.kanera.app/docs-search.json et le recherche localement. La requête de recherche n'est pas envoyée.

Réseaux privés​

Les webhooks Workspace et les destinations de discussion doivent utiliser des adresses HTTPS publiques. Kanera refuse les métadonnées de bouclage, privées, CGNAT, lien-local et cloud, ainsi que d'autres adresses réservées. Il vérifie à nouveau l'adresse au moment de la livraison et ne suit pas les redirections. Cela empêche un webhook ou une destination de discussion d’être pointé vers les services de votre réseau.

Les canaux de notification personnels suivent la même règle, sauf si vous y consentez :

KANERA_ALLOW_PRIVATE_NOTIFICATION_DESTINATIONS=true

Cela permet aux utilisateurs d'envoyer des notifications ntfy, Gotify et des webhooks personnels à http:// et récepteurs de réseaux privés. Les adresses lien-local et de métadonnées, la multidiffusion et autres plages réservées restent bloquées. Cela n’assouplit pas la règle concernant les webhooks de l’espace de travail ou les destinations de discussion. Activez-le uniquement si vous acceptez que n'importe quel utilisateur puisse demander au serveur d'envoyer des requêtes aux hôtes de votre réseau interne. Voir E-mail et notifications.

Sauvegardes​

L'optionnel db-backup Le service chiffre chaque dump PostgreSQL avec AES-256 symétrique GPG avant de le télécharger sur un stockage compatible S3. Un manuel pg_dump n'est pas chiffré, alors chiffrez-le vous-même avant qu'il ne quitte le serveur. Fichiers téléchargés dans le kanera_uploads le volume n'est pas couvert par db-backup et ont besoin de leur propre sauvegarde. Conservez les sauvegardes et la phrase secrète de sauvegarde hors du disque principal du serveur. Voir Stockage et sauvegardes.

Mises à jour​

Des correctifs de sécurité sont fournis pour la dernière version balisée. Exécutez une version balisée plutôt que la main branche, mettez à jour lorsqu'une nouvelle est livrée, lisez les notes de version et sauvegardez avant la mise à jour. Les images tierces du fichier de composition sont épinglées sur des versions exactes, de sorte qu'un redéploiement de routine ne modifie pas PostgreSQL ou Valkey sans une modification révisée. Voir Mises à jour et mise à l'échelle.

Comptes et connexion​

  • Fermez l’inscription publique. Après avoir créé votre organisation, définissez SIGNUPS_ENABLED=false. Les liens d'invitation continuent de fonctionner.
  • Vérifiez les adresses e-mail. Une fois le courrier sortant fonctionnel, définissez EMAIL_VERIFICATION_ENABLED=true.
  • Continuez à limiter l'authentification. AUTH_RATE_LIMIT_ENABLED par défaut true, autorisant 10 tentatives par minute et par IP.
  • Exiger une MFA. Les administrateurs de l'organisation peuvent exiger un authentifiant pour toutes les personnes sous Paramètres -> Organisation -> Sécurité. Voir Profil et sécurité.
  • Durées de vie des sessions. Les jetons d'accès aux applications durent 5 minutes et les sessions d'actualisation 10 jours (JWT_ACCESS_TTL, JWT_REFRESH_TTL_DAYS).
  • Portail de gestion. Il est désactivé par défaut et utilise ses propres comptes et secrets. Si vous l'activez, ses sessions d'assistance agissent en tant que propriétaire d'une organisation cible. Chacun est enregistré dans un journal d'audit et expire tout seul, au bout de 60 minutes par défaut (SUPPORT_SESSION_TTL_MINUTES, au maximum 480).

Accès aux agents IA​

Exposer mcp et les routes OAuth sur public-api seulement si vous voulez des clients IA distants. Le plan gating ne s'applique pas aux déploiements auto-hébergés. Ainsi, une fois MCP accessible, n'importe quel membre peut connecter un agent qui agit avec les autorisations de ce membre.

  • Ensemble MCP_SERVER_PUBLIC_URL et PUBLIC_API_OAUTH_ISSUER à vos propres domaines. Les jetons OAuth sont liés à cette adresse MCP et rejetés par /api/v1.
  • Tout client peut s'inscrire sur /oauth/register. L'inscription n'accorde rien jusqu'à ce qu'un utilisateur connecté approuve la connexion sur l'écran de consentement.
  • Les requêtes API et MCP publiques authentifiées sont limitées par défaut à 400 par minute et par identifiant. Les tentatives de clé échouées sont limitées à 10 par minute et par IP. Voir Référence Environnement.
  • Le service MCP enregistre le nom, la durée et le résultat de chaque appel d'outil, mais pas ses arguments.

Voir Intégrations et API pour l'installation et Autorisations et sécurité des agents pour ce qu'un agent peut faire.

Signaler une vulnérabilité​

N'ouvrez pas de problème public pour un problème de sécurité. Courriel [email protected] avec une description, les étapes de reproduction, le composant concerné et s'il affecte la configuration auto-hébergée par défaut. Les rapports sont accusés de réception dans les cinq jours ouvrables. Voir SECURITY.md dans le référentiel Kanera pour la portée et la divulgation.