Guide · Cybersécurité

Sécuriser une API pour un agent IA : autorisation, validation et limites

Protéger une API appelée par un agent IA : identité, autorisation objet, validation, quotas, erreurs, logs et tests défensifs.

Une API appelée par un agent IA doit être conçue comme une frontière de sécurité, pas comme une extension de son prompt. L’agent peut mal interpréter une demande, recevoir une instruction hostile dans un document ou proposer un paramètre inattendu. L’API doit donc authentifier l’appelant, autoriser chaque action et chaque objet, valider les entrées, limiter le débit et renvoyer des erreurs utiles sans divulguer ses détails internes.

Le principe est simple : le modèle ne décide jamais seul de ce qu’il a le droit de faire. L’API applique les règles métier et de sécurité avec une identité, des permissions et des paramètres vérifiables.

Ce que vous allez apprendre

Vous allez définir un contrat d’API pour un agent, séparer authentification et autorisation, valider les requêtes, limiter les actions coûteuses, gérer les erreurs, protéger les logs et écrire des tests négatifs. Ce guide ne donne pas une implémentation dépendante d’un framework ; adaptez les contrôles à votre langage et votre modèle de données.

Prérequis

  • Une liste des opérations que l’agent doit réellement appeler.
  • Un modèle de permissions ou de rôles déjà défini côté produit.
  • Un environnement de test avec données et identités factices.
  • Un schéma des ressources et de leurs propriétaires.
  • Une politique de clés, de rotation et de révocation.

Évitez une API générique capable d’exécuter n’importe quelle commande « pour que l’agent soit flexible ». Commencez avec des opérations étroites qui représentent un besoin métier clair.

1. Définir un contrat étroit

Décrivez chaque endpoint ou outil : action, paramètres autorisés, données renvoyées, identité requise, ressources concernées et effets externes. Une API de recherche peut accepter une requête limitée et renvoyer des résultats filtrés ; elle ne doit pas exposer un accès arbitraire à toute la base. Une API de mise à jour doit définir les champs modifiables et les conditions de transition plutôt que d’accepter un objet complet sans contrôle.

Séparez les opérations de lecture des opérations d’écriture. Pour les actions irréversibles, ajoutez une prévisualisation, une validation humaine ou une confirmation métier indépendante. Les paramètres issus du modèle ou d’un document restent non fiables jusqu’à validation par l’API.

Vérification : prenez une action de l’agent et demandez quel endpoint, quelle identité, quel objet et quelle transition elle autorise. Si la réponse est « l’agent peut tout faire », le contrat doit être réduit.

2. Authentifier avec une identité dédiée

Attribuez à l’agent ou au service une identité distincte des comptes humains et des clés d’administration. Limitez son scope, sa durée de vie et ses environnements. Une clé de test ne doit pas accéder à la production ; une clé de lecture ne doit pas modifier les données. Gardez un propriétaire et une procédure de révocation pour chaque identité.

Ne placez pas un token dans un prompt, un dépôt, une image ou un log. Injectez-le par le mécanisme de secrets approprié, et testez l’échec après retrait. Si l’agent appelle une API via un connecteur, vérifiez aussi quel compte ce connecteur utilise réellement et si son scope est plus large que la tâche annoncée.

Vérification : appelez l’API avec une identité absente ou révoquée. Elle doit renvoyer un refus générique, sans révéler si une ressource cible existe.

3. Autoriser l’action et l’objet

L’authentification répond à « qui appelle ? ». L’autorisation répond à « cette identité peut-elle faire cette action sur cet objet précis ? ». Vérifiez l’autorisation côté serveur à chaque requête ; n’utilisez pas seulement un identifiant fourni par le client ou une condition cachée dans l’interface. C’est particulièrement important lorsque l’agent choisit un identifiant à partir d’un texte ou d’un résultat de recherche.

Évitez les règles globales vagues. Exprimez les relations nécessaires : propriétaire, organisation, environnement, rôle, statut de la ressource et type d’opération. Pour les accès inter-services, limitez également les collections et champs retournés. Une réponse trop large peut devenir une fuite de données même si l’écriture est correctement bloquée.

Vérification : avec une identité de test autorisée sur une ressource A, demandez la ressource B. L’API doit refuser ou masquer B selon votre politique, tout en laissant A fonctionner.

4. Valider les entrées et les sorties

Utilisez un schéma côté serveur pour les types, tailles, formats, valeurs autorisées et relations entre champs. Rejetez les propriétés inconnues quand elles ne sont pas nécessaires. Ne construisez pas une requête de base, une URL, un chemin de fichier ou une commande à partir d’une valeur générée sans allowlist et validation adaptée.

