Changer le thème

Modèle d'autorisation pour agent IA : identité utilisateur, droits d'outils, journaux d'audit et isolation des secrets

Easton editorial illustration: production agent control room
3
Types d'identité
user identity, service account et delegated token.
4
Plans de contrôle
scope, approval, sandbox et server-side authorization.
6
Objets clés
actor, subject, tool, resource, secret et audit.
数据来源: Modèle d'ingénierie structuré de cet article

"MCP Security Best Practices décrit token passthrough comme un anti-pattern et recommande des scopes de moindre privilège, une autorisation côté serveur et des flux d'elevation auditables."

Une équipe donne le même token administrateur à un agent, avec l’idée que “de toute façon, c’est un système interne”. Résultat : l’utilisateur A envoie une requête, et l’agent lit l’enregistrement CRM de l’utilisateur B avec l’identité administrateur. Des autorisations mal conçues rendent un agent plus dangereux que l’absence d’agent.

Ce n’est pas un scénario inventé. MCP Security Best Practices classe explicitement token passthrough comme anti-pattern : cela contourne les contrôles de sécurité, casse l’audit trail et franchit les trust boundaries. L’OWASP AI Agent Security Cheat Sheet place aussi l’abus d’outils et l’escalade de privilèges parmi les risques centraux.

Le problème tient en trois questions : qui l’agent représente-t-il, sur quelle base appelle-t-il, et à quoi peut-il accéder ? Voici le plan d’ingénierie complet : table d’identité, liste des champs de permissions d’outils, étapes clés du Secret Vault, schema d’audit log avec règles de masquage, table de décision, checklist de dépannage et étapes de mise en place.

Mapping d’identité : qui l’agent représente-t-il ?

Quand un agent appelle un outil, les journaux et le système d’autorisation doivent d’abord répondre à une question : qui a déclenché l’appel, et au nom de qui l’opération est-elle exécutée ? Ces deux entités peuvent être identiques ou différentes. Les confondre provoque des dérives de droits et des audits impossibles à relire.

Tableau de référence des types d’identité

TypeactorsubjectCas d’usageLimite d’autorisation
user identityUtilisateur AUtilisateur AInteraction directe avec l’utilisateurHérite des droits utilisateur
service accountsystem_botnullTâches de fond, jobs planifiésDroits système, indépendants d’un utilisateur
delegated tokenworkflow_123Utilisateur AWorkflow automatisé autorisé par l’utilisateurScope du workflow, limité au périmètre accordé
tenant contextagent_456tenant_BSystème multi-tenantIsolation tenant, pas d’accès inter-tenant

Définition des champs : actor est l’entité qui déclenche l’appel, qu’il s’agisse d’un utilisateur, d’un agent, d’un workflow ou du système. Le journal enregistre son ID. subject est l’entité représentée, un utilisateur ou null. Dans une interaction utilisateur directe, actor=subject. Quand un compte système exécute une tâche de fond, subject=null. delegatedBy indique quel utilisateur a autorisé le workflow. tenantId identifie le tenant et sert à isoler les données en multi-tenant.

Selon la spécification MCP Authorization, les MCP servers doivent vérifier que l’access token a été émis pour eux comme intended audience. Le champ audience du token doit pointer vers l’identifiant de ressource du MCP server. Un token ne doit pas être placé dans l’URI query string, car les URI peuvent apparaître dans les logs, l’historique du navigateur et les caches proxy.

L’OWASP Access Control Cheat Sheet insiste sur deny by default, least privilege et la vérification à chaque requête. Le mapping d’identité est la première étape du contrôle : actor, subject et tenantId déterminent la décision d’autorisation qui suit.

Permissions d’outils : que peut appeler l’agent ?

Enregistrer un outil ne consiste pas seulement à définir name, description et input_schema. La référence des outils de l’OpenAI Agents SDK expose aussi des champs de permission et de contrôle d’exécution.

Table de décision des permissions d’outils

