0Pricing
AI Agents · บทเรียน

การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง

gVisor, Firecracker microVMs และการแยกระดับฮาร์ดแวร์สำหรับเอเจนต์

การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

นอกเหนือจากด็อกเกอร์: การแยกที่เข้มแข็งกว่า

คอนเทนเนอร์ด็อกเกอร์มาตรฐานใช้เคอร์เนลของโฮสต์ร่วมกัน ช่องโหว่ในเคอร์เนลจากภายในคอนเทนเนอร์อาจทำให้หลบหนีไปยังโฮสต์ได้ สำหรับการเรียกใช้โค้ดที่ต้องการความปลอดภัยสูง จำเป็นต้องใช้ชั้นการแยกที่เข้มแข็งกว่า

มีแนวทางหลักสองแบบ ได้แก่ gVisor (พร็อกซีเคอร์เนลในพื้นที่ผู้ใช้) และ ไฟร์แครกเกอร์ (microVMs น้ำหนักเบา)

การทำงานของ gVisor

gVisor แทรกองค์ประกอบในพื้นที่ผู้ใช้ที่เรียกว่า เซนทรี ไว้ระหว่างคอนเทนเนอร์กับเคอร์เนลของโฮสต์ การเรียกระบบของคอนเทนเนอร์จะถูกส่งไปยังเซนทรี ซึ่งนำชุดย่อยที่ปลอดภัยกลับมาใช้งานใหม่ด้วยภาษาโก แทนที่จะใช้เคอร์เนลจริง

รันไทม์นี้เรียกว่า runsc (คอนเทนเนอร์ที่ทำงานในแซนด์บ็อกซ์)

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

การดักจับการเรียกระบบของ gVisor

เมื่อโค้ดภายในคอนเทนเนอร์เรียกใช้ open() read() หรือ socket() gVisor จะดักจับการเรียกระบบนั้นและตัดสินใจว่าจะอนุญาต จำลอง หรือปฏิเสธ

การเรียกระบบที่ละเอียดอ่อน เช่น ptrace หรือการสร้างซ็อกเก็ตดิบ จะถูกบล็อกไว้เป็นค่าเริ่มต้น ซึ่งช่วยปิดช่องทางการโจมตีที่มักใช้หาประโยชน์

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

ข้อแลกเปลี่ยนด้านประสิทธิภาพของ gVisor

การเรียกระบบทุกครั้งจะผ่านเซนทรีแทนที่จะเรียกใช้เคอร์เนลโดยตรง วิธีนี้เพิ่มค่าใช้จ่ายส่วนเกินประมาณ 10–30% สำหรับงานที่ใช้การรับส่งข้อมูลเข้าออกอย่างหนัก ส่วนการคำนวณที่ใช้ CPU เป็นหลักจะมีค่าใช้จ่ายส่วนเกินน้อยกว่ามาก

เวลาเริ่มต้นใกล้เคียงกับด็อกเกอร์ปกติ คือระดับมิลลิวินาที

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

MicroVMs ของไฟร์แครกเกอร์

ไฟร์แครกเกอร์ใช้แนวทางที่แตกต่างอย่างสิ้นเชิง โดยเรียกใช้งานแต่ละงานใน เครื่องเสมือนเต็มรูปแบบ ที่มีเคอร์เนลของตัวเอง VM เริ่มระบบได้ภายในประมาณ 50 มิลลิวินาที และใช้หน่วยความจำส่วนเกินเพียงประมาณ 5 MB

เนื่องจาก VM แต่ละชุดมีเคอร์เนลแยกออกจากกันโดยสมบูรณ์ จึงไม่มีพื้นผิวการโจมตีผ่านเคอร์เนลร่วมกัน

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

แบบจำลองความปลอดภัยของไฟร์แครกเกอร์

VM ของไฟร์แครกเกอร์มีพื้นผิวการโจมตีที่น้อยที่สุดตั้งแต่การออกแบบ VMM เปิดเผยอุปกรณ์เพียง 5 ประเภท ได้แก่ เครือข่ายเวอร์ชวลไอโอ บล็อกเวอร์ชวลไอโอ พอร์ตอนุกรม RTC และแป้นพิมพ์ ไม่มี USB ไม่มีบัส PCI และไม่มี BIOS

VM แต่ละชุดถูกแยกในระดับไฮเปอร์ไวเซอร์ ช่องโหว่ในเคอร์เนลจากภายใน VM ไม่สามารถเข้าถึงโฮสต์ได้

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

คอนเทนเนอร์คาตะ: การผสานทั้งสองแนวทาง

คอนเทนเนอร์คาตะใช้ VM น้ำหนักเบา (สามารถใช้ไฟร์แครกเกอร์หรือ QEMU ได้) แต่เปิดให้ใช้ส่วนติดต่อคอนเทนเนอร์มาตรฐานของ OCI คุณเรียกใช้คำสั่งด็อกเกอร์ปกติได้ โดยคาตะจะจัดการชั้น 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 hostname