Validez également la sortie : retournez seulement les champs dont le consommateur a besoin, limitez les pages et masquez les métadonnées internes. Une API qui accepte bien les entrées mais retourne un objet utilisateur complet à un agent de support reste dangereuse.

Vérification : essayez des paramètres hors format, trop longs, inattendus ou appartenant à une autre ressource. L’API doit renvoyer une erreur stable sans modifier l’état ni exposer une trace interne.

5. Limiter le débit et les actions coûteuses

Un agent peut boucler, réessayer ou recevoir une consigne qui génère beaucoup d’appels. Appliquez des limites par identité, route et opération, avec des délais et quotas adaptés. Les endpoints qui exportent des données, déclenchent un traitement long ou font appel à un fournisseur coûteux méritent des limites plus strictes et parfois une file de travail avec statut asynchrone.

La limitation ne doit pas seulement protéger l’infrastructure ; elle peut empêcher une erreur de raisonnement de devenir une opération massive. Prévoyez une réponse claire au dépassement, une métrique et une alerte lorsqu’un agent atteint régulièrement son quota. Ne réessayez pas sans fin une erreur d’autorisation ou de validation.

Vérification : exécutez un test de rafale contrôlé dans l’environnement de test. Confirmez que la limite bloque les appels supplémentaires sans dégrader une autre identité autorisée.

6. Gérer erreurs et logs sans fuite

Les erreurs destinées au client doivent indiquer l’action possible : requête invalide, authentification requise, droit insuffisant, quota atteint ou incident temporaire. Elles ne doivent pas révéler la requête SQL, le chemin interne, le nom d’une table, un token ou l’existence d’une ressource non autorisée. Les détails de diagnostic vont dans des logs redactionnés, associés à un identifiant de corrélation.

Journalisez l’identité, la route, le statut, la durée, la règle d’autorisation et l’identifiant interne de ressource, sans copier l’en-tête d’autorisation ni la charge utile complète. Limitez l’accès aux logs et prévoyez une rétention. Un log riche en données est une API secondaire involontaire.

Vérification : forcez une erreur de validation et une erreur d’autorisation avec des données factices. Vérifiez la réponse et les logs : aucun secret ni détail interne ne doit apparaître.

Tests minimaux à automatiser

  • une identité manquante ou révoquée est refusée ;
  • une identité de lecture ne peut pas écrire ;
  • une identité autorisée sur l’objet A ne peut pas lire l’objet B ;
  • une propriété inconnue ou hors limite est rejetée ;
  • le dépassement de quota produit le statut attendu ;
  • les erreurs et logs ne contiennent pas de valeur factice secrète.

Ces tests ne remplacent pas une revue métier, mais ils empêchent les régressions les plus fréquentes quand une route, un agent ou un schéma évolue.

Problèmes fréquents et solutions

L’agent utilise une clé d’administrateur. Créez une identité dédiée avec des scopes minimaux et planifiez le retrait de la clé globale.

Le front-end filtre les actions interdites. Ajoutez la même règle côté API ; un client ou un agent peut appeler directement l’endpoint.

Les erreurs montrent trop de détails. Utilisez des messages publics stables et placez les diagnostics redactionnés dans le canal d’exploitation.

Un endpoint accepte un objet libre. Remplacez-le par un schéma avec champs modifiables explicites et règles de transition.

FAQ

Une API interne a-t-elle besoin d’autorisation ?

Oui. « Interne » décrit un réseau ou une organisation, pas le droit d’une identité donnée à agir sur toutes les ressources.

Faut-il limiter toutes les routes ?

Appliquez des limites proportionnées au coût et à l’impact. Les opérations sensibles ou coûteuses doivent être identifiées et surveillées en priorité.

Un JWT suffit-il ?

Il peut porter une identité, mais l’API doit toujours vérifier sa validité, son audience, son expiration et l’autorisation de l’action et de l’objet.

Comment valider une sortie de modèle ?

Utilisez un schéma, des valeurs autorisées et une validation métier indépendante avant de transformer la sortie en appel API.

Que faire en cas de clé exposée ?

Révoquez-la, identifiez les usages, émettez une clé de remplacement à portée réduite et vérifiez que l’ancienne est refusée.

Conclusion

Sécuriser une API pour un agent IA revient à faire respecter les règles en dehors du modèle : identité dédiée, autorisation par objet, schémas stricts, limites d’usage et erreurs non bavardes. Les tests négatifs montrent que l’agent peut accomplir sa tâche sans obtenir des accès ou des données qu’il ne devrait jamais recevoir.

Sources et limites

Sources primaires : OWASP API Security Top 10, OWASP Authorization Cheat Sheet, OWASP Input Validation Cheat Sheet et NIST Digital Identity Guidelines. Les choix d’authentification et de quotas dépendent de l’architecture. Ce guide ne remplace pas une revue de code ou un test autorisé de votre API.