Aller au contenu principal

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)​

  1. Rechercher les événements security.egress.denied (émis par eai.integrations.outbound.deny_event) : tenant, principal, URL rédigée, raison.
  2. 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.
  3. Désactiver la ressource, révoquer la clé API du principal si besoin (voir plus bas).
  4. Restreindre le tenant avec egress_allowed_hosts (PUT /v1/security/settings).
  5. Ne jamais élargir EAI_EGRESS_PRIVATE_ALLOWLIST pour « débloquer » un tenant : cette liste ne sert qu'aux appels de la plateforme.

Campagne d'injection de prompt​

  1. Suivre security.prompt_injection.detected et security.prompt_injection.blocked (passerelle LLM et ingestion de connaissances) ainsi que security.output.link_stripped.
  2. Si le tenant est en detect, passer prompt_injection_mode à block.
  3. Pour une injection indirecte, retrouver le document ou la source (base de connaissances, résultat d'outil) et le retirer ou le réindexer.
  4. Garder untrusted_content_wrapping=true et output_links=strip_untrusted.
  5. Ajouter les charges observées aux corpus garak et promptfoo (deploy/ci/promptfoo.yaml).

Force brute et bourrage d'identifiants​

  1. Suivre security.auth.failed (par IP) et security.rate_limited.
  2. Au-delà de EAI_RATE_LIMIT_AUTH_FAILURES_PER_MINUTE échecs par minute, l'IP reçoit 429 (check_auth_lockout).
  3. Vérifier que EAI_TRUSTED_PROXIES est juste : sinon toutes les requêtes semblent venir de la passerelle.
  4. Bloquer les plages hostiles au WAF (waf-gateway), activer MFA chez l'IdP.

Clé API divulguée​

  1. 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}.
  2. Rechercher dans l'audit toutes les actions de la clé depuis la fuite.
  3. Lancer gitleaks sur le dépôt ou l'emplacement de la fuite, purger l'historique si besoin.
  4. 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​

  1. Mesurer les 429 par compartiment dans security.rate_limited.
  2. Ajuster EAI_RATE_LIMIT_PER_MINUTE ou EAI_RATE_LIMIT_GATEWAY_PER_MINUTE dans controlPlane.config de Helm.
  3. 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​

  1. Désactiver l'outil ou le serveur MCP, révoquer ses jetons OAuth et faire tourner ses secrets dans OpenBao.
  2. Examiner security.egress.denied et l'audit des appels de l'outil.
  3. Restreindre egress_allowed_hosts, vérifier que les résultats ont été traités comme non fiables (encapsulation active).

Violation de CSP​

  1. Lire le rapport de violation du navigateur : directive, source bloquée.
  2. Un script inline sans nonce ou un domaine inconnu indique une XSS ou une extension : ne pas élargir la CSP sans analyse.
  3. Une ressource légitime s'ajoute dans buildCsp (portal/src/lib/security.ts), jamais avec unsafe-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​

  1. Écrire la nouvelle version (bao kv put sous kv/eai/prod/control-plane), en respectant controlPlane.secretFormats.
  2. Laisser External Secrets synchroniser, puis redémarrer le Control Plane.
  3. Pour les clés de chiffrement des données : POST /v1/encryption/keys/{key_id}/rotate.
  4. 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​

  1. GET /v1/audit/verify (eai.domains.observability.audit_api.verify) signale une rupture.
  2. Geler les accès en écriture privilégiés, conserver une copie de la base.
  3. Comparer avec le dernier export signé (verify_export) pour dater l'altération.
  4. Traiter comme un incident d'initié ou de compromission de la base.

Fichier bloqué par l'analyse (security.file.blocked)​

  1. Lire l'analyse : GET /v1/file-security/scans?status=blocked, puis GET /v1/file-security/scans/{scan_id} (verdict, raisons, moteur, source, auteur).
  2. malware ou suspicious : le SOC a reçu une détection ; vérifier l'incident ouvert et le poste ou la source d'origine.
  3. 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.
  4. 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.
  5. 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)​

  1. GET /v1/file-security/status : moteur, point d'accès, âge des signatures.
  2. 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).
  3. Ne jamais repasser EAI_FILE_SCAN_MODE à dev en production : la garde de démarrage le refuse.

Révélation suspecte dans le coffre-fort IT (it_vault.reveal)​

  1. Rechercher les événements it_vault.reveal dans GET /v1/audit/events : qui, quand, quel service.
  2. 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}).
  3. Vérifier les membres platform_admin (GET /v1/members) et les groupes de EAI_OIDC_PLATFORM_ADMIN_GROUPS dans l'annuaire. Détails : secrets-vault.md.

Accès d'urgence ouvert​

  1. Lister les accès : GET /v1/break-glass, puis GET /v1/break-glass/{grant_id} (demandeur, bénéficiaire, rôles, justification, approbateurs, échéance).
  2. 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.
  3. Revoir dans l'audit chaque action réalisée pendant l'accès (événements dont delegation.break_glass_id vaut l'identifiant de l'accès). Détails : identity-context-delegation.md.

Refus répétés de séparation des tâches​

  1. Rechercher approval.decide avec la décision deny et la raison separation_of_duties : un demandeur qui tente d'approuver sa propre demande.
  2. 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.