Politiques
L'écran Politiques permet de gérer les règles de politique du tenant, d'évaluer une requête Policy Contract contre elles, de publier les politiques OPA en bundle signé et de vérifier la révision que chaque moteur de politiques exécute réellement. Chemin dans le portail : /security/policies, menu Sécurité et gouvernance > Politiques. Il sert aux responsables sécurité et aux administrateurs de tenant qui écrivent les règles, aux auditeurs qui les lisent et aux développeurs qui testent une requête.
Ce que montre l'écran
L'écran (Policies dans portal/src/screens/security.tsx) comporte quatre sections, de haut en bas.
- Tableau Politiques, lu dans
GET /v1/policies(sans pagination) : colonnes Nom, Version, Moteur, Priorité, Statut, Mis à jour. Un clic sur une ligne ouvre un panneau de détail chargé parGET /v1/policies/{policy_id}(le JSON de la politique). Tableau vide : « Aucune politique », « Les politiques intégrées s'appliquent tant que vous n'ajoutez pas les vôtres. » - Évaluer une requête Policy Contract : un formulaire avec un champ JSON Requête, prérempli avec un exemple (un agent qui invoque un modèle). Le résultat montre un grand badge Autorisé ou Refusé, l'identifiant de décision, la liste des raisons, un badge par obligation et la réponse JSON complète.
- Tableau Bundles OPA signés, lu dans
GET /v1/policies/bundles: colonnes Révision, SHA-256, Signé, Créé par, Créé. Un clic sur une ligne affiche la ligne. - Moteurs de politiques : la réponse JSON de
GET /v1/policies/engines, « Révision réellement exécutée par chaque bundle OPA et état du moteur de relations » (OPA : configuré, mode de livraison, révision attendue, joignable, synchronisé ; OpenFGA : configuré, joignable).
Le formulaire de création et de modification d'une politique comporte ces champs :
| Champ | Type | Défaut | Obligatoire | Description |
|---|---|---|---|---|
| Nom | texte | oui | Minuscules, chiffres, _, . et -, jusqu'à 100 caractères (deny-restricted-external). | |
| Description | texte | non | Texte libre. | |
| Moteur | builtin ou opa | oui | opa exige un texte Rego (OPA). | |
| Priorité | nombre | 100 | non | Les valeurs basses sont évaluées en premier. |
| Statut | active, draft, disabled | non | L'API enregistre active quand le champ est vide. | |
| Règles | JSON | une règle deny sur model.invoke pour les données restricted et secret | non | Liste de règles : effect, actions, resource_types, conditions, reason. |
| Rego (OPA) | texte | pour opa | Module tel que package eai.model_invocation. |
Actions
| Bouton ou action | Effet | Appel API | Rôles |
|---|---|---|---|
| Nouvelle politique (puis Créer) | Crée une politique depuis le formulaire ; une révision est enregistrée et le changement est audité (policy.create). | POST /v1/policies | tenant_admin, security_officer |
| Clic sur une ligne ou Voir le détail | Ouvre le panneau de détail de la politique. | GET /v1/policies/{policy_id} | Tout utilisateur du tenant |
| Modifier (menu de la ligne, puis Modifier) | Remplace la politique par les valeurs du formulaire, prérempli depuis la ligne ; une nouvelle révision est enregistrée (policy.update). | PUT /v1/policies/{policy_id} | tenant_admin, security_officer |
| Supprimer (menu de la ligne) | Ouvre la confirmation destructive (impact, dépendants, risques) ; vous saisissez le nom de la politique puis Confirmer. | GET /v1/lineage/graph, puis DELETE /v1/policies/{policy_id} | tenant_admin, security_officer |
| Exécuter (Évaluer une requête Policy Contract) | Évalue la requête et affiche la décision. | POST /v1/policies/evaluate | Tout utilisateur du tenant |
| Publier un bundle (puis Créer) | Construit et publie un bundle signé des politiques OPA, avec une Révision facultative et un JSON Données. | POST /v1/policies/bundles | tenant_admin, security_officer (bouton masqué pour les autres) |
| Clic sur une ligne (Bundles OPA signés) | Affiche la ligne du bundle. | Aucun | Lecteurs des bundles |
| Icône d'actualisation d'un tableau | Relit la liste. | GET /v1/policies ou GET /v1/policies/bundles | Lecteurs de la liste |
Le formulaire de modification ne porte pas la Version de la politique : l'API enregistre sa version par défaut 1.0.0 à chaque enregistrement depuis cet écran. Passez par l'API pour fixer une version explicite.
Exemple de requête pour Évaluer une requête Policy Contract (le sujet est facultatif : sans lui, la requête est évaluée pour vous) :
{
"action": "model.invoke",
"resource": {"type": "model", "id": "claude-sonnet-eu"},
"context": {"data_classification": "confidential", "region": "eu-central-1"}
}
Rôles
Le portail ne masque que le bouton Publier un bundle, affiché à ROLES.delegationAdmins (tenant_admin, security_officer dans portal/src/lib/kit.ts). Tous les autres contrôles sont affichés et le Control Plane décide (services/control-plane/src/eai/domains/policies/__init__.py) :
- liste, détail et évaluation : tout utilisateur du tenant ;
- création, modification, suppression, publication d'un bundle :
tenant_admin,security_officer; - liste des bundles et état des moteurs :
tenant_admin,security_officer,auditor; platform_adminpasse tous les contrôles de rôle.
Un tenant_admin ou un security_officer peut évaluer une requête pour le compte d'un autre sujet du tenant (simulation) : l'évaluation est alors auditée sous policy.simulate. Pour tout autre utilisateur, le sujet est toujours l'appelant.
Tâches courantes
Ajouter une règle de refus pour les données restreintes
- Ouvrir le formulaire. Une politique du tenant s'ajoute aux politiques intégrées. Cliquez Nouvelle politique. Résultat attendu : un panneau latéral avec les champs préremplis (règle
denysurmodel.invoke). En cas d'échec : sans tableau, la liste ne s'est pas chargée ; cliquez l'icône d'actualisation. - Remplir la politique. Saisissez un Nom tel que
deny-restricted-external, gardez Moteurbuiltin, réglez Priorité et adaptez Règles. Résultat attendu : le formulaire accepte le JSON. En cas d'échec : « JSON invalide » sous Règles signale un JSON illisible. - Créer. Cliquez Créer. Résultat attendu : le message Créé et une nouvelle ligne au statut
active. En cas d'échec :forbidden(HTTP 403) signale un rôle manquant ;conflict(HTTP 409) signale un nom déjà pris ;validation_error(HTTP 422) signale un nom hors des caractères permis, ouopasans Rego (OPA). - La tester. Dans Évaluer une requête Policy Contract, envoyez une requête avec
"data_classification": "restricted"et cliquez Exécuter. Résultat attendu : un badge Refusé avec la raison de votre règle. En cas d'échec : un badge Autorisé signifie que la règle ne correspond pas (vérifiezactions,resource_typesetconditions).
Publier les politiques OPA pour les moteurs
- Publier. OPA récupère une archive signée au lieu de recevoir chaque module. Cliquez Publier un bundle, laissez Révision vide ou saisissez-en une, puis Créer. Résultat attendu : une nouvelle ligne dans Bundles OPA signés, Signé coché, avec son SHA-256. En cas d'échec :
conflictsignale une révision existante ; le bouton manque si vous n'êtes nitenant_adminnisecurity_officer. - Vérifier les moteurs. OPA doit exécuter la révision publiée. Lisez Moteurs de politiques. Résultat attendu :
in_syncvauttrueetexpected_revisionest la nouvelle révision. En cas d'échec :reachable: falsemontre l'erreur d'OPA ; attendez sa prochaine lecture et rechargez la page.
Dépannage
| Symptôme | Cause | Correction |
|---|---|---|
forbidden (HTTP 403) à la création, la modification ou la suppression | Vos rôles ne sont ni tenant_admin ni security_officer. | Demandez l'un de ces rôles. |
validation_error (HTTP 422) à la création | Nom hors de ^[a-z0-9][a-z0-9_.-]{0,99}$, ou « rego is required for engine opa ». | Corrigez le nom ou remplissez Rego (OPA). |
validation_error avec contract: policy-contract sur Exécuter | La requête ne suit pas le schéma Policy Contract. | Repartez de l'exemple prérempli. |
conflict (HTTP 409) | Une politique de ce nom, ou un bundle de cette révision, existe déjà. | Choisissez un autre nom ou une autre révision. |
policy_engine_unavailable (HTTP 503) | Le Control Plane n'a pas pu pousser le module Rego vers OPA, ou l'y retirer lors d'une suppression (rien n'est alors supprimé). | Vérifiez qu'OPA tourne, ou utilisez la livraison par bundle. |
not_found dans le panneau de détail | La politique a été supprimée, ou son identifiant n'est pas un UUID. | Actualisez le tableau. |
Moteurs de politiques ou Bundles OPA signés affichent forbidden | Ces lectures exigent tenant_admin, security_officer ou auditor. | Demandez l'un de ces rôles. |
tenant_required (HTTP 403) | Le compte agit sans tenant. | Connectez-vous avec un compte du tenant. |