Instrumentation CrewAI Multi-Agents
Les architectures multi-agents comme CrewAI introduisent un défi de sécurité majeur : la délégation d'actions entre agents. Un agent de recherche non privilégié ayant ingéré une source compromise ne doit jamais pouvoir manipuler un agent exécutif disposant d'accès en écriture sur des bases de données.
Boundry permet de cloisonner hermétiquement chaque membre du Crew et d'auditer l'ensemble des interactions inter-agents.
1. Sécurisation des Outils Personnalisés (@tool)
Dans CrewAI, les outils créés avec le décorateur natif @tool de CrewAI peuvent être directement enveloppés avec le décorateur @protect_tool de Boundry :
crew_tools.py
import os
from crewai.tools import tool
from boundry.sensor import BoundryClient, protect_tool
client = BoundryClient(api_key=os.getenv("BOUNDRY_API_KEY"))
@tool("Effectuer un virement comptable")
@protect_tool(client=client, tool_name="bank_wire_transfer")
def wire_transfer_tool(recipient_account: str, amount: float, purpose: str) -> str:
"""Exécute un virement financier sortant."""
# Cette logique métier est surveillée par Boundry
return f"Virement de {amount}€ vers {recipient_account} transmis."
2. Exemple de Crew Sécurisé avec Cloisonnement des Rôles
secure_crew_pipeline.py
import os
from crewai import Agent, Task, Crew, Process
from boundry.sensor import BoundryClient, protect_tool
client = BoundryClient(api_key=os.getenv("BOUNDRY_API_KEY"))
# 1. Définition des outils sensibles protégés
@protect_tool(client=client, tool_name="database_read")
def read_customer_record(customer_id: str) -> str:
"""Consulte le dossier client en base de données."""
return f"Client {customer_id}: Risque faible, Solde 1 200 €"
# 2. Agent 1 : Analyste Financier (Droit de lecture uniquement)
analyst_agent = Agent(
role="Analyste Financier",
goal="Analyser les dossiers de crédit et formuler une recommandation objective.",
backstory="Expert en analyse des risques financiers et conformité bancaire.",
verbose=True,
tools=[read_customer_record],
allow_delegation=False # Interdit de déléguer à d'autres agents non supervisés
)
# 3. Agent 2 : Auditeur Conformité SecOps
auditor_agent = Agent(
role="Auditeur de Conformité",
goal="Vérifier le strict respect des règles avant validation finale.",
backstory="Responsable du respect des plafonds de crédit et des règles de conformité.",
verbose=True,
allow_delegation=False
)
# 4. Tâches
task_analysis = Task(
description="Analyser le dossier du client CUS-901 et émettre un avis de crédit.",
expected_output="Rapport d'évaluation du risque de crédit.",
agent=analyst_agent
)
task_validation = Task(
description="Vérifier la recommandation de l'analyste et certifier la conformité.",
expected_output="Attestation de validation ou motif de refus motivé.",
agent=auditor_agent
)
# 5. Définition du Crew avec Callback de Step Boundry
def on_crew_step(step_output):
"""Transmet chaque étape du Crew à la console Boundry."""
client.log_agent_thought(
agent_role=step_output.agent,
thought_summary=step_output.thought[:200] if hasattr(step_output, 'thought') else "Étape intermédiaire"
)
crew = Crew(
agents=[analyst_agent, auditor_agent],
tasks=[task_analysis, task_validation],
process=Process.sequential,
step_callback=on_crew_step,
verbose=True
)
# 6. Lancement du Crew
result = crew.kickoff()
print("\n=== Résultat final du Crew ===")
print(result)
3. Matrice de Permissions Recommandée pour CrewAI
Pour prévenir l'escalade de privilèges entre agents, appliquez ces principes dans votre console Boundry :
| Rôle de l'Agent CrewAI | Outils Autorisés | Actions Interdites |
|---|---|---|
| Researcher / Web Scraper | search_engine, scrape_page | write_db, send_email, exec_code |
| Data Analyst | read_analytics_db, plot_charts | write_production_db, delete_records |
| Executive / Action Bot | send_slack_alert, create_ticket | run_shell_command, export_all_users |