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.
| Service | Exposition | Notes |
|---|---|---|
web | Public, derrière votre proxy HTTPS | Le 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-api | Facultatif, public | Publiez-le uniquement pour les intégrations, la référence API ou l'agent IA OAuth. |
mcp | Facultatif, public | Publiez-le uniquement si les clients IA distants doivent se connecter. |
api | Interne uniquement | Ne donnez jamais à l'API principale son propre domaine public. |
worker | Interne uniquement | Exécute les planificateurs et la livraison sortante. |
postgres | Bouclage de l'hôte uniquement | Lié à 127.0.0.1:5433 par défaut (POSTGRES_BIND_PORT). Utilisez un tunnel SSH pour l'accès à distance. |
valkey | Interne uniquement | Aucun port publié. Il s'exécute sans mot de passe sur le réseau Compose, donc ne le publiez jamais. |
admin-api | Désactivé par défaut | Commence seulement par COMPOSE_PROFILES=admin. Mettez-le sur son propre domaine si vous l'activez. |
| Surveillance | Désactivé par défaut | Avec 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 faireWEB_ORIGINetCOOKIE_DOMAINcorrespondre à l’adresse HTTPS publique. - Le conteneur Web envoie
Strict-Transport-SecurityavecincludeSubDomainset 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 restrictifPermissions-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ètre | Composer par défaut | Régler sur true quand |
|---|---|---|
API_TRUST_PROXY | false | L'application se trouve derrière un proxy qui définit la véritable adresse IP du client. |
PUBLIC_API_TRUST_PROXY | false | Idem pour l'API publique. |
MCP_TRUST_PROXY | true | Laisse-le true seulement tant que MCP est accessible uniquement via un tel proxy. |
ADMIN_TRUST_PROXY | true | Laisse-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.
| Secret | Protège | Si tu le change |
|---|---|---|
POSTGRES_PASSWORD | La connexion à la base de données | Mettez également à jour l'utilisateur de la base de données en cours d'exécution. |
JWT_SECRET | Sessions d'application | Tout 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_KEY | Secrets d'authentification et codes de récupération | Chaque authentificateur inscrit cesse de fonctionner. |
MEDIA_SIGNING_SECRET | URL de médias signés | Les liens multimédias existants ne sont plus résolus. |
SECRETS_ENCRYPTION_KEY | SMTP stocké, stockage, webhook, destination de discussion et informations d'identification de l'application GitHub | Les informations d'identification stockées ne peuvent plus être déchiffrées et doivent être saisies à nouveau. |
MCP_INTERNAL_SECRET | L'échange privé entre mcp et public-api | Définissez la même nouvelle valeur sur les deux services. Les requêtes MCP en vol peuvent échouer. |
ADMIN_JWT_SECRET | Sessions du portail de gestion | Les administrateurs du portail sont déconnectés. |
METRICS_TOKEN | /metrics grattage | Mettez à jour Prometheus pour qu'il corresponde. |
DB_BACKUP_ENCRYPTION_PASSPHRASE | Sauvegardes cryptées | Les 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_URLpour 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_ENABLEDpar défauttrue, 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_URLetPUBLIC_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.