RBACX après six mois : ReBAC, politiques IA et autorisation par lots
Au cours des six derniers mois, la bibliothèque RBACX est passée d'un moteur RBAC/ABAC basique à un système complet intégrant ReBAC et des politiques générées par IA. Des vulnérabilités critiques ont été corrigées : contournement des règles de refus dans le compilateur, DoS via récursion de conditions et SSRF dans la source HTTP. Le système applique désormais MAX_CONDITION_DEPTH=50, verify_ssl et bloque les IP privées.
La vérification des permissions par lots est implémentée via les méthodes evaluate_batch_async et evaluate_batch_sync de la classe Guard. Cela résout le problème des requêtes multiples dans les applications UI, où l'évaluation parallèle avec asyncio.gather réduit la latence.
decisions = await guard.evaluate_batch_async([
(subject, Action("read"), doc, ctx),
(subject, Action("write"), doc, ctx),
(subject, Action("delete"), doc, ctx),
])
ReBAC : graphes relationnels au lieu d'attributs
L'autorisation basée sur les relations (ReBAC) introduit un modèle "qui a accordé quoi à qui", similaire à Google Drive ou GitHub. Les permissions sont définies par un graphe d'entités : un propriétaire de document délègue l'accès. Les intégrations avec OpenFGA et SpiceDB prennent en charge les appels synchrones/asynchrones, y compris le gRPC par lots pour les listes d'objets. Un graphe local convient aux tests.
L'implémentation a nécessité de repenser l'évaluation des politiques basée sur la spécificité des ressources, avec des tests pour l'équivalence entre compilation et interprétation.
Génération de politiques avec LLM
Le package supplémentaire rbacx[ai] ajoute AIPolicy pour automatiser la création de politiques à partir de schémas OpenAPI. Le pipeline : génération LLM → validation JSON Schema → nouvelles tentatives → linter → compilation.
from rbacx.ai import AIPolicy
ai = AIPolicy(api_key="sk-...", model="gpt-4o")
result = await ai.from_schema(openapi_schema)
guard = Guard(result.policy)
Des méthodes comme refine_policy pour l'affinement en langage naturel et explain_decision maintiennent le déterminisme du moteur. La prise en charge inclut OpenAI, Ollama, Azure et les fournisseurs compatibles avec des limites de nouvelles tentatives.
Le raccourci roles: ["admin", "editor"] simplifie RBAC sans perdre en flexibilité. Combinaison avec condition via AND, avec le linter avertissant des chevauchements.
Améliorations de performances supplémentaires
- Mise en cache avec un adaptateur Redis (
rbacx[cache-redis]) pour les déploiements multi-hôtes. - Adaptateur asynchrone pour Django ASGI 4.1+.
- Mode types stricts :
Guard(policy, strict_types=True)désactive les conversions de types implicites. - Traçage des décisions avec
explain=Truepour le débogage des correspondances de règles.
Ces changements assurent l'évolutivité en production : des interfaces PyQt aux microservices.
Points clés à retenir
- Sécurité d'abord : Correction du contournement des refus, récursion DoS et SSRF ; comportement en échec fermé.
- Intégrations ReBAC : OpenFGA/SpiceDB avec gRPC par lots, graphe local pour le développement.
- Automatisation IA : Politiques depuis OpenAPI sans DSL manuel, avec validation et nouvelles tentatives.
- Permissions par lots : Évaluation parallèle pour les UI et listes d'objets.
- Performances : Cache Redis, Django asynchrone, typage strict.
— Editorial Team
Aucun commentaire pour le moment.