Isolamento tramite VM per agenti che eseguono codice con elevati requisiti di sicurezza
gVisor, microVM Firecracker e isolamento a livello hardware per gli agenti.
Isolamento tramite VM per agenti che eseguono codice con elevati requisiti di sicurezza è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.
Oltre Docker: isolamento più robusto
I container Docker standard condividono il kernel dell'host. Un exploit del kernel all'interno del container può consentire la fuga verso l'host. Per l'esecuzione di codice con elevati requisiti di sicurezza sono necessari livelli di isolamento più robusti.
Esistono due approcci principali: gVisor (proxy del kernel nello spazio utente) e Firecracker (microVM leggere).
Come funziona gVisor
gVisor inserisce un componente nello spazio utente chiamato Sentry tra il container e il kernel dell'host. Le chiamate di sistema del container vengono indirizzate a Sentry, che reimplementa in Go un sottoinsieme sicuro, anziché utilizzare il kernel reale.
Il runtime si chiama runsc (run sandboxed container).
# Configure Docker to use gVisor runtime (runsc)
# /etc/docker/daemon.json:
# {
# "runtimes": {
# "runsc": { "path": "/usr/local/bin/runsc" }
# }
# }
import docker
client = docker.from_env()
output = client.containers.run(
'python:3.12-slim',
'python -c "print(\"hello from gVisor\")"',
runtime='runsc', # use gVisor
network_disabled=True,
auto_remove=True
)
print(output.decode())Intercettazione delle chiamate di sistema in gVisor
Quando il codice all'interno del container chiama open(), read() o socket(), gVisor intercetta la chiamata di sistema e decide se consentirla, emularla o negarla.
Le chiamate di sistema sensibili come ptrace o la creazione di socket raw sono bloccate per impostazione predefinita, eliminando comuni vettori di exploit.
# gVisor blocks dangerous syscalls like ptrace.
# This code would fail inside a gVisor container:
#
# import ctypes
# libc = ctypes.CDLL(None)
# libc.ptrace(...) # EPERM: Operation not permitted
#
# Normal Python I/O and computation works fine:
# open(), read(), write(), socket() (if network enabled)
# are all emulated safely by Sentry.
print('gVisor intercepts syscalls before they reach the host kernel')Compromesso prestazionale di gVisor
Ogni chiamata di sistema passa attraverso Sentry invece di raggiungere direttamente il kernel. Questo aggiunge un overhead di circa il 10-30% nei carichi di lavoro intensivi in termini di I/O. Per i calcoli con utilizzo intensivo della CPU, l'overhead è molto più ridotto.
Il tempo di avvio è simile a quello di Docker standard: pochi millisecondi.
import time
import docker
client = docker.from_env()
start = time.time()
client.containers.run('python:3.12-slim', 'python -c "pass"',
runtime='runsc', auto_remove=True)
print(f'gVisor startup: {time.time()-start:.2f}s') # ~0.3-0.8s
start = time.time()
client.containers.run('python:3.12-slim', 'python -c "pass"',
auto_remove=True)
print(f'Docker startup: {time.time()-start:.2f}s') # ~0.1-0.3sMicroVM Firecracker
Firecracker adotta un approccio completamente diverso: esegue ogni carico di lavoro in una macchina virtuale completa con il proprio kernel. La VM si avvia in circa 50 ms e utilizza solo circa 5 MB di memoria aggiuntiva.
Poiché le VM hanno un kernel completamente separato, non esiste una superficie di attacco basata sulla condivisione del kernel.
# Firecracker is controlled via a REST API on a Unix socket.
# Python SDK example (firecracker-python-sdk or direct HTTP):
import requests_unixsocket
session = requests_unixsocket.Session()
base = 'http+unix://%2Ftmp%2Ffirecracker.socket'
# Boot the microVM
session.put(f'{base}/boot-source', json={
'kernel_image_path': '/opt/kernel/vmlinux',
'boot_args': 'console=ttyS0 reboot=k panic=1 pci=off'
})
session.put(f'{base}/actions', json={'action_type': 'InstanceStart'})
print('MicroVM booted in ~50ms')Modello di sicurezza di Firecracker
Le VM Firecracker hanno una superficie di attacco minima per progettazione. Il VMM espone solo 5 tipi di dispositivo (virtio-net, virtio-block, serial, RTC, keyboard). Nessun USB, nessun bus PCI e nessun BIOS.
Ogni VM è isolata a livello di hypervisor: un exploit del kernel all'interno della VM non può raggiungere l'host.
# Firecracker security properties:
# 1. Each microVM has its own Linux kernel instance
# 2. Guest-to-host attack surface is tiny (5 device types)
# 3. The VMM (Virtual Machine Monitor) runs unprivileged
# 4. No shared memory between VMs
# 5. Snapshot/restore: freeze a running VM, clone it for next request
# Used in production by:
# - AWS Lambda (each function invocation = Firecracker microVM)
# - Fly.io (each app container)
# - Replit (code execution)
print('Firecracker: full VM isolation at container startup speed')Kata Containers: combinare i due approcci
Kata Containers utilizza una VM leggera (può usare Firecracker o QEMU), ma espone l'interfaccia standard dei container OCI. Si eseguono i normali comandi Docker, mentre Kata gestisce in modo trasparente il livello della VM.
import docker
client = docker.from_env()
# Kata Containers registered as 'kata-runtime' in daemon.json
output = client.containers.run(
'python:3.12-slim',
'python -c "import platform; print(platform.node())"',
runtime='kata-runtime', # each container = a VM
mem_limit='256m',
network_disabled=True,
auto_remove=True
)
print(output.decode()) # unique VM hostnameScelta del livello di isolamento appropriato
La sandbox appropriata dipende dal modello delle minacce e dal limite di latenza:
- Docker (runc): veloce, overhead ridotto, kernel condiviso — adatto a codice affidabile o sottoposto a filtri leggeri
- gVisor (runsc): filtro delle chiamate di sistema, stesso formato delle immagini, overhead contenuto — un buon compromesso
- Firecracker/Kata: isolamento completo tramite VM, avvio in 50 ms — per codice utente non affidabile su larga scala
Tabella di sicurezza e latenza di avvio
La profondità dell'isolamento e la velocità di avvio sono inversamente correlate. Scelga in base alla latenza accettabile per il caso d'uso dell'agente.
# Isolation vs Latency summary:
#
# Runtime | Isolation | Startup | Overhead
# -----------------|---------------|----------|----------
# runc (Docker) | Namespace | ~100ms | ~0%
# gVisor (runsc) | Syscall filter | ~300ms | ~15-30%
# Kata Containers | Full VM | ~500ms | ~10%
# Firecracker | Full VM | ~50ms | ~5%
# QEMU KVM | Full VM | ~1-2s | ~5%
#
# For interactive agent tools: gVisor is usually the sweet spot.
# For high-throughput batch jobs: Firecracker snapshots.
ISOLATION_OPTIONS = {
'runc (Docker)': {'isolation': 'Namespace', 'startup': '~100ms', 'overhead': '~0%'},
'gVisor (runsc)': {'isolation': 'Syscall filter', 'startup': '~300ms', 'overhead': '~15-30%'},
'Kata Containers': {'isolation': 'Full VM', 'startup': '~500ms', 'overhead': '~10%'},
'Firecracker': {'isolation': 'Full VM', 'startup': '~50ms', 'overhead': '~5%'},
'QEMU KVM': {'isolation': 'Full VM', 'startup': '~1-2s', 'overhead': '~5%'},
}
for runtime, info in ISOLATION_OPTIONS.items():
print(f"{runtime:<17} | {info['isolation']:<14} | startup {info['startup']:<7} | overhead {info['overhead']}")
Preparazione anticipata delle sandbox
Avviare una VM a freddo per ogni richiesta dell'agente aggiunge latenza. I sistemi di produzione preparano in anticipo un pool di sandbox inattive. Quando arriva una richiesta, una sandbox già pronta viene assegnata, utilizzata e poi distrutta (non viene mai riutilizzata).
import queue, threading
SANDBOX_POOL_SIZE = 5
pool = queue.Queue()
def pre_warm():
'Start a sandbox and put it in the pool.'
container = client.containers.create(
'python:3.12-slim',
'tail -f /dev/null',
runtime='runsc',
mem_limit='256m',
network_disabled=True
)
container.start()
pool.put(container)
# Pre-warm the pool at startup
for _ in range(SANDBOX_POOL_SIZE):
threading.Thread(target=pre_warm, daemon=True).start()
def claim_sandbox():
return pool.get(timeout=5) # blocks until one is readySnapshot e ripristino per la scalabilità
Firecracker supporta la creazione di snapshot di una VM in esecuzione su disco. Lo snapshot acquisisce lo stato della memoria, lo stato dei dispositivi e i registri della CPU. Il ripristino da uno snapshot richiede circa 10 ms, molto meno di un avvio a freddo.
Questo approccio consente di inizializzare una volta un interprete Python, crearne uno snapshot e ripristinarlo per ogni richiesta.
# Firecracker snapshot workflow:
# 1. Boot microVM, run Python interpreter, wait for REPL ready
# 2. Pause VM
# 3. Create snapshot
# PUT /snapshot/create { snapshot_path, mem_file_path }
# 4. For each request:
# PUT /snapshot/load { snapshot_path, mem_file_path }
# # VM resumes from paused state with Python already loaded
# # Send code via stdin/virtio-serial, read output
# 5. Discard VM after request (never reuse)
print('Snapshot restore: ~10ms vs 50ms cold boot for Firecracker')Quale componente inserisce gVisor tra il container e il kernel dell'host?
Il modello di isolamento di gVisor dipende da un componente specifico che intercetta le chiamate di sistema. Comprendere questa architettura è fondamentale per valutarne le garanzie di sicurezza.
Riepilogo dell'isolamento tramite VM
Per l'esecuzione di codice di agenti con elevati requisiti di sicurezza, vada oltre Docker standard e utilizzi gVisor (intercettazione delle chiamate di sistema, overhead ridotto) o Firecracker (VM completa, avvio in 50 ms, circa 5 MB di overhead).
Il compromesso è sempre tra profondità dell'isolamento e latenza di avvio. In produzione, i pool preparati in anticipo e gli snapshot delle VM possono recuperare gran parte del costo in termini di latenza.
Domande Frequenti
La lezione «Isolamento tramite VM per agenti che eseguono codice con elevati requisiti di sicurezza» è gratuita?
Sì — il testo completo di «Isolamento tramite VM per agenti che eseguono codice con elevati requisiti di sicurezza» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.
Cosa imparerò in «Isolamento tramite VM per agenti che eseguono codice con elevati requisiti di sicurezza»?
gVisor, microVM Firecracker e isolamento a livello hardware per gli agenti. Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Agents?
Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Isolamento tramite VM per agenti che eseguono codice con elevati requisiti di sicurezza»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Agents?
Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Sandbox per agenti basate su Docker
- Isolamento tramite VM per agenti che eseguono codice con elevati requisiti di sicurezza
- E2B e servizi sandbox cloud
- Policy di sicurezza per l’esecuzione del codice