Aller au contenu principal
MULTI-AGENTS • CREWAI SECURITY

Instrumentation CrewAI Multi-Agents

Décorateur @secure_crew_tool, isolation stricte des permissions par rôle d'agent et prévention des fuites transversales inter-agents.

Instrumentation CrewAI Multi-Agents

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 CrewAIOutils AutorisésActions Interdites
Researcher / Web Scrapersearch_engine, scrape_pagewrite_db, send_email, exec_code
Data Analystread_analytics_db, plot_chartswrite_production_db, delete_records
Executive / Action Botsend_slack_alert, create_ticketrun_shell_command, export_all_users