Retour aux articles • CLOUD • • 4 min de lecture

Isoler un agent autonome sous Docker

Architecture de confinement Docker (cgroups, réseau interne et Data Diode HMAC-SHA256) pour exécuter un agent autonome sans exposer le SI.

Isoler un agent autonome sous Docker

Déployer un agent IA autonome capable d’analyser des flux externes (flux RSS, alertes de veille, pages web, courriels entrants) introduit une surface d’attaque critique : l’injection de prompt indirecte (Indirect Prompt Injection). Un contenu externe malveillant peut tenter de détourner les instructions de l’agent pour exfiltrer des secrets, interroger le réseau local ou saturer l’hôte par déni de service.

Plutôt que de compter uniquement sur le filtrage sémantique du modèle LLM : par nature probabiliste : , une architecture Zero-Trust déplace la sécurité au niveau du système d’exploitation et du réseau : l’agent est confiné dans une enclave hermétique dépourvue de tout privilège d’infrastructure.


Pourquoi isoler un agent autonome

Dans une approche de défense en profondeur, on postule que le contexte du LLM peut être compromis par une donnée externe. L’infrastructure doit donc garantir mathématiquement et matériellement que même un agent détourné ne peut ni rebondir sur le LAN, ni lire les bases de production, ni épuiser les ressources du serveur :

Architecture & Flux : Enclave IA Zero-Trust : isoler un agent au

Les quatre invariants matériels de l’enclave sont :

  1. Zéro accès au plan de contrôle : aucun montage de /var/run/docker.sock, aucun volume partagé avec le stockage primaire (NAS/SAN) ni accès direct à la base de données centrale.
  2. Cloisonnement réseau strict : réseau bridge dédié avec blocage explicite des plages privées RFC1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) à l’exception de l’endpoint de collecte de la Data Diode.
  3. Contingentement matériel (cgroups v2) : plafonnement dur de la RAM, du CPU et du nombre de processus (pids_limit) pour neutraliser toute fork-bomb ou fuite mémoire.
  4. Communication sortante par Data Diode signée : l’enclave ne peut pas requêter le cœur du système ; elle ne peut qu’émettre des télémétries structurées signées par HMAC-SHA256.

Conteneur standard vs enclave isolée

Vecteur de risqueAgent IA déployé sans enclaveEnclave IA Zero-Trust durcie
Injection de prompt visant l’hôteRisque d’exécution ou lecture de secrets voisinsSystème de fichiers read_only: true, no-new-privileges, UID non-root
Mouvement latéral LAN / SSRFAccès possible aux services internes non authentifiésFiltrage réseau strict + validation anti-SSRF des IP résolues
Emballement boucle LLM / OOMSaturation de la RAM hôte et crash des services critiquesmem_limit: 512m, cpus: 1.0, pids_limit: 128 via cgroups
Corruption de la base centraleÉcriture directe en base avec credentials partagésZéro credential BDD ; télémétrie poussée via Data Diode HMAC-SHA256
Arrêt d’urgence (Killswitch)Dépend de la réactivité interne du processus agentSentinelle externe indépendante capable de couper l’enclave hors-bande

Configuration Docker Compose

Le descripteur d’infrastructure ci-dessous verrouille les capacités noyau Linux (cap_drop: ALL), interdit l’élévation de privilèges et impose un système de fichiers racine immuable :

services:
  autonomous_enclave:
    image: registry.internal/enclave-agent:1.4.0
    container_name: ai_enclave_worker
    restart: unless-stopped
    user: "10001:10001"
    read_only: true
    tmpfs:
      - /tmp:size=64M,noexec,nosuid,nodev
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    deploy:
      resources:
        limits:
          cpus: "1.00"
          memory: 512M
          pids: 128
    networks:
      - enclave_isolated_net

La Data Diode signée en HMAC-SHA256

Pour remonter ses indicateurs de performance (KPIs, résumés d’exécution, coûts tokens) vers le tableau de bord central sans jamais disposer d’un accès en lecture/écriture sur la base principale, l’enclave signe chaque paquet JSON avec une clé partagée à portée unique et un horodatage anti-rejeu :

import hashlib
import hmac
import json
import time

def build_diode_envelope(payload: dict, diode_secret: str) -> dict:
    timestamp = int(time.time())
    canonical = json.dumps(payload, sort_keys=True, separators=(",", ":"))
    message = f"{timestamp}.{canonical}".encode("utf-8")
    signature = hmac.new(diode_secret.encode("utf-8"), message, hashlib.sha256).hexdigest()
    return {
        "ts": timestamp,
        "payload": payload,
        "hmac_sha256": signature,
    }

Le récepteur central vérifie d’abord la fraîcheur du timestamp (abs(now - ts) < 60), valide la signature en temps constant (hmac.compare_digest), puis applique un schéma Pydantic strict avant toute persistance.

```bash # 1. Vérifier que les limites cgroups (RAM, CPU, PIDs) sont actives sur l'enclave docker inspect ai_enclave_worker --format 'Memory={{.HostConfig.Memory}} NanoCPUs={{.HostConfig.NanoCpus}} PIDs={{.HostConfig.PidsLimit}}' # 2. Confirmer l'absence totale de montage docker.sock et le mode Read-Only docker inspect ai_enclave_worker --format 'ReadOnly={{.HostConfig.ReadonlyRootfs}} Mounts={{json .Mounts}}' # 3. Contrôler les capacités Linux effectives du processus dans l'enclave (doit afficher 0000000000000000) docker exec ai_enclave_worker grep CapEff /proc/1/status ```
Animation exécution CLI dans le terminal
CommandeDescription

5. Synthèse architecturale

L’autonomie d’un agent IA en production est directement proportionnelle à la rigueur de son confinement. En combinant un système de fichiers immuable, des quotas cgroups infranchissables et une Data Diode unidirectionnelle signée, on tire parti de la puissance d’automatisation des LLM tout en garantissant l’intégrité du système d’information.