Contrôle de permissionCas d’usageMise en œuvreRisque
per-tool permissionChaque outil a sa propre autorisationDéfinir permission_level à l’enregistrement de l’outil, par exemple read/write/adminConfiguration plus complexe, matrice de permissions à maintenir
scope minimizationMoindre privilège progressifScope initial limité aux opérations peu risquées, extension par scope challenge pour les droits élevésGestion des scopes plus coûteuse, ajustement dynamique nécessaire
whitelistListe d’outils autorisésAutoriser uniquement certaines combinaisons, comme read_customer + summarizeCoût de maintenance, flexibilité parfois réduite
approvalApprobation humaineLes outils needs_approval=true se mettent en pause avant l’exécution et attendent l’approbationL’approbation ajoute de la latence et pèse sur l’expérience utilisateur

Les champs d’outils de l’OpenAI Agents SDK incluent is_enabled pour contrôler l’activation à l’exécution. On peut désactiver dynamiquement un outil selon le rôle utilisateur, le tenant ou le workflow context. needs_approval indique qu’une approbation humaine est requise. Après approbation, tool_input_guardrails s’exécute encore. tool_input_guardrails valide les entrées, par exemple la détection de PII ou les limites de paramètres. tool_output_guardrails valide les sorties, par exemple via un filtrage de contenu.

MCP Security Best Practices recommande un moindre privilège progressif pour la scope minimization : le scope initial ne doit contenir que des opérations de découverte ou de lecture à faible risque, comme read:metadata et list:resources. Les opérations à privilèges élevés doivent être ajoutées par un scope challenge précis. Les scopes wildcard/full-access sont à éviter.

L’OWASP AI Agent Security Cheat Sheet recommande per-tool permission scoping : utiliser des tool sets différents selon le trust level, exiger une autorisation explicite pour les opérations sensibles et fail closed quand le contrôle échoue.

Isolation des secrets : comment l’agent utilise-t-il les clés ?

Un agent ne devrait pas détenir directement des API keys longues en clair. L’OWASP Secrets Management Cheat Sheet recommande de centraliser et de standardiser la gestion des secrets. Le système de gestion des secrets lui-même doit aussi couvrir Authentication, Authorization, Accounting et lifecycle.

Tableau des modes d’accès aux secrets

ModeRisqueCas d’usageExemple
Possession directe, par exemple .env en clairRisque de fuite élevé, pas de traçabilité, pas de révocationDéconseilléAPI key codée en dur
Variables d’environnementRisque de fuite dans les logs, traçabilité et révocation faiblesDéploiement sur une seule machineprocess.env.API_KEY
secret vaultGestion centralisée, stockage chiffré, audit trail, révocationProductionAWS Secrets Manager, HashiCorp Vault
secret referenceL’agent détient une reference et obtient un token court à l’exécutionMulti-tenant, contexte à haute sécuritévault.get(secretRef)

Le cycle de vie d’un secret comporte quatre étapes : creation génère un token court plutôt qu’une clé longue ; rotation renouvelle régulièrement le secret, par exemple tous les 30 jours, avec un processus automatisé qui met à jour le secret et notifie les systèmes concernés ; revocation fournit une désactivation d’urgence en cas de fuite ; expiration fixe une date de fin, après laquelle le secret cesse de fonctionner automatiquement.

MCP Security Best Practices indique clairement que token passthrough est un anti-pattern : transmettre directement le token OAuth d’un utilisateur à l’agent contourne les contrôles de sécurité, casse l’audit trail et franchit les trust boundaries. La bonne approche consiste à émettre un delegated token au moment où l’utilisateur autorise l’agent : court, limité en scope et avec une audience explicite.

Les principes OWASP Secrets Management sont centralize, least privilege, automate et auditing. L’accès aux secrets suit le moindre privilège. La maintenance manuelle augmente le risque de fuite et d’erreur ; rotation, revocation et expiration font partie du lifecycle.

Audit log : qui a appelé quoi, et quand ?

Un audit log doit permettre de reconstituer “qui a appelé quel outil au nom de qui, quel objet a été consulté, et quel résultat a été obtenu”, tout en masquant paramètres et secrets.

