การแยก 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.3sMicroVMs ของไฟร์แครกเกอร์
ไฟร์แครกเกอร์ใช้แนวทางที่แตกต่างอย่างสิ้นเชิง โดยเรียกใช้งานแต่ละงานใน เครื่องเสมือนเต็มรูปแบบ ที่มีเคอร์เนลของตัวเอง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แซนด์บ็อกซ์เอเจนต์บน Docker
- การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง
- บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์
- นโยบายความปลอดภัยสำหรับการเรียกใช้โค้ด