RBAC pour les agents IA : contrôle d'accès par rôles sans privilèges excessifs

RBAC pratique pour agents IA en production : rôles, tenant scope, default deny, approval pour actions write et audit trail.
Sur cette page
  1. Idée en 30 secondes
  2. Problème
  3. Solution
  4. RBAC != simple allowlist
  5. Niveaux de contrôle d'accès (RBAC layers)
  6. Comment cela se place dans l'architecture
  7. Flow : de la requête à la décision
  8. Décisions de policy
  9. Exemple
  10. Dans le code, cela ressemble à ceci
  11. Comment cela se passe pendant l'exécution
  12. Erreurs fréquentes
  13. Auto-vérification
  14. FAQ
  15. Où RBAC se place dans le système global
  16. Pages liées

Idée en 30 secondes

RBAC (Role-Based Access Control) pour un agent IA définit qui peut exécuter quelles actions via tools en runtime.

Quand c'est nécessaire : quand l'agent travaille avec plusieurs rôles, plusieurs tenants, ou a accès à des actions write dans des systèmes réels.

Problème

Sans RBAC, un agent démarre souvent avec un accès "large" : un rôle, beaucoup d'outils, peu de frontières. En demo, cela semble pratique. En production, cela devient vite une source d'incidents.

Une seule erreur dans le plan de l'agent peut déclencher une action en trop : mauvais tool, mauvais tenant, mauvais niveau d'accès. Après cela, il est difficile de répondre même à une question basique : qui a obtenu l'accès et pourquoi. Pour éviter que cette erreur devienne un incident, le contrôle d'accès doit vivre non pas dans le prompt, mais dans la couche de policy avant chaque appel d'outil.

Analogie : c'est comme un badge universel dans un immeuble de bureaux. Tant que tout est calme, la différence est invisible. Au moment d'une panne, ce badge ouvre trop de portes.

Solution

La solution est de déplacer le contrôle d'accès dans la couche de policy du runtime. Chaque appel d'outil est vérifié via user context (role, permissions et tenant scope) avant exécution. Commence par une règle de base : default deny et autorisations explicites seulement pour les rôles nécessaires.

RBAC != simple allowlist

Allowlist définit quels tools existent dans le système.
RBAC définit qui peut les appeler et quand.

L'un sans l'autre ne fonctionne pas :

  • sans RBAC, les frontières d'accès entre rôles deviennent floues
  • sans allowlist, le set de tools grandit sans contrôle

Exemple :

  • allowlist : l'outil refund.create existe et est disponible dans le système
  • RBAC : seul le rôle billing_manager peut appeler refund.create dans son propre tenant

Niveaux de contrôle d'accès (RBAC layers)

Ces vérifications fonctionnent ensemble à chaque étape de l'agent.

NiveauCe qu'il contrôleMécaniques clésPourquoi
Rôles (role mapping)Qui exécute l'actionrole assignment
service account policy
Évite "un rôle pour tous"
Droits d'accès (permissions)Ce qui est autorisé précisément pour le rôleaction-based permissions
default deny allowlist
Donne des limites claires pour tools et actions
Isolation tenant (scope)Dans quel espace de données agir (tenant est un espace isolé de données client)tenant_id check
resource scoping
Empêche l'accès au tenant d'un autre client
Contrôle des actions writeActions risquées ou irréversiblesseparate write permissions
human approval
Réduit le risque d'erreurs coûteuses

Comment cela se place dans l'architecture

La couche de policy (tool gateway) se place entre runtime et tools et vérifie chaque appel. Chaque décision (allow, deny, approval_required) est enregistrée dans l'audit log.

Flow : de la requête à la décision

Chaque appel d'outil passe par ce flow avant exécution : runtime n'exécute pas d'action directement et délègue la décision à la couche de policy.

Résumé du flow :

  • Runtime forme une tool request
  • la couche de policy RBAC vérifie rôle et tenant scope
  • allow -> appel d'outil exécuté
  • deny -> stop reason + enregistrement dans audit log
  • approval_required -> stop reason + enregistrement dans audit log

Décisions de policy

Chaque appel d'outil se termine par une des décisions suivantes :

  • allow — l'action est exécutée
  • deny — l'action est interdite
  • approval_required — une confirmation est requise

C'est un point centralisé par lequel passent toutes les décisions avant l'exécution d'une action. Ces décisions sont utilisées comme raisons d'arrêt et journalisées dans l'audit log.

Exemple

Un agent support (role = support_agent) reçoit une demande de remboursement. L'outil refund.create est autorisé uniquement pour le rôle billing_manager dans son propre tenant.

Résultat :

  • support_agent -> refund.create -> deny("permission_denied")
  • role mismatch ou tenant scope mismatch -> deny("permission_denied")
  • événement écrit dans l'audit log avec la raison du refus

