Procédures d'incident de sécurité
English: en/runbooks.md
Les événements cités sont émis par eai.security.security_event et écrits dans la chaîne d'audit du tenant. Les procédures d'exploitation générales sont dans operations/runbooks.md.
Tentatives de SSRF (security.egress.denied)
- Rechercher les événements
security.egress.denied(émis pareai.integrations.outbound.deny_event) : tenant, principal, URL rédigée, raison. - Identifier l'outil, le serveur MCP ou le connecteur concerné ; une série de refus vers
169.254.169.254, des adresses privées ou des ports inhabituels indique une attaque. - Désactiver la ressource, révoquer la clé API du principal si besoin (voir plus bas).
- Restreindre le tenant avec
egress_allowed_hosts(PUT /v1/security/settings). - Ne jamais élargir
EAI_EGRESS_PRIVATE_ALLOWLISTpour « débloquer » un tenant : cette liste ne sert qu'aux appels de la plateforme.
Campagne d'injection de prompt
- Suivre
security.prompt_injection.detectedetsecurity.prompt_injection.blocked(passerelle LLM et ingestion de connaissances) ainsi quesecurity.output.link_stripped. - Si le tenant est en
detect, passerprompt_injection_modeàblock. - Pour une injection indirecte, retrouver le document ou la source (base de connaissances, résultat d'outil) et le retirer ou le réindexer.
- Garder
untrusted_content_wrapping=trueetoutput_links=strip_untrusted. - Ajouter les charges observées aux corpus garak et promptfoo (
deploy/ci/promptfoo.yaml).
Force brute et bourrage d'identifiants
- Suivre
security.auth.failed(par IP) etsecurity.rate_limited. - Au-delà de
EAI_RATE_LIMIT_AUTH_FAILURES_PER_MINUTEéchecs par minute, l'IP reçoit 429 (check_auth_lockout). - Vérifier que
EAI_TRUSTED_PROXIESest juste : sinon toutes les requêtes semblent venir de la passerelle. - Bloquer les plages hostiles au WAF (waf-gateway), activer MFA chez l'IdP.
Clé API divulguée
- Faire tourner la clé :
POST /v1/api-keys/{key_id}/rotate(la nouvelle valeur n'est affichée qu'une fois), ou la révoquer :DELETE /v1/api-keys/{key_id}. - Rechercher dans l'audit toutes les actions de la clé depuis la fuite.
- Lancer gitleaks sur le dépôt ou l'emplacement de la fuite, purger l'historique si besoin.
- Si la clé donnait accès à des secrets d'outils ou de connecteurs, les faire tourner aussi.
Faux positif du WAF
Suivre waf-gateway : identifier la règle CRS dans le journal Coraza, ajouter une exclusion la plus étroite possible (route et paramètre) dans deploy/apisix/apisix.yaml, jamais une désactivation globale.
Réglage de la limitation de débit
- Mesurer les 429 par compartiment dans
security.rate_limited. - Ajuster
EAI_RATE_LIMIT_PER_MINUTEouEAI_RATE_LIMIT_GATEWAY_PER_MINUTEdanscontrolPlane.configde Helm. - Avec plusieurs réplicas, configurer
EAI_REDIS_URL(rediss://) pour des compteurs partagés ; sans Redis, chaque réplica compte séparément.
Outil ou serveur MCP de tenant compromis
- Désactiver l'outil ou le serveur MCP, révoquer ses jetons OAuth et faire tourner ses secrets dans OpenBao.
- Examiner
security.egress.deniedet l'audit des appels de l'outil. - Restreindre
egress_allowed_hosts, vérifier que les résultats ont été traités comme non fiables (encapsulation active).
Violation de CSP
- Lire le rapport de violation du navigateur : directive, source bloquée.
- Un script inline sans nonce ou un domaine inconnu indique une XSS ou une extension : ne pas élargir la CSP sans analyse.
- Une ressource légitime s'ajoute dans
buildCsp(portal/src/lib/security.ts), jamais avecunsafe-inline.
Dépendance vulnérable détectée par la CI
Les jobs pip-audit, npm-audit, trivy-fs, trivy-image (GitLab) ou security-deps-python, security-deps-node (Forgejo) échouent. Mettre à jour la dépendance, sinon documenter une exception datée. Détails : ci-security-gates.
Rotation de clés dans OpenBao
- Écrire la nouvelle version (
bao kv putsouskv/eai/prod/control-plane), en respectantcontrolPlane.secretFormats. - Laisser External Secrets synchroniser, puis redémarrer le Control Plane.
- Pour les clés de chiffrement des données :
POST /v1/encryption/keys/{key_id}/rotate. - Révoquer l'ancienne version une fois le service vérifié. Détails : data-services-hardening.
Échec de vérification de la chaîne d'audit
GET /v1/audit/verify(eai.domains.observability.audit_api.verify) signale une rupture.- Geler les accès en écriture privilégiés, conserver une copie de la base.
- Comparer avec le dernier export signé (
verify_export) pour dater l'altération. - Traiter comme un incident d'initié ou de compromission de la base.
Fichier bloqué par l'analyse (security.file.blocked)
- Lire l'analyse :
GET /v1/file-security/scans?status=blocked, puisGET /v1/file-security/scans/{scan_id}(verdict, raisons, moteur, source, auteur). malwareoususpicious: le SOC a reçu une détection ; vérifier l'incident ouvert et le poste ou la source d'origine.- Faux positif supposé : réanalyser l'échantillon retenu (
POST /v1/file-security/scans/{scan_id}/rescan) après la mise à jour des signatures ; le dépôt d'origine n'est jamais libéré, l'utilisateur dépose à nouveau le fichier. - Une famille de fichiers légitimes bloquée par une règle YARA-X : publier une version des règles où cette règle porte
action = "report", jamais désactiver un moteur. - Purger l'échantillon quand l'analyse est close :
DELETE /v1/file-security/scans/{scan_id}/sample. Détails : file-security-pipeline.md.
Moteurs d'analyse indisponibles (security.file.scan_unavailable)
GET /v1/file-security/status: moteur, point d'accès, âge des signatures.- Les dépôts sont refusés (verdict
scan_error, échec fermé) : c'est voulu. Rétablir la passerelle ClamAV ou le worker YARA-X, vérifier la clé Bearer et la CA (EAI_FILE_SCAN_CA_FILE). - Ne jamais repasser
EAI_FILE_SCAN_MODEàdeven production : la garde de démarrage le refuse.
Révélation suspecte dans le coffre-fort IT (it_vault.reveal)
- Rechercher les événements
it_vault.revealdansGET /v1/audit/events: qui, quand, quel service. - Une révélation non expliquée vaut fuite : faire tourner le secret du service à sa source (OpenBao, External Secrets), puis mettre à jour l'entrée (
PATCH /v1/platform-manager/vault/entries/{entry_id}). - Vérifier les membres
platform_admin(GET /v1/members) et les groupes deEAI_OIDC_PLATFORM_ADMIN_GROUPSdans l'annuaire. Détails : secrets-vault.md.
Accès d'urgence ouvert
- Lister les accès :
GET /v1/break-glass, puisGET /v1/break-glass/{grant_id}(demandeur, bénéficiaire, rôles, justification, approbateurs, échéance). - Vérifier que la justification correspond à un incident réel ; sinon révoquer :
POST /v1/break-glass/{grant_id}/revoke. Les délégations créées sous cet accès ne lui survivent jamais. - Revoir dans l'audit chaque action réalisée pendant l'accès (événements dont
delegation.break_glass_idvaut l'identifiant de l'accès). Détails : identity-context-delegation.md.
Refus répétés de séparation des tâches
- Rechercher
approval.decideavec la décisiondenyet la raisonseparation_of_duties: un demandeur qui tente d'approuver sa propre demande. - Un même principal qui insiste, ou une clé d'API d'agent qui tente d'approuver, indique un contournement : suspendre l'identité par un ordre SOC
SUSPEND_IDENTITY(soc-runbook.md). Détails : approvals.md.