Construire · Avancé

Assistants IA et droits d’accès aux documents : qui peut recevoir la réponse ?

Un assistant IA interne qui cherche dans les documents de l’entreprise n’est pas plus discret que sa couche de recherche. Ce guide montre comment faire tenir les droits d’accès aux documents dans un assistant IA : qui peut lire quoi se décide avant que le moindre texte n’atteigne le modèle, et cela se teste comme n’importe quel autre contrôle de sécurité.

8 min de lecture

Une rangée d’armoires de classement de bureau, dont un tiroir est fermé à clé.

Photo : Nilo Velez, domaine public (CC0)

Dans ce guide

Le problème de fond : un compte de service qui lit tout

Un assistant fondé sur la recherche documentaire travaille en deux temps. Un indexeur lit les documents de l’entreprise, les découpe en passages et les stocke dans un index de recherche. Quand quelqu’un pose une question, l’assistant cherche dans cet index, transmet les meilleurs passages à un modèle de langage et renvoie la réponse du modèle.

L’indexeur tourne en général sous un compte de service qui a accès en lecture à tout, parce que c’est le moyen le plus simple d’obtenir un index complet. Si rien d’autre n’est fait, l’assistant répond alors à chaque salarié avec les droits de ce compte de service. Une fenêtre de discussion contourne les droits des dossiers : la liste des salaires ou le contrat d’un client ne sont plus qu’à une question bien tournée.

C’est le cas classique de l’« adjoint désorienté » (confused deputy) : un composant aux droits étendus agit pour un utilisateur aux droits restreints et ne vérifie pas la différence. Un accès étendu en lecture pour l’indexeur est acceptable. Répondre avec cet accès ne l’est pas.

Appliquer les droits d’accès au moment de la recherche, avec l’identité du demandeur

La règle qui rend un assistant sûr est courte : un passage que l’utilisateur qui pose la question n’a pas le droit de lire ne doit jamais entrer dans le contexte du modèle.

  • Stockez les droits avec chaque passage. Chaque passage indexé porte l’identifiant de son document source, les utilisateurs et les groupes autorisés à le lire, les éventuels refus explicites, et un identifiant de locataire (tenant) quand plusieurs clients partagent le système.
  • Prenez l’identité dans la session authentifiée. Le service de recherche reçoit l’identité vérifiée de l’utilisateur à partir du jeton de connexion. Il n’accepte jamais un identifiant d’utilisateur venu d’un champ de formulaire, du prompt ou d’arguments produits par le modèle lui-même.
  • Filtrez à l’intérieur de la recherche. La condition de droits fait partie de la requête de recherche, de sorte que l’index ne renvoie que les passages que l’utilisateur peut lire. Filtrer après coup une liste des dix premiers résultats donne de moins bonnes réponses, car les passages autorisés classés onzièmes et au-delà ne sont jamais pris en compte.
  • Ne filtrez jamais après le modèle. Demander au modèle d’« omettre les contenus confidentiels », ou analyser sa réponse, ce n’est pas du contrôle d’accès. Une fois le texte dans le contexte, une paraphrase, un résumé ou un simple chiffre peut le faire sortir.

Les métadonnées fuient aussi. Un titre de document dans une liste de sources, un décompte (« J’ai trouvé 3 documents que je ne peux pas vous montrer ») ou un chemin de fichier révèle que quelque chose existe. Appliquez le même filtre aux citations, aux suggestions et à la saisie semi-automatique.

Garder les droits de l’index alignés sur la source

L’index contient une copie des droits, et les copies vieillissent. Trois détails décident si elles restent justes.

Premièrement, un changement de droits ne modifie pas le document. Un indexeur qui ne relit que les fichiers dont le contenu ou la date de modification a changé passera à côté. Les droits ont besoin de leur propre synchronisation : des événements de changement émis par le système source quand ils existent, et une comparaison complète régulière comme filet de sécurité.

Deuxièmement, stockez des groupes, pas des listes de membres développées. Si un passage est marqué « lisible par le groupe Finance » et que les appartenances de l’utilisateur aux groupes sont lues auprès du fournisseur d’identité au moment où la question est posée, retirer une personne de Finance prend effet immédiatement, sans réindexation. Si l’index stocke les noms de tous les membres de Finance, chaque mouvement de personnel oblige à réécrire des milliers d’entrées.

Troisièmement, les droits sont souvent hérités. Déplacer un document dans un autre dossier, ou modifier les droits d’un dossier, change les droits effectifs de tout ce qui se trouve en dessous. La synchronisation doit calculer les droits effectifs, pas seulement ceux qui sont posés sur le fichier lui-même. Les documents supprimés doivent quitter l’index, et l’équipe a besoin d’une règle pour le partage « toute personne disposant du lien » : le choix sûr par défaut est de considérer ces documents comme lisibles uniquement par les personnes nommées explicitement.

Pour les sources les plus sensibles, ajoutez une seconde vérification : avant que les meilleurs passages partent vers le modèle, demandez au système source si cet utilisateur peut lire ces documents maintenant. Cela coûte un peu de latence et supprime la dépendance à la copie.

Réponses en cache, historique des conversations et accès révoqués

Les voies de fuite d’un assistant de recherche documentaire et le garde-fou de chacune
Voie de fuite Comment la fuite se produit Garde-fou
Cache de réponses partagé La réponse de A est servie à B, qui pose la même question Pas de cache de réponses entre utilisateurs, ou une clé fondée sur l’ensemble des droits de l’utilisateur
Droits périmés dans l’index Accès retiré à la source, passage toujours renvoyé Synchronisation des droits par événements de changement, plus une comparaison complète régulière
Historique des conversations Un ancien texte à accès restreint est réutilisé comme contexte après la révocation Revérifier les sources des échanges précédents, ou faire expirer l’historique
Conversations partagées ou exportées Un lien vers une conversation donne le texte cité à des collègues Le partage applique les droits du destinataire, ou il est désactivé
Journaux et jeux d’évaluation Des prompts contenant les passages trouvés sont lisibles par une large équipe Restreindre l’accès, raccourcir la conservation, stocker les identifiants de documents plutôt que le texte
Entraînement sur les documents Le contenu devient une partie du modèle, sans aucun droit attaché Ne pas affiner le modèle sur des documents à accès restreint : passer par la recherche
Sources et décomptes Des titres ou des totaux révèlent qu’un document existe Filtrer les citations et les suggestions avec la même règle

Une réponse est tirée de documents, elle hérite donc de leurs restrictions. La règle simple : une réponse ne peut être réutilisée que pour un utilisateur dont les droits couvrent toutes les sources à partir desquelles elle a été construite.

L’historique des conversations est plus subtil. Un utilisateur qui a lu une réponse la semaine dernière l’a vue, tout comme il aurait pu télécharger le fichier. Ce qui ne doit pas arriver, c’est que d’anciens échanges continuent d’alimenter de nouvelles réponses en texte à accès restreint, ou qu’une fonction de mémoire l’emporte dans des sessions ultérieures. Stockez avec chaque réponse les identifiants des documents sources, pour pouvoir les revérifier.

En combien de temps une révocation doit-elle prendre effet ? Fixez un chiffre et écrivez-le. Les chiffres ci-dessous sont une comparaison de conceptions à titre d’illustration, pas des mesures : la durée la plus longue, en minutes, pendant laquelle un droit retiré pourrait encore produire une réponse, selon quatre approches.

Exemple illustratif : délai maximal avant qu’un droit révoqué prenne effet

Un passage nocturne, c’est jusqu’à 24 heures (24 x 60 = 1 440 minutes), ce qui est rarement acceptable pour une personne qui quitte l’entreprise. Un objectif raisonnable combine les deux dernières approches : appartenance aux groupes et état du compte vérifiés à chaque question, changements au niveau des documents appliqués en quelques minutes.

Tester les fuites entre salariés et entre clients

La gestion des droits dans un assistant IA est un contrôle de sécurité, et elle a besoin de tests qui tournent automatiquement, après chaque déploiement et à intervalles planifiés.

  1. Créez deux utilisateurs de test aux droits différents, par exemple l’un dans le groupe Finance et l’autre en dehors.
  2. Placez des documents canaris dans des emplacements à accès restreint. Chacun contient un fait inventé et une chaîne unique qui n’apparaît nulle part ailleurs, par exemple un code de projet imaginaire.
  3. Posez aux deux utilisateurs les mêmes questions sur les faits canaris, en formulation directe et indirecte. L’utilisateur autorisé doit obtenir la réponse avec sa source. L’autre ne doit rien obtenir : ni fait, ni titre, ni indice qu’un document existe.
  4. Cherchez les chaînes canaris dans les réponses, les citations et les suggestions du second utilisateur. Une seule occurrence fait échouer le build.
  5. Testez la révocation : accordez l’accès, posez la question, retirez l’accès, puis posez la question à plusieurs reprises et mesurez pendant combien de temps la réponse revient encore. Comparez le résultat avec votre objectif.
  6. Répétez la question dans la même conversation après la révocation, puis depuis un second compte juste après le premier, pour éprouver l’historique et les caches.
  7. Quand plusieurs clients partagent le système, lancez les mêmes tests entre locataires, avec un canari par client.

Entre clients, un filtre sur un identifiant de locataire est le minimum, et il doit être appliqué par le service de recherche lui-même, pas choisi par le code appelant. Un index séparé par client est la conception la plus solide, car un filtre oublié ne renvoie alors rien au lieu de tout renvoyer. Le même raisonnement vaut pour un portail client qui propose une recherche ou un assistant, et il a sa place dans la revue régulière de la sécurité et des sauvegardes.

Les questions qu’on nous pose souvent

Non. Le modèle ne sait pas de façon fiable qui pose la question, et on peut l’amener à révéler un texte qu’on lui a donné. L’accès doit être décidé par la couche de recherche avant que le modèle ne voie quoi que ce soit.

L’utilisateur a déjà vu ces réponses : l’objectif pratique est donc que le texte ne soit pas réutilisé. Stockez les identifiants des sources avec chaque réponse, revérifiez-les avant que d’anciens échanges servent de contexte, et fixez une durée de conservation pour l’historique.

Pas toujours, mais c’est le choix par défaut le plus sûr pour des données confidentielles. Avec un index partagé, l’isolation dépend d’un filtre correctement appliqué à chaque requête : elle exige donc les tests entre locataires décrits ci-dessus.

Vous préférez que ce soit réglé sans vous en charger ?

Dites-nous sur quoi vous travaillez. Une personne vous répond sous un jour ouvré.