RBAC arrête l'erreur au niveau exécution en vérifiant l'accès avant chaque action.

Dans le code, cela ressemble à ceci

PYTHON
decision = rbac.check(user_context, tool, tenant_id, args)
if not decision.allowed:
    audit.log(user_context, tool, tenant_id, decision.outcome, reason=decision.reason)
    return deny(decision.reason)

if decision.requires_approval and not approval.ok():
    audit.log(user_context, tool, tenant_id, "approval_required", reason="approval_required")
    return stop("approval_required")

result = tool.execute(args)
audit.log(user_context, tool, tenant_id, decision.outcome, reason=decision.reason, result=result)
return result

Comment cela se passe pendant l'exécution

TEXT
Scénario 1 : accès refusé (deny)

Requête : l'utilisateur demande un refund
Runtime : appel d'outil formé -> refund.create
Policy : vérification role + tenant scope + permissions
Decision : deny (permission_denied)
Audit : decision=deny, role=support_agent, action=refund.create, reason=permission_denied
Stop : action non exécutée

---

Scénario 2 : accès autorisé (allow)

Requête : même cas pour billing_manager dans son tenant
Runtime : appel d'outil formé -> refund.create
Policy : vérification role + tenant scope + permissions
Decision : allow
Tool : refund.create exécuté
Audit : decision=allow, role=billing_manager, action=refund.create, result=ok
Return : résultat renvoyé au client

Erreurs fréquentes

  • un rôle "service" unique pour tous les agents et utilisateurs
  • absence de allowlist default-deny
  • vérification seulement du rôle, sans tenant scope
  • absence de couche de policy centralisée
  • mêmes droits pour actions read et write
  • logique RBAC uniquement dans UI ou prompt
  • audit trail absent : role, action, tenant, policy decision reason

Résultat : le système semble contrôlé, mais les frontières d'accès se dégradent avec le temps.

Auto-vérification

Vérification rapide RBAC avant lancement en production :

Progression: 0/8

⚠ Les contrôles de governance de base manquent

Avant la production, il faut au minimum le contrôle d'accès, des limites, des audit logs et un arrêt d'urgence.

FAQ

Q: Comment gérer les tools qui appellent GitHub, Jira ou d'autres APIs externes ?
A: Ne donne pas à l'agent une clé partagée unique pour tout. Préfère user-scoped credentials, tokens OAuth, ou policy de service account séparée avec limites explicites.

Q: Quelle différence entre role et tenant scope ?
A: Role définit ce qu'on peut faire. Tenant scope définit où on peut le faire.

Q: Comment ajouter un nouveau tool dans RBAC en sécurité ?
A: Ajoute-le via un modèle explicite de permissions : default deny, droits read/write séparés, et vérification tenant scope.

Q: Que faut-il implémenter en premier : RBAC ou approval ?
A: Commence par RBAC avec default deny et tenant scope. Ensuite ajoute approval pour les actions write risquées.

Q: RBAC seul suffit-il pour la production ?
A: Non. Il faut aussi execution limits, budgets, audit logs et kill switch.

Où RBAC se place dans le système global

RBAC est une des couches d'Agent Governance.
Avec budgets, limites, approval et audit, il forme un système unifié de contrôle d'exécution.

Pages liées

Pour continuer :

⏱️ 7 min de lectureMis à jour 24 mars 2026Difficulté: ★★★
Implémenter dans OnceOnly
Budgets + permissions you can enforce at the boundary.
Utiliser dans OnceOnly
# onceonly guardrails (concept)
version: 1
budgets:
  max_steps: 25
  max_tool_calls: 12
  max_seconds: 60
  max_usd: 1.00
policy:
  tool_allowlist:
    - search.read
    - http.get
writes:
  require_approval: true
  idempotency: true
controls:
  kill_switch: { enabled: true }
Intégré : contrôle en productionOnceOnly
Ajoutez des garde-fous aux agents tool-calling
Livrez ce pattern avec de la gouvernance :
  • Budgets (steps / plafonds de coût)
  • Permissions outils (allowlist / blocklist)
  • Kill switch & arrêt incident
  • Idempotence & déduplication
  • Audit logs & traçabilité
Mention intégrée : OnceOnly est une couche de contrôle pour des systèmes d’agents en prod.

Auteur

Nick — ingénieur qui construit une infrastructure pour des agents IA en production.

Focus : patterns d’agents, modes de défaillance, contrôle du runtime et fiabilité des systèmes.

🔗 GitHub: https://github.com/mykolademyanov


Note éditoriale

Cette documentation est assistée par l’IA, avec une responsabilité éditoriale humaine pour l’exactitude, la clarté et la pertinence en production.

Le contenu s’appuie sur des défaillances réelles, des post-mortems et des incidents opérationnels dans des systèmes d’agents IA déployés.