ACLs et principe du moindre privilège
Mis à jour le 28 juillet 2026
Le principe du moindre privilège appliqué aux API
Le principe du moindre privilège est l’un des plus anciens de la sécurité informatique : chaque composant d’un système ne doit avoir accès qu’aux ressources strictement nécessaires à son fonctionnement. L’idée est intuitive quand on la ramène au monde physique — on ne donne pas le passe général de l’immeuble à la personne qui vient arroser les plantes du hall. Appliqué aux clés API xAI, cela signifie que chaque clé doit être limitée aux seuls endpoints et modèles dont l’application qui la porte a réellement besoin. Si cette clé fuit un jour, l’attaquant hérite de ses permissions : une clé restreinte au chat avec un seul modèle cause infiniment moins de dégâts qu’une clé qui ouvre tout le catalogue.
xAI implémente ce principe via un système d’ACLs (Access Control Lists) granulaire, que nous allons détailler.
Le système d’ACLs de xAI
Les ACLs suivent le format api-key:{type}:{valeur}. Deux types vous concernent au quotidien : api-key:endpoint:{endpoint} restreint les endpoints accessibles, et api-key:model:{model_id} restreint les modèles utilisables. Il existe aussi un wildcard, api-key:endpoint:*, qui donne accès à tous les endpoints — commode en développement, à proscrire en production, précisément parce qu’il annule le bénéfice du moindre privilège.
Les endpoints que vous pouvez autoriser individuellement sont : chat (complétion de chat, de loin le plus courant), embed (génération d’embeddings), image (génération et édition d’images), models (consultation de la liste des modèles), tokenize (tokenisation de texte), documents (gestion de documents) et sample (échantillonnage).
Voyons ce que cela donne sur un cas réel. Imaginez un chatbot de support client qui n’utilise que le modèle grok-4.3 en mode chat. Sa clé idéale ressemble à ceci :
{
"name": "support-chatbot-prod",
"acls": [
"api-key:endpoint:chat",
"api-key:model:grok-4.3"
],
"qps": 5,
"qpm": 100,
"tpm": 500000,
"expireTime": "2026-12-31T23:59:59Z"
}
Lisez cette configuration comme un contrat : la clé ne peut accéder qu’à l’endpoint chat — pas d’images, pas d’embeddings, donc pas de détournement possible vers ces usages. Elle ne peut utiliser que grok-4.3, ce qui interdit l’appel accidentel (ou malveillant) de modèles plus coûteux. Elle est plafonnée à 5 requêtes par seconde et 100 par minute, et elle expirera à une date connue. Si un développeur du projet essaie un jour d’ajouter de la génération d’images sans en parler à personne, l’API refusera : la contrainte technique fait respecter la décision d’architecture.
Les limites de débit : une couche de sécurité supplémentaire
Les ACLs répondent à la question « quoi », les limites de débit répondent à « combien ». Le QPS (Queries Per Second) plafonne les requêtes par seconde : c’est votre garde-fou contre les pics accidentels — la boucle infinie introduite par un refactoring un vendredi soir, ou une attaque DDoS qui rebondirait sur votre application. Le QPM (Queries Per Minute) lisse le trafic sur une période plus longue et attrape les abus qui resteraient sous le radar du QPS. Le TPM (Tokens Per Minute), enfin, borne le volume de tokens consommés : il protège contre les requêtes individuelles très longues — un utilisateur qui collerait un document de 200 pages dans votre chatbot — qui épuiseraient votre budget en quelques minutes sans jamais dépasser le nombre de requêtes autorisé.
Une stratégie de clés par environnement
En pratique, on ne configure pas une clé mais une famille de clés, et chaque environnement a sa logique propre. En développement, on inverse le raisonnement de production : accès large, débit serré.
{
"name": "dev-team-alpha",
"acls": ["api-key:endpoint:*", "api-key:model:*"],
"qps": 2,
"qpm": 30,
"tpm": 100000,
"expireTime": "2026-06-30T23:59:59Z"
}
Les développeurs peuvent tout explorer, mais les limites basses évitent les surprises de facturation si un test tourne mal. En staging, au contraire, on reprend exactement les ACLs de la production (api-key:endpoint:chat, api-key:model:grok-4.3, QPS 5, QPM 100, TPM 500000) : c’est la seule façon de détecter en amont un problème de permissions — si le code de staging tente un appel que la production refusera, autant le découvrir maintenant plutôt qu’à la première heure de mise en ligne. La clé de production, elle, combine les permissions strictes du staging avec un débit dimensionné sur le trafic réel (par exemple QPS 20, QPM 600, TPM 2000000) et une expiration planifiée — "expireTime": "2027-03-31T23:59:59Z" sur une clé nommée prod-chatbot-v2.
Vérifier et auditer les permissions
Pour savoir ce qu’une clé en circulation a réellement le droit de faire, interrogez l’API avec la clé elle-même :
curl https://api.x.ai/v1/api-key \
-H "Authorization: Bearer $XAI_API_KEY"
La réponse liste les ACLs effectives, les statuts api_key_blocked et api_key_disabled, une version masquée de la clé (redacted_api_key) et le team_id. Prenez l’habitude de comparer régulièrement ces ACLs aux besoins réels de l’application : les permissions ont tendance à s’accumuler avec le temps, jamais à se réduire spontanément. Côté modèles, l’endpoint GET /auth/teams/{teamId}/models retourne la liste des modèles disponibles pour votre équipe avec leurs tarifs — une information précieuse pour définir des ACLs modèle pertinentes et écarter les modèles coûteux dont vous n’avez pas l’usage.
Pour ancrer tout cela, réalisez un audit complet de vos clés. Listez les clés actives de chaque équipe, puis interrogez chacune : ses ACLs sont-elles minimales, sans wildcard en production ? Ses limites de débit sont-elles raisonnables ? Sa date d’expiration est-elle définie ? Son nom permet-il d’identifier l’application et l’environnement — « prod-chatbot-v2 » raconte une histoire, « key-test-2 » n’en raconte aucune ? Supprimez les clés orphelines et documentez le résultat : ce document servira de point de départ au prochain audit, et vous verrez alors du premier coup d’œil ce qui a dérivé entre-temps.
Points clés à retenir
- Chaque clé doit avoir des ACLs restrictives : uniquement les endpoints et modèles nécessaires
- N’utilisez jamais de wildcard
*en production - Combinez les ACLs avec des limites de débit (QPS, QPM, TPM) adaptées à l’usage réel
- Créez des clés distinctes par environnement (dev, staging, prod) et par application — staging avec les mêmes ACLs que la prod
- Auditez régulièrement les permissions de vos clés actives via
GET /v1/api-key