Audit Log Schema

ChampDescriptionRègle de masquage
traceIdID de la chaîne d’appel, réutilise le concept trace/runId de N156Ne pas masquer
timestampHeure de l’appel, ISO 8601Ne pas masquer
actorEntité qui déclenche l’appelNe pas masquer
subjectEntité représentéeNe pas masquer
toolNom de l’outilNe pas masquer
actionType d’opération, read/write/deleteNe pas masquer
resourceObjet cibléMasquer : customer_id → cust_***
outcomeRésultat, success/failure/deniedNe pas masquer

Règles de masquage : ne pas enregistrer token, secret, password, email, phone ou PII. Enregistrer who/what/when/where/outcome. Exemple : customer_id=12345 devient cust_*** ; email=[email protected] devient e***@***.com ; token=Bearer xxx devient Bearer *** ; password=secret123 n’est pas enregistré.

Selon l’OWASP Logging Cheat Sheet, les journaux de sécurité doivent aider l’enquête, l’audit et la supervision, mais ne doivent pas contenir de mots de passe, session IDs, access tokens ou données personnelles sensibles. Ils doivent enregistrer des informations traçables comme who/what/when/where/outcome.

La famille audit and accountability de NIST SP 800-53 rappelle que l’audit log est la dernière ligne de défense du système de permissions. Quand une vérification échoue, la raison doit être écrite : actor sans droit, subject sans droit sur la cible, scope insuffisant.

Table de décision du modèle d’autorisation : choisir la bonne combinaison

Mapping d’identité, permissions d’outils, isolation des secrets et audit logs ne sont pas des contrôles séparés. Ils se contraignent ensemble. Voici les combinaisons de contrôles pour différents scénarios.

Scénarioidentity typetool permissionsecret accessaudit logApplication typique
Outil interne à faible risqueservice accountwhitelist, outils read uniquementVariables d’environnementactor/tool/outcomeGénération de rapports internes, synchronisation planifiée
SaaS multi-tenantdelegated token + tenantIdper-tool permission avec filtrage par tenantsecret vault avec isolation tenantfull schema avec tenantIdAgent CRM, assistant e-mail
Transaction financièreuser identity + approvalscope minimization + approvalsecret reference avec token courtfull schema + approvalIdApprobation de transaction, opération de fonds
Opération sur données sensiblesdelegated token + approvalwhitelist + approval + guardrailssecret vault avec révocation d’urgencefull schema + masquageExport de données, recherche client

L’OWASP AI Agent Security Cheat Sheet recommande des separate tool sets selon le trust level et une explicit authorization pour les opérations sensibles. Le point clé de cette table est la composition : les scénarios à haut risque exigent plusieurs couches de contrôle, pas un seul mécanisme présenté comme solution universelle.

Checklist de dépannage : symptômes fréquents des problèmes de permissions

Voici les symptômes, causes probables, vérifications et corrections fréquents.

SymptômeCause probableVérificationCorrection
L’agent reçoit 403 Forbidden lors de l’appel d’un outilactor n’a pas la tool permission, ou subject n’a pas la target permissionVérifier le permission_level de actor et les droits resource de subjectConfirmer le mapping d’identité, ajuster la matrice de permissions
Les logs montrent un actor vide ou un subject confusLes champs de mapping d’identité ne sont pas transmis correctementVérifier que l’agent context contient actor/subject/tenantIdTransmettre les champs d’identité dans toute la chaîne d’appel
L’appel d’outil réussit, mais l’audit log manque des champs nécessairesAudit Log Schema incompletVérifier que la logique de journalisation inclut tous les champsCompléter le schema, ajouter traceId/approvalId
La requête de l’utilisateur A lit les données de l’utilisateur BtenantId ou subject n’est pas isolé, ou un token administrateur est partagéVérifier l’usage des delegated tokens et la valeur de tenantIdPasser aux delegated tokens, imposer la validation tenantId
Après secret rotation, l’agent utilise encore l’ancienne keySecret reference non mise à jour, ou rotation inactiveVérifier que le vault renvoie le nouveau secret et que l’agent le récupère à nouveauFaire mettre à jour automatiquement la reference par la rotation
Après approbation, l’appel d’outil échoue encoreGuardrails en échec, par exemple paramètre hors limites ou détection PIIVérifier les logs tool_input_guardrailsAjuster les paramètres ou les règles de guardrails

Checklist de mise en œuvre : construire un modèle de permissions Agent de 0 à 1

Voici les 5 étapes clés pour mettre en place le modèle d’autorisation.

Étape 1 : définir les règles de mapping d’identité

Points de décision : faut-il une isolation multi-tenant, donc un champ tenantId ? Y a-t-il des tâches de fond, donc un service account ? Y a-t-il des workflows automatisés, donc des delegated tokens ?

Pseudo-code :

interface IdentityContext {
  actor: string;        // Entité qui déclenche l'appel
  subject: string | null;  // Entité représentée
  delegatedBy?: string;  // Source de la délégation
  tenantId?: string;    // Identifiant du tenant
}

Étape 2 : concevoir la matrice de permissions d’outils

Points de décision : faut-il une approbation, donc needs_approval=true ? Faut-il un filtrage dynamique, donc une logique is_enabled à l’exécution ? Faut-il valider les paramètres, donc tool_input_guardrails ?

Exemple de code :

interface ToolPermission {
  name: string;
  permission_level: 'read' | 'write' | 'admin';
  required_scope: string[];
  needs_approval: boolean;
  is_enabled: (context: IdentityContext) => boolean;
}

Étape 3 : connecter un secret vault

Points de décision : faut-il des credentials courts, donc une secret reference ? Faut-il une révocation d’urgence, donc un vault capable de désactiver immédiatement ?

Exemple de code :

async function getSecret(secretRef: string, context: IdentityContext): Promise<string> {
  // Vérifier l'identité
  await vault.authenticate(context.actor);
  // Vérifier l'autorisation
  await vault.authorize(context.actor, secretRef);
  // Obtenir un token court
  const token = await vault.getToken(secretRef, expiresIn: '15m');
  // Enregistrer l'audit
  await auditLog.record({
    actor: context.actor,
    action: 'get_secret',
    resource: secretRef,
    outcome: 'success'
  });
  return token;
}

Étape 4 : implémenter les audit logs

Points de décision : faut-il masquer les données, donc des règles de redaction ? Faut-il un traceId, donc réutiliser le trace/runId de N156 ?

Exemple de code :

interface AuditLogEntry {
  traceId: string;
  timestamp: Date;
  actor: string;
  subject: string | null;
  tool: string;
  action: 'read' | 'write' | 'delete';
  resource: string;  // Masqué
  outcome: 'success' | 'failure' | 'denied';
}

Étape 5 : tester les limites de permissions

Points de décision : testez-vous les accès non autorisés, par exemple l’utilisateur A qui accède aux données de l’utilisateur B ? Testez-vous la fuite de token, en simulant la révocation après fuite d’un secret ? Testez-vous la traçabilité, en remontant toute la chaîne par traceId ?

Checklist de test : test d’accès non autorisé (actor=user_A, resource=tenant_B → doit renvoyer 403) ; test de fuite de token (vault.revoke(secretRef) → l’agent ne doit plus pouvoir obtenir de nouveau token) ; test de traçabilité Audit (rechercher la chaîne complète par traceId → elle doit contenir actor/subject/tool/outcome).

Étape suivante : lectures complémentaires

Le modèle d’autorisation d’un Agent touche à l’identité, aux outils, aux Secrets et à l’audit. Voici des lectures utiles pour prolonger.

Articles publiés :

  • Guide Agent Sandbox : la sandbox traite l’isolation d’exécution avec conteneurs et Docker. Cet article traite les limites de permissions et de secrets ; les deux se complètent.
  • Tool Calling en pratique : les bases du tool calling. Cet article les prolonge avec tool whitelist, per-tool permission et validation d’entrée.
  • Monitoring et récupération des AI Agents : bases du monitoring et des alertes. Cet article ajoute les champs d’audit et traceId.