การเลือกระดับการแยกที่เหมาะสม

แซนด์บ็อกซ์ที่เหมาะสมขึ้นอยู่กับแบบจำลองภัยคุกคามและงบเวลาแฝงของคุณ:

  • ด็อกเกอร์ (รันซี): ทำงานเร็ว ค่าใช้จ่ายส่วนเกินต่ำ ใช้เคอร์เนลร่วมกัน — เหมาะสำหรับโค้ดที่เชื่อถือได้หรือผ่านการกรองเพียงเล็กน้อย
  • gVisor (runsc): กรองการเรียกระบบ ใช้รูปแบบอิมเมจเดียวกัน มีค่าใช้จ่ายส่วนเกินเล็กน้อย — ให้ความสมดุลที่ดี
  • ไฟร์แครกเกอร์/คาตะ: แยกด้วย VM เต็มรูปแบบ เริ่มระบบใน 50 มิลลิวินาที — เหมาะสำหรับโค้ดของผู้ใช้ที่ไม่เชื่อถือได้ในระดับใหญ่

ตารางเปรียบเทียบความปลอดภัยกับเวลาแฝงในการเริ่มต้น

ความลึกของการแยกและความเร็วในการเริ่มต้นมีความสัมพันธ์แบบผกผัน ให้เลือกตามเวลาแฝงที่ยอมรับได้สำหรับกรณีการใช้งานเอเจนต์ของคุณ

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

การเตรียมแซนด์บ็อกซ์ล่วงหน้า

การเริ่ม VM ใหม่สำหรับคำขอของเอเจนต์ทุกครั้งจะเพิ่มเวลาแฝง ระบบสำหรับใช้งานจริงจึงเตรียมกลุ่มแซนด์บ็อกซ์ที่ไม่ได้ใช้งานไว้ล่วงหน้า เมื่อมีคำขอเข้ามา ระบบจะยึดแซนด์บ็อกซ์ที่เตรียมไว้ นำไปใช้งาน แล้วทำลายทิ้ง (ห้ามนำกลับมาใช้ซ้ำ)

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

การสร้างและกู้คืนสแนปช็อตเพื่อรองรับการขยายระบบ

ไฟร์แครกเกอร์รองรับการบันทึก VM ที่กำลังทำงานอยู่เป็นสแนปช็อตลงดิสก์ สแนปช็อตจะบันทึกสถานะหน่วยความจำ สถานะอุปกรณ์ และรีจิสเตอร์ของ CPU การกู้คืนจากสแนปช็อตใช้เวลาประมาณ 10 มิลลิวินาที ซึ่งเร็วกว่าการเริ่มระบบใหม่มาก

รูปแบบนี้ทำให้คุณเริ่มต้นตัวแปลภาษาไพธอนเพียงครั้งเดียว สร้างสแนปช็อต แล้วกู้คืนสำหรับแต่ละคำขอได้

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

องค์ประกอบใดที่ gVisor แทรกไว้ระหว่างคอนเทนเนอร์กับเคอร์เนลของโฮสต์

แบบจำลองการแยกของ gVisor ขึ้นอยู่กับองค์ประกอบเฉพาะที่ดักจับการเรียกระบบ การทำความเข้าใจสถาปัตยกรรมนี้เป็นกุญแจสำคัญในการประเมินการรับประกันด้านความปลอดภัย

สรุปการแยกด้วย VM

สำหรับการเรียกใช้โค้ดของเอเจนต์ที่ต้องการความปลอดภัยสูง ให้ก้าวข้ามด็อกเกอร์มาตรฐานไปใช้ gVisor (ดักจับการเรียกระบบ ค่าใช้จ่ายส่วนเกินต่ำ) หรือ ไฟร์แครกเกอร์ (VM เต็มรูปแบบ เริ่มระบบใน 50 มิลลิวินาที ค่าใช้จ่ายส่วนเกินประมาณ 5 MB)

ข้อแลกเปลี่ยนจะอยู่ที่ ความลึกของการแยกเทียบกับเวลาแฝงในการเริ่มต้น การเตรียมกลุ่มแซนด์บ็อกซ์ล่วงหน้าและสแนปช็อต VM สามารถชดเชยต้นทุนด้านเวลาแฝงส่วนใหญ่ได้ในระบบสำหรับใช้งานจริง

คำถามที่พบบ่อย

บทเรียน “การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง”

gVisor, Firecracker microVMs และการแยกระดับฮาร์ดแวร์สำหรับเอเจนต์ คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แซนด์บ็อกซ์เอเจนต์บน Docker
  2. การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง
  3. บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์
  4. นโยบายความปลอดภัยสำหรับการเรียกใช้โค้ด
← กลับไปที่ AI Agents