Sécurité
Ce chapitre décrit les protections que le code applique, avec le fichier qui les porte. Il sépare ce qui est en place de ce qui reste à faire. Il ne revendique aucune certification. À la fin, vous saurez quelles clés poser avant de passer en production et quelles protections reposent sur votre exploitation.
Principes
- Démarrage fermé. Sans déclaration explicite de développement
(
FORGE_DEV, ouNODE_ENV,ENVIRONMENT,RUST_ENV,APP_ENVvalantdevelopment,dev,localoutest),forge-apiapplique la posture production. Le silence n'est jamais une autorisation. - Cloisonnement par organisation. Les listes sont filtrées par organisation.
Hors développement déclaré,
forge-apirefuse de démarrer sansFORGE_TENANT_STRICTà1. - Données hébergées dans l'UE. Le registre des connecteurs refuse un
connecteur dont la résidence des données n'est pas dans l'UE ou
auto-hébergée (
connectors/README.md).
Secrets
- Dans le dépôt : aucun. Les fichiers
.envsont ignorés par git. Le modèle.env.examplene porte que des gabarits. - En production, un script génère les fichiers d'environnement sur la machine cible, avec des permissions restreintes, et n'imprime jamais les valeurs (script d'initialisation des secrets de l'hôte).
- OpenBao est facultatif. Si
BAO_ADDRest posée, il surcharge les secrets d'exécution. Le service du fichier Compose tourne en mode développement ; la configuration de production est portée par l'unité de production du coffre. - Journaux. Un filtre masque les clés d'API, jetons, clés privées et adresses e-mail avant l'écriture (filtre de rédaction du code).
Au démarrage de production, forge-api vérifie :
| Contrôle | Règle |
|---|---|
JWT_SECRET | 32 caractères au moins, ni valeur connue ni gabarit |
FORGE_STRICT_SECRETS à 1 | AT_REST_ENCRYPTION_KEY et AUDIT_SIGNING_KEY deviennent obligatoires ; sinon leur absence est un avertissement |
PHI_AT_REST_KEY | Obligatoire en production, 64 caractères hexadécimaux : sinon forge-api refuse de démarrer |
| Cloisonnement | FORGE_TENANT_STRICT à 1, obligatoire |
Le dépôt ne planifie pas de rotation automatique de l'ensemble des secrets : elle
reste à organiser côté exploitation. Deux rotations manuelles existent : celle de
la clé des données de santé (l'ancienne clé se pose dans
PHI_AT_REST_KEY_PREVIOUS, lue en repli) et
celle de la clé de l'agent de sauvegarde (route d'administration de la
sauvegarde).
Authentification
| Mécanisme | Détail | Composant |
|---|---|---|
| Mots de passe | Argon2id, paramètres de coût fixés dans le code | hachage des mots de passe |
| Jeton d'accès | JWT signé HS256, algorithme verrouillé à la vérification ; durée 7 jours par défaut | extracteur d'authentification |
| Cookie de session | jwt, attribut HttpOnly ; en production SameSite=Strict, Secure et domaine fixé par COOKIE_DOMAIN | couche cookie |
| Second facteur | Application TOTP, ou code envoyé par e-mail à durée de vie courte ; imposé par défaut (FORCE_2FA) | connexion par mot de passe |
| Codes de secours | Codes à usage unique pour qui perd son authentificateur | codes de secours |
| SSO | Authentik, OIDC avec PKCE (code_challenge_method=S256) | client OIDC |
| Autorisation fine | Moteur Cedar, chargé depuis policies/. Absent ou invalide en posture de production : forge-api refuse de démarrer. En développement déclaré : Cedar désactivé, les gardes Cedar laissent passer | démarrage du serveur |
| Post-quantique | Option FORGE_PQC_ENABLED : le jeton porte une signature ML-DSA-65 en plus de HS256, pour les clients qui la vérifient | couche cookie, signature des jetons |
Le second facteur n'est pas réservé aux administrateurs : il s'applique à tous
les comptes tant que FORCE_2FA n'est pas désactivée.
Protection des requêtes
| Protection | Détail | Composant |
|---|---|---|
| CSRF | Double soumission : cookie csrf-token lisible par le frontend, copié dans l'en-tête x-csrf-token sur les écritures. Le jeton est aussi conservé 2 heures dans Valkey. Les routes d'avant connexion, /mcp et /webhooks en sont exemptées | couche CSRF |
| Débit général | Par IP : 100 requêtes par seconde sur /api/v1, 30 par minute pour les événements de route, 20 par minute pour le chat public, 1 000 par minute ailleurs. Réponse 429 avec Retry-After | limiteur de débit |
| Connexion, par compte | Au-delà d'un nombre d'échecs dans une fenêtre glissante, le compte est bloqué pour une durée fixée dans le code. L'identité est un hachage salé : l'e-mail en clair n'atteint pas Valkey. Sans ACCOUNT_HASH_SALT, ce limiteur est désactivé | limiteur par compte |
| Connexion, par IP | Seau large, secondaire. Une liste d'exemption existe pour lui seul | limiteur par adresse |
| Taille des corps | 2 Mio par défaut, 25 Mio pour l'envoi de fichiers ; 413 au-delà | limite de taille |
| En-têtes HTTP | X-Content-Type-Options, X-Frame-Options: DENY, Referrer-Policy, Permissions-Policy, Cross-Origin-Opener-Policy, Content-Security-Policy, et Strict-Transport-Security quand la requête est en HTTPS | en-têtes de sécurité |
| Métriques | /metrics refuse l'accès anonyme | métriques |
Chaque ligne nomme le composant du serveur qui porte la protection.
Chiffrement
En transit. Le proxy inverse du plan backend (Traefik) impose TLS 1.3
au minimum dans son option par défaut ; une option distincte, hors défaut,
autorise TLS 1.2 pour les clients anciens. En posture
production, la connexion de forge-api à PostgreSQL applique les paramètres
TLS de la configuration.
Au repos. Ce que le code chiffre :
- les secrets TOTP, les identifiants de connecteurs et les secrets SSO, en
AES-256-GCM, avec une clé dérivée par enregistrement depuis
AT_REST_ENCRYPTION_KEY; - les colonnes de données de santé, avec
PHI_AT_REST_KEY(crates/forge-db) ; - la chaîne d'audit, chaînée par empreintes et signée avec
AUDIT_SIGNING_KEY(crates/forge-audit).
Le dépôt n'établit pas de chiffrement transparent de PostgreSQL, de Qdrant ou de Valkey. Protégez le disque de l'hôte.
Intrusion et conteneurs
- Les services tournent sous Podman, sans Docker, avec des unités Quadlet utilisables sans droits administrateur.
- CrowdSec détecte les adresses abusives et prend des décisions de blocage. Le déploiement du plan backend l'installe.
- Falco (comportement à l'exécution) a une unité, retirée du déploiement depuis le 2026-09-19 en attendant une version compatible avec le noyau de l'hôte.
- Le contrôle mutuel par certificat (
ZERO_TRUST_ENABLED) est décrit comme une ébauche dans le code, prête pour une intégration mTLS complète. Ne le comptez pas comme une protection.
Chaîne d'approvisionnement
- Un workflow construit l'image backend, l'analyse avec Trivy (gravité HIGH et CRITICAL, correctifs disponibles seulement) et la signe avec Cosign par clé (workflow de CI du dépôt). Il est dormant : aucun exécuteur n'y est encore rattaché, il ne tourne pas aujourd'hui.
- Un script analyse les images référencées par les fichiers Compose, et un autre génère un SBOM
(
scripts/ops/generate-sbom.sh). Ils se lancent à la main.
Bonnes pratiques d'exploitation
- N'exposez jamais PostgreSQL, Qdrant, Valkey ni OpenBao sur Internet.
- Posez
ACCOUNT_HASH_SALT,AT_REST_ENCRYPTION_KEY,AUDIT_SIGNING_KEY,PHI_AT_REST_KEYetFORGE_STRICT_SECRETS(à1) en production. - Protégez
/metricsparPROMETHEUS_BEARER_TOKEN. - Gardez des permissions restreintes sur les fichiers d'environnement.
- Relisez les gabarits avant de coller une valeur réelle dans un ticket, un journal ou un message : ne publiez jamais de secret.
Signaler une vulnérabilité
Le serveur publie /.well-known/security.txt (crates/forge-api/src/router.rs). Écrivez à
security@chatbotaurus.com ; la divulgation coordonnée est décrite dans
Réponse aux incidents.
Documents juridiques
Le dossier docs/legal/ du dépôt contient les textes de référence : politique
de confidentialité, conditions d'utilisation, accord de traitement des données,
analyses d'impact, registre des traitements et attestation de résidence des
données.
Voir aussi
- Variables d'environnement — défauts et règles de chaque variable citée dans ce chapitre
- Architecture de confiance zéro — statut de chaque contrôle selon les sept principes NIST
- SSO Authentik — parcours OIDC, refus de connexion et second facteur
- Réponse aux incidents — divulgation coordonnée, sévérités et phases quand une protection cède
- Conformité RGPD — obligations que ces mécanismes techniques mettent en œuvre