Incidents
L'écran Incidents permet de déclarer un incident de sécurité ou de sûreté, de suivre sa chronologie, de changer son statut et son responsable, d'ajouter des notes, et de lancer une action de réponse (suspendre un agent, désactiver un modèle ou un fournisseur, faire tourner une clé) depuis l'incident. Chemin dans le portail : /security/incidents, menu Sécurité et gouvernance > Incidents. Il sert aux responsables sécurité et aux administrateurs de tenant qui pilotent la réponse, et aux développeurs ou agents qui déclarent un incident.
Ce que montre l'écran
L'écran (Incidents dans portal/src/screens/security.tsx) montre un tableau, Incidents, lu dans GET /v1/incidents, du plus récent au plus ancien, 50 lignes par requête avec un curseur.
| Colonne | Contenu |
|---|---|
| Titre | Titre de l'incident. |
| Gravité | sev1 (la plus haute) à sev4. |
| Statut | open, investigating, contained, resolved, closed. |
| Catégorie | Catégorie libre, other par défaut. |
| Responsable | Personne en charge. |
| Créé | Date de la déclaration. |
Filtres au-dessus du tableau : Statut et Gravité (listes, tous par défaut), puis Filtrer. Un clic sur une ligne ouvre un panneau latéral chargé par GET /v1/incidents/{incident_id} : la chronologie (création, changements de statut et de gravité, notes, transmission au SIEM, actions) suivie du JSON de l'incident avec ses actions. Tableau vide : « Aucun incident », « Déclarez un incident pour coordonner la réponse. »
Actions
| Bouton ou action | Effet | Appel API | Rôles |
|---|---|---|---|
| Déclarer un incident (puis Créer) | Crée l'incident avec Titre (3 à 300 caractères), Gravité (sev3 en premier dans la liste), Catégorie, Ressources, Responsable, Description ; ouvre la chronologie et transmet incident.created au SIEM. | POST /v1/incidents | tenant_admin, security_officer, developer, agent |
| Filtrer | Applique les filtres Statut et Gravité. | GET /v1/incidents (paramètres status, severity) | Tout utilisateur du tenant |
| Clic sur une ligne ou Voir le détail | Ouvre la chronologie et le JSON de l'incident. | GET /v1/incidents/{incident_id} | Tout utilisateur du tenant |
| Répondre (menu de la ligne, puis Répondre) | Lance une action de réponse : Action (suspend_agent, resume_agent, suspend_model, disable_provider, rotate_key), Identifiant de la cible, Raison. Le résultat s'affiche dans un panneau latéral. Une action exécutée fait passer un incident open ou investigating à contained. | POST /v1/incidents/{incident_id}/actions | tenant_admin, security_officer |
| Changer le statut (menu de la ligne, puis Changer le statut) | Change Statut, Responsable et ajoute une Note à la chronologie ; chaque changement est transmis au SIEM sous incident.updated. | PATCH /v1/incidents/{incident_id} | tenant_admin, security_officer |
| Icône d'actualisation | Relit la liste. | GET /v1/incidents | Tout utilisateur du tenant |
Ce que fait chaque action de réponse côté serveur (execute_action dans services/control-plane/src/eai/domains/incidents/__init__.py) :
| Action | Effet | Identifiant de la cible |
|---|---|---|
suspend_agent, resume_agent | Kill switch du registre des agents. | Nom ou identifiant de l'agent. |
suspend_model | Désactive le modèle pour le tenant. | Identifiant du modèle. |
disable_provider | Désactive le fournisseur LLM. | Nom ou identifiant du fournisseur. |
rotate_key | Fait tourner une clé de chiffrement du tenant (nouvelle version). | Nom ou identifiant de la clé de chiffrement. |
Un modèle ou un fournisseur partagé par la plateforme exige un administrateur de la plateforme : sans platform_admin, l'action est enregistrée au statut pending avec la raison requires_platform_admin.
Rôles
Le portail ne masque aucun bouton sur cet écran. Le Control Plane contrôle les rôles : déclarer exige tenant_admin, security_officer, developer ou agent ; Répondre et Changer le statut exigent tenant_admin ou security_officer (RESPONDERS) ; la lecture exige seulement un tenant. platform_admin passe tous les contrôles de rôle. Chaque écriture est auditée (incident.create, incident.update, incident.action.<action>).
Tâches courantes
Déclarer un incident et confiner un agent
- Le déclarer. Un incident déclaré donne à la réponse une chronologie et un responsable. Cliquez Déclarer un incident, remplissez Titre, Gravité (par exemple
sev2), Responsable et Description, laissez Ressources vide, puis Créer. Résultat attendu : le message Créé et une nouvelle ligne au statutopen. En cas d'échec :validation_error(HTTP 422) sur Ressources (voir Dépannage) ;forbiddensignale un rôle manquant. - Suspendre l'agent. La suspension arrête l'agent sans le supprimer. Menu de la ligne > Répondre, Action
suspend_agent, Identifiant de la cible le nom de l'agent, Raison, puis Répondre. Résultat attendu : un panneau latéral avec l'action et le statutexecuted. En cas d'échec :unknown_action(HTTP 400) pour une action hors liste ; le statutfailedavec un code d'erreur dans le résultat signifie que l'agent est introuvable ou a refusé le changement. - Vérifier le statut et ajouter une note. Une action exécutée a déjà fait passer l'incident à
contained; une note indique aux autres intervenants ce qui a été fait. Menu de la ligne > Changer le statut, gardez Statutcontained, remplissez Note, puis Changer le statut. Résultat attendu : le message Terminé, le statutcontainedet la note dans la chronologie. En cas d'échec :invalid_request(HTTP 400) pour un statut hors des cinq valeurs.
Clôturer un incident
- Lire la chronologie. Chaque changement et chaque action y figurent avec leur auteur. Cliquez la ligne. Résultat attendu : la chronologie dans le panneau latéral. En cas d'échec :
not_foundsignifie que l'incident a été retiré ou que l'identifiant est faux. - Reprendre ce qui a été suspendu. Un agent suspendu le reste jusqu'à sa reprise. Menu de la ligne > Répondre, Action
resume_agent. Résultat attendu : le statutexecuteddans le résultat. En cas d'échec : lisez le code d'erreur dans le panneau de résultat. - Résoudre, puis fermer. Menu de la ligne > Changer le statut, Statut
resolved(la date de résolution est enregistrée), plus tardclosed. Résultat attendu : le statut de la ligne change. En cas d'échec :forbiddensignifie que vos rôles ne sont nitenant_adminnisecurity_officer.
Dépannage
| Symptôme | Cause | Correction |
|---|---|---|
validation_error (HTTP 422) sur Déclarer un incident avec resources | Le formulaire envoie Ressources comme une liste de textes ; l'API attend une liste d'objets. | Laissez Ressources vide, ou déclarez l'incident par l'API avec des objets ressource. |
invalid_request (HTTP 400) avec severity | Une gravité hors de sev1 à sev4 (ou critical, high, medium, low). | Choisissez une valeur de la liste. |
invalid_request avec status et allowed | Un statut hors de open, investigating, contained, resolved, closed. | Choisissez une valeur de la liste. |
unknown_action (HTTP 400) | L'action ne fait pas partie des actions permises. | Choisissez une action de la liste. |
invalid_request avec target | Identifiant de la cible est vide. | Saisissez le nom ou l'identifiant de la cible. |
Résultat pending avec requires_platform_admin | Le modèle ou le fournisseur appartient à la plateforme. | Demandez à un administrateur de la plateforme de lancer l'action. |
forbidden (HTTP 403) avec required_roles | Vos rôles ne permettent pas cette écriture. | Demandez l'un des rôles listés. |
not_found avec incident | Identifiant d'incident inconnu. | Actualisez le tableau. |