Concevoir un modèle d'autorisation pour agent IA

Concevoir l'identité utilisateur, les droits d'outils, l'accès aux secrets et les journaux d'audit d'un agent en production.

  1. 1

    Step 1: Lister les outils et ressources

    Listez les outils, ressources, actions et systèmes externes que l'agent peut toucher. Séparez les opérations de lecture des actions d'écriture, d'envoi, de suppression ou financières.
  2. 2

    Step 2: Définir le contexte d'identité

    Pour chaque run, définissez actor, subject, tenant, workflow et traceId afin de ne pas mélanger l'identité utilisateur, le service account et le workflow automatisé dans une même identité admin.
  3. 3

    Step 3: Séparer les types d'identité

    Séparez delegated user identity, service account et system maintenance job, puis définissez pour chacun les limites de ressources et les champs d'audit.
  4. 4

    Step 4: Construire la matrice de permissions d'outils

    Pour chaque outil, définissez action, resource, scope, approval, secret et audit metadata, puis exécutez une server-side authorization avant l'appel.
  5. 5

    Step 5: Brancher un secret vault

    Stockez les secrets dans un vault ou un service de credentials, échangez-les contre des credentials courts uniquement au niveau d'exécution, et gérez rotation, revocation et expiration.
  6. 6

    Step 6: Appliquer le fail closed

    Avant que le tool gateway n'exécute quoi que ce soit, vérifiez actor, subject, resource, action, scope et approval. Refusez explicitement l'appel dès qu'un contrôle échoue.
  7. 7

    Step 7: Écrire des audit logs masqués

    Enregistrez who, what, when, where, outcome, traceId, approvalId et un résumé masqué de la resource. Ajoutez des alertes pour les changements de droits, scope elevation et secret access.

FAQ

Quand un agent appelle un outil, représente-t-il l'utilisateur, un compte système ou le workflow lui-même ?
Regardez la paire actor/subject. En interaction directe, actor=subject. Pour une tâche de fond, actor=system_bot et subject=null. Pour un workflow délégué, actor=workflow_123 et subject=user_a. Les journaux comme le système d'autorisation doivent enregistrer actor et subject.
Pourquoi faut-il encore des per-tool permissions après une autorisation OAuth ?
OAuth scope relève du protocole. Per-tool permission relève de l'autorisation métier. Le scope ne suffit pas : le serveur doit encore vérifier actor, subject, resource et action.
Un seul token administrateur peut-il permettre à l'agent de consulter les données de tous les utilisateurs ?
Non. C'est un échec classique d'autorisation : l'agent lit les données de tous les utilisateurs avec une identité administrateur, et la requête de l'utilisateur A peut exposer les enregistrements CRM de l'utilisateur B. Utilisez plutôt un delegated token court, limité en scope et avec une audience explicite.
Un agent peut-il lire directement .env ou les API keys des utilisateurs ?
Non. Les secrets doivent vivre dans un vault, et l'agent doit passer par une secret reference au moment de l'exécution. Lire .env directement augmente le risque de fuite et rend la traçabilité et la révocation difficiles.
Après approbation, peut-on réutiliser longtemps le même token très privilégié ?
Ce n'est pas conseillé. Un token doit être short-lived et limité à l'appel d'outil approuvé. Réutiliser un token très privilégié augmente l'impact d'une fuite et complique le lien entre l'approbation et l'exécution.
Faut-il enregistrer les paramètres dans l'audit log, et comment éviter d'y mettre des tokens, e-mails ou données client ?
Enregistrez un résumé des paramètres et la ressource cible, mais masquez les valeurs sensibles. Ne journalisez pas les passwords, session ids, access tokens, secrets complets ou données personnelles sensibles. Par exemple : customer_id devient cust_***, email devient e***@***.com, token devient Bearer ***.

11 min de lecture · Publié le: 17 sept. 2026

Commentaires

Connectez-vous avec GitHub pour laisser un commentaire

Easton BlogEaston Blog