0Pricing
AI Agents · Lekcja

Izolacja maszyn wirtualnych dla agentów wykonujących kod o wysokim poziomie bezpieczeństwa

gVisor, mikromaszyny wirtualne Firecracker i izolacja na poziomie sprzętowym dla agentów.

Izolacja maszyn wirtualnych dla agentów wykonujących kod o wysokim poziomie bezpieczeństwa to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.

Poza Dockerem: silniejsza izolacja

Standardowe kontenery Docker współdzielą jądro hosta. Wykorzystanie luki w jądrze z poziomu kontenera może umożliwić ucieczkę na hosta. W przypadku wykonywania kodu wymagającego wysokiego poziomu bezpieczeństwa potrzebne są warstwy silniejszej izolacji.

Dwa główne podejścia to: gVisor (pośrednik jądra w przestrzeni użytkownika) i Firecracker (lekkie mikro maszyny wirtualne).

Jak działa gVisor

gVisor umieszcza komponent w przestrzeni użytkownika o nazwie Sentry między kontenerem a jądrem hosta. Wywołania systemowe kontenera trafiają do Sentry, który implementuje na nowo bezpieczny podzbiór w języku Go, a nie w prawdziwym jądrze.

Środowisko uruchomieniowe nosi nazwę runsc (uruchamianie kontenera w piaskownicy).

# 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())

Przechwytywanie wywołań systemowych przez gVisor

Gdy kod wewnątrz kontenera wywołuje open(), read() lub socket(), gVisor przechwytuje wywołanie systemowe i decyduje, czy je zezwolić, emulować czy zablokować.

Wrażliwe wywołania systemowe, takie jak ptrace lub tworzenie surowych gniazd, są domyślnie blokowane, co zamyka typowe wektory ataku.

# 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')

Kompromis wydajności gVisor

Każde wywołanie systemowe przechodzi przez Sentry zamiast bezpośrednio do jądra. Dodaje to narzut rzędu ~10-30% w przypadku obciążeń intensywnie korzystających z operacji wejścia-wyjścia. W przypadku obliczeń ograniczonych przez CPU narzut jest znacznie mniejszy.

Czas uruchamiania jest podobny jak w zwykłym Dockerze — wynosi milisekundy.

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.3s

MikroVM-y Firecracker

Firecracker stosuje zupełnie inne podejście: uruchamia każde obciążenie w pełnej maszynie wirtualnej z własnym jądrem. Maszyna wirtualna uruchamia się w ~50 ms i zużywa tylko ~5 MB dodatkowej pamięci.

Ponieważ maszyny wirtualne mają całkowicie oddzielne jądro, nie występuje powierzchnia ataku związana ze współdzielonym jądrem.

# 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')

Model bezpieczeństwa Firecracker

Maszyny wirtualne Firecracker mają z założenia minimalną powierzchnię ataku. VMM udostępnia tylko 5 typów urządzeń (virtio-net, virtio-block, serial, RTC, keyboard). Brak USB, magistrali PCI i BIOS-u.

Każda maszyna wirtualna jest izolowana na poziomie hipernadzorcy — wykorzystanie luki w jądrze maszyny wirtualnej nie może umożliwić dostępu do hosta.

# 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: połączenie obu podejść

Kata Containers używają lekkiej maszyny wirtualnej (mogą korzystać z Firecracker lub QEMU), ale udostępniają standardowy interfejs kontenerów OCI. Wykonują Państwo zwykłe polecenia Dockera, a Kata obsługuje warstwę maszyny wirtualnej w sposób przejrzysty.

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 hostname

Wybór właściwego poziomu izolacji

Właściwa piaskownica zależy od modelu zagrożeń i akceptowalnego poziomu opóźnień:

  • Docker (runc): szybki, niewielki narzut, współdzielone jądro — odpowiedni dla zaufanego kodu lub kodu poddanego podstawowemu filtrowaniu
  • gVisor (runsc): filtrowanie wywołań systemowych, ten sam format obrazu, niewielki narzut — dobry kompromis
  • Firecracker/Kata: pełna izolacja maszyny wirtualnej, uruchamianie w 50 ms — dla niezaufanego kodu użytkownika na dużą skalę

Tabela: bezpieczeństwo a opóźnienie uruchamiania

Głębokość izolacji i szybkość uruchamiania są odwrotnie proporcjonalne. Należy dokonać wyboru na podstawie akceptowalnego opóźnienia w danym zastosowaniu agenta.

# 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']}")

Wstępne uruchamianie piaskownic

Uruchamianie maszyny wirtualnej od zera dla każdego żądania agenta zwiększa opóźnienie. Systemy produkcyjne uruchamiają wcześniej pulę bezczynnych piaskownic. Po nadejściu żądania przydzielana jest gotowa piaskownica, która jest używana, a następnie niszczona (i nigdy nie jest ponownie wykorzystywana).

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 ready

Migawki i przywracanie na dużą skalę

Firecracker obsługuje zapisywanie migawki działającej maszyny wirtualnej na dysku. Migawka zawiera stan pamięci, stan urządzeń i rejestry procesora. Przywrócenie ze snapshotu trwa ~10 ms — znacznie krócej niż uruchomienie od zera.

Ten wzorzec pozwala raz zainicjalizować interpreter Pythona, utworzyć jego migawkę, a następnie przywracać go dla każdego żądania.

# 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')

Jaki komponent gVisor umieszcza między kontenerem a jądrem hosta?

Model izolacji gVisor opiera się na konkretnym komponencie, który przechwytuje wywołania systemowe. Zrozumienie tej architektury jest kluczowe dla oceny gwarancji bezpieczeństwa gVisor.

Podsumowanie izolacji maszyn wirtualnych

W przypadku wykonywania kodu agenta wymagającego wysokiego poziomu bezpieczeństwa należy odejść od standardowego Dockera na rzecz gVisor (przechwytywanie wywołań systemowych, niewielki narzut) lub Firecracker (pełna maszyna wirtualna, uruchamianie w 50 ms, ~5 MB dodatkowej pamięci).

Kompromis zawsze dotyczy głębokości izolacji i opóźnienia uruchamiania. Pule wstępnie uruchomionych piaskownic i migawki maszyn wirtualnych pozwalają w środowisku produkcyjnym odzyskać większość czasu poniesionego na uruchamianie.

Często zadawane pytania

Czy lekcja „Izolacja maszyn wirtualnych dla agentów wykonujących kod o wysokim poziomie bezpieczeństwa” jest bezpłatna?

Tak — pełny tekst „Izolacja maszyn wirtualnych dla agentów wykonujących kod o wysokim poziomie bezpieczeństwa” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.

Co nauczysz się w „Izolacja maszyn wirtualnych dla agentów wykonujących kod o wysokim poziomie bezpieczeństwa”?

gVisor, mikromaszyny wirtualne Firecracker i izolacja na poziomie sprzętowym dla agentów. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Agents?

Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Izolacja maszyn wirtualnych dla agentów wykonujących kod o wysokim poziomie bezpieczeństwa”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?

Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Sandboxy agentów oparte na Dockerze
  2. Izolacja maszyn wirtualnych dla agentów wykonujących kod o wysokim poziomie bezpieczeństwa
  3. E2B i chmurowe usługi sandboxów
  4. Zasady bezpieczeństwa wykonywania kodu
← Powrót do AI Agents