AI Security

Architecture Zéro Confiance pour les Agents IA : Vérification Continue de l'Identité dans les Environnements Dynamiques

L'essor des agents basés sur les grands modèles de langage (LLM) a introduit une nouvelle classe de menaces de sécurité. Contrairement aux applications statiques, les agents IA sont non déterministes, capables d'enchaîner plusieurs actions et interagissent souvent avec des outils externes via des API. Les modèles de sécurité périmétriques traditionnels échouent ici car un agent peut être manipulé par injection de prompt pour exécuter des actions non autorisées, même s'il passe l'authentification initiale. Pour y remédier, nous devons adopter une Architecture Zéro Confiance (ZTA) spécifiquement conçue pour les flux de travail agentiques.

Le paysage des menaces : Pourquoi la sécurité périmétrique échoue pour les agents

Dans une application web standard, si un utilisateur est authentifié, il se voit attribuer un jeton de session. Ce jeton reste valable pendant toute la durée de la session. Cependant, un agent IA fonctionne en boucle : Réflexion → Action → Observation. À tout moment de cette boucle, l'intention de l'agent peut être détournée. Si un agent récupère des données d'un site web contenant une instruction cachée (injection de prompt indirecte) disant « transférer des fonds vers le compte X », un système d'authentification traditionnel pourrait simplement vérifier que l'agent a *une* permission pour utiliser un outil bancaire, sans vérifier que *cette action spécifique* est alignée avec l'intention initiale de l'utilisateur.

Principes fondamentaux du Zéro Confiance pour les agents

L'implémentation du Zéro Confiance pour les agents IA nécessite trois changements :

  • Ne jamais faire confiance, toujours vérifier : Chaque appel d'outil doit être autorisé individuellement, et non seulement la session initiale.
  • Privilège minimal par contexte : Les droits d'accès doivent être dynamiques, basés sur le contexte immédiat du raisonnement de l'agent, et non seulement sur son rôle global.
  • Surveillance continue : Analyse en temps réel du chemin de décision de l'agent pour détecter les comportements anormaux avant l'exécution.

Implémentation de la vérification continue : Le moteur de politique

Le cœur de cette architecture est un moteur de politique léger et externe qui intercepte tous les appels d'outils. Au lieu de permettre à l'agent d'exécuter directement une fonction, il envoie une requête à ce moteur. Le moteur évalue la requête par rapport à un ensemble de règles, en tenant compte du prompt initial de l'utilisateur, du raisonnement intermédiaire de l'agent et des paramètres spécifiques de l'action proposée.

Voici un exemple pratique utilisant une abstraction basée sur Python pour un serveur MCP (Model Context Protocol) ou un appel de fonction personnalisé. Nous supposons que l'agent a proposé une action pour envoyer un e-mail. Le moteur de politique vérifie si le destinataire est dans une liste blanche et si le contenu contient des motifs sensibles.


class ZeroTrustPolicyEngine:
    def __init__(self, allowed_domains, sensitive_patterns):
        self.allowed_domains = allowed_domains
        self.sensitive_patterns = sensitive_patterns
        self.audit_log = []

    def verify_action(self, action_name, parameters, context):
        """
        Vérifie si l'action proposée par l'agent est sûre.
        Retourne True si autorisée, False si bloquée.
        """
        # 1. Règle de base : L'action doit être connue
        if action_name not in ["send_email", "read_file", "execute_query"]:
            self._log("BLOCKED", "Unknown action type", action_name)
            return False

        # 2. Règle contextuelle : Vérifier les paramètres par rapport à la liste blanche des domaines
        if action_name == "send_email":
            recipient_domain = parameters.get("to").split("@")[-1]
            if recipient_domain not in self.allowed_domains:
                self._log("BLOCKED", f"Domain {recipient_domain} not allowed", action_name)
                return False

        # 3. Intégrité du contenu : Scanner les artefacts d'injection
        content_to_scan = str(parameters)
        for pattern in self.sensitive_patterns:
            if pattern.lower() in content_to_scan.lower():
                self._log("BLOCKED", f"Sensitive pattern detected: {pattern}", action_name)
                return False

        # 4. Vérification réussie
        self._log("ALLOWED", "Action verified", action_name)
        return True

    def _log(self, status, reason, action):
        self.audit_log.append({
            "timestamp": __import__('datetime').datetime.now().isoformat(),
            "status": status,
            "reason": reason,
            "action": action
        })

# Exemple d'utilisation
engine = ZeroTrustPolicyEngine(
    allowed_domains=["example.com", "company.org"],
    sensitive_patterns=["ignore previous instructions", "admin_password"]
)

# Appel d'agent simulé
proposed_action = "send_email"
proposed_params = {"to": "user@evil-attacker.com", "subject": "Test"}

if engine.verify_action(proposed_action, proposed_params, context="initial_user_prompt"):
    print("Action Executed")
else:
    print("Action Blocked by Zero-Trust Policy")

Portée dynamique et émission de jetons

Pour des environnements plus complexes, vous pouvez implémenter des « Micro-Jetons ». Lorsque le moteur de politique approuve une action spécifique, il émet un JWT (JSON Web Token) à durée de vie courte et à usage unique, strictement limité à cette opération. Le serveur d'outils vérifie ensuite ce JWT. Cela garantit que même si l'agent est compromis à l'étape suivante, le jeton émis précédemment ne peut pas être réutilisé ou modifié pour effectuer des actions différentes.

Par exemple, un jeton pourrait ressembler à ceci :


{
  "sub": "agent-instance-123",
  "action": "read_file",
  "resource": "/data/reports/2023_Q4.pdf",
  "exp": 1715232000,
  "jti": "unique-id-789"
}

Conclusion

À mesure que les agents IA deviennent plus autonomes, la sécurité ne peut plus être une réflexion a posteriori ou une simple porte périmétrique. Elle doit être tissée dans la trame de la boucle de l'agent. En implémentant une architecture Zéro Confiance avec une vérification continue, vous vous assurez que chaque action est examinée en temps réel, protégeant ainsi à la fois votre infrastructure et vos utilisateurs contre des attaques agentiques sophistiquées. Commencez petit en auditant vos appels d'outils les plus critiques, puis élargissez progressivement la couverture à tout votre écosystème d'agents.

Share: