Aller au contenu

RBAC LLM — Contrôle d'accès aux modèles IA par rôle

AKKO associe les rôles de la plateforme (akko-admin, akko-engineer, akko-analyst, akko-user, akko-viewer) aux access_groups LiteLLM et à des quotas, centralisant la matrice d'accès IA et l'exposant via le cockpit React sous Rôles LLM (route /x/llm-roles, fonctionnalité llm-governance).


Matrice par défaut

Rôle Chat (qwen2.5:3b) Embed (nomic) Code (qwen-coder) GPU (vLLM) Quota/jour Rate limit
akko-admin illimité illimité
akko-engineer 50 k tokens 120 req/min
akko-analyst 20 k tokens 60 req/min
akko-user 5 k tokens 30 req/min
akko-viewer aucun

Source de vérité : global.llmRbac dans helm/akko/values.yaml (paliers + modèles), rendu dans le ConfigMap akko-llm-rbac du namespace akko et monté par le backend du cockpit.


Architecture

Cockpit React (page Rôles LLM /x/llm-roles)
  │  fetch, credentials: include
Backend cockpit (routes_llm_governance.py)
  GET    /api/governance/llm-access/models    → modèles + backend + drapeau served
  GET    /api/governance/llm-access/policies   → matrice groupes × modèles
  POST   /api/governance/llm-access/policies    → créer une politique de groupe
  PUT    /api/governance/llm-access/policies/{group} → mettre à jour
  DELETE /api/governance/llm-access/policies/{group} → supprimer
  POST   /api/governance/llm-access/mint-key    → clé virtuelle scopée
Passerelle LiteLLM : applique les access_groups par modèle à l'appel

Le backend lit la matrice de base depuis le ConfigMap monté akko-llm-rbac (rendu depuis global.llmRbac). Chaque lecture/écriture est gardée par le ForwardAuth SSO de la plateforme et auditée.

Fichiers

Fichier Rôle
helm/akko/values.yaml (global.llmRbac) Source de vérité (paliers + modèles)
helm/akko/charts/akko-cockpit-backend/templates/deployment.yaml Monte le ConfigMap akko-llm-rbac sur /etc/akko/llm-rbac/rbac.json
branding/cockpit-react/src/features/llm-governance/ UI matrice (page + i18n + gateway)
branding/cockpit-react/src/features/llm-governance/data/httpGateway.ts Appelle /api/governance/llm-access/*

Utilisation depuis du code

Depuis un notebook (jupyter-alice)

import os
import requests
resp = requests.post(
    f"http://akko-akko-litellm:4000/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['LITELLM_USER_KEY']}"},
    json={"model": "akko-chat", "messages": [{"role": "user", "content": "hi"}]}
)

Si le rôle user ne matche pas les access_groups du modèle, LiteLLM renvoie 403 Forbidden.

Depuis Trino (via fonctions ai_*())

-- Le middleware ai_service passe le rôle Keycloak du user Trino à LiteLLM
SELECT akko_ai_sentiment(comment) FROM reviews LIMIT 10;

Depuis Claude Desktop (via MCP)

Le serveur MCP Trino propage le rôle user via header HTTP. LiteLLM l'applique de la même manière.


Modifier la matrice

Via le cockpit (admin)

  1. Se connecter en tant qu'alice_admin (akko-admin)
  2. Ouvrir Rôles LLM (route /x/llm-roles)
  3. La matrice complète s'affiche : modèles × groupes, avec quotas et rate limits
  4. Créer, mettre à jour ou supprimer une politique de groupe en ligne ; les changements sont écrits par le backend (POST/PUT/DELETE /api/governance/llm-access/policies) et appliqués à la passerelle LiteLLM

Via GitOps (valeurs de base)

Éditer global.llmRbac dans helm/akko/values.yaml (ou un overlay) : commit, push, déploiement. Cela fixe la matrice de base livrée avec la plateforme ; les éditions par groupe faites dans le cockpit se superposent et sont auditées.


Ajouter un nouveau modèle

  1. Éditer la liste de modèles LiteLLM (akko-litellm.config.model_list dans votre overlay de values)
  2. Ajouter le modèle à la section models de global.llmRbac avec ses access_groups par défaut
  3. Commit + push : déploiement
  4. LiteLLM récupère le nouveau modèle automatiquement ; la matrice affiche la nouvelle colonne

Auditer l'usage LLM

Chaque appel LLM est loggé dans logs layer par le middleware AI Service :

{service="ai-service"} |= "llm_call" | json | line_format
"{{.user}} {{.model}} {{.status}} tokens={{.tokens}}"

Dashboard Dashboards LLM Usage by Role (Sprint 15.7) affichera : - Tokens/heure par rôle - Top 10 users par volume - Taux d'erreur par modèle - Estimation coût (quand modèles commerciaux ajoutés)


Verrouillage d'urgence

Pour bloquer immédiatement tout accès LLM à un groupe, ouvrir Rôles LLM (/x/llm-roles) et vider la politique de modèles de ce groupe, ou faire un DELETE de sa politique via le backend. Le changement atteint la passerelle LiteLLM sans toucher Keycloak ni redéployer. Persistez-le ensuite dans global.llmRbac pour qu'il survive à un redéploiement.


Voir aussi