Tutorial Firecracker MicroVM: Deploy Server Sandbox Terisolasi di VPS
Poin Kunci Artikel Ini:
- Hubungkan Firecracker ke file ephemeral tersebut.
- Hapus file ephemeral segera setelah proses microVM dimatikan (InstanceStop).
- Container Docker berbasis Linux Kernel Namespaces (PID, NET, IPC, MNT, UTS, USER) dan Control Groups (cgroups).
1. Arsitektur Isolasi: Docker Container vs AWS Firecracker MicroVM
Layanan multi-tenant yang mengeksekusi kode tidak terpercaya (untrusted code) membutuhkan batas isolasi terkuat. Container Docker berbasis Linux Kernel Namespaces (PID, NET, IPC, MNT, UTS, USER) dan Control Groups (cgroups). Fitur ini mengisolasi proses, bukan sistem operasi. Seluruh container pada host yang sama membagi satu Linux Kernel yang sama. Antarmuka system call (syscall) Linux mengekspos lebih dari 300 syscall langsung ke container. Kerentanan kernel host (seperti CVE-2022-0492 pada cgroups v1 atau CVE-2019-5736 pada runc) memungkinkan penyerang melakukan container breakout dan mendapatkan akses root pada host server.
Keterbatasan Isolasi Container
Container didesain untuk efisiensi packaging dan eksekusi aplikasi tepercaya. Container bukan merupakan security boundary yang aman untuk eksekusi arbitrary code, skrip pengguna multi-tenant, atau platform Function-as-a-Service (FaaS). Penggunaan isolasi tingkat proses gagal mencegah serangan exploit kernel tingkat lanjut.
Keunggulan Firecracker MicroVM
AWS Firecracker adalah Virtual Machine Monitor (VMM) minimalis yang ditulis menggunakan bahasa Rust. Firecracker memanfaatkan KVM (Kernel-based Virtual Machine) pada Linux untuk membuat MicroVM (Micro Virtual Machine). Berbeda dari hipervisor tradisional seperti QEMU yang menyimulasikan berbagai perangkat keras legacy (seperti bus PCI, chipset IDE, dan kontroler ACPI kompleks), Firecracker mengeliminasi perangkat emulasi tersebut. Firecracker hanya menyediakan antarmuka I/O minimalis berbasis VirtIO (virtio-net, virtio-block, virtio-vsock, dan serial console sederhana) serta antarmuka Memory-Mapped I/O (MMIO).
Setiap Firecracker MicroVM berjalan dengan kernel Linux independen terisolasi. Keunggulan arsitektur ini mencakup:
- Waktu Boot Sangat Cepat: Proses inisialisasi microVM selesai di bawah 5 milidetik.
- Overhead Memori Rendah: Konsumsi memori per instance hanya sekitar 5 MB RAM, memungkinkan ribuan microVM berjalan secara simultan pada satu host fisik.
- Security Boundary Kuat: Isolasi tingkat hardware berbasis Intel VT-x atau AMD-V via KVM. Eksekusi kode di dalam guest kernel tidak dapat menembus host kernel meskipun terjadi kernel panic pada guest.
- Keamanan Berlapis (Defense-in-Depth): Biner Firecracker dikurung oleh seccomp BPF filters, cgroups, dan chroot melalui pembungkus (jailer).
2. Prasyarat Sistem & Verifikasi Hardware Virtualization
Firecracker membutuhkan akses langsung ke antarmuka KVM (/dev/kvm). Panduan ini memerlukan Virtual Private Server (VPS) bare-metal atau KVM-based VPS yang mendukung fitur Nested Virtualization (fitur virtualisasi KVM di dalam VM host).
Langkah 1: Verifikasi Akses /dev/kvm dan Ekstensi CPU
Jalankan perintah berikut untuk memeriksa apakah ekstensi virtualisasi CPU (Intel VT-x vmx atau AMD-V svm) aktif dan perangkat KVM tersedia:
egrep -c '(vmx|svm)' /proc/cpuinfo
ls -l /dev/kvmOutput dari perintah egrep wajib menunjukkan angka minimal 1 atau lebih. Jalur /dev/kvm harus terdeteksi pada sistem.
Langkah 2: Instalasi Dependencies & Manajemen Izin KVM
Pasang dependensi dasar jaringan, alat manipulasi image, dan utilitas KVM pada distribusi Debian/Ubuntu:
sudo apt update && sudo apt install -y qemu-kvm iproute2 bridge-utils iptables curl jq acl
sudo setfacl -m u:$USER:rw /dev/kvmPerintah setfacl memberikan akses pembacaan dan penulisan antarmuka KVM ke pengguna non-root aktif tanpa perlu menjalankan daemon Firecracker sebagai root penuh.
3. Download & Setup Binary Firecracker + Jailer
Unduh biner rilis stabil Firecracker dan komponen keamanan jailer langsung dari repository resmi GitHub AWS Firecracker.
ARCH="$(uname -m)"
RELEASE_URL="https://github.com/firecracker-microvm/firecracker/releases/download/v1.7.0"
curl -L ${RELEASE_URL}/firecracker-v1.7.0-${ARCH}.tgz | tar -xz
sudo mv release-v1.7.0-${ARCH}/firecracker-v1.7.0-${ARCH} /usr/local/bin/firecracker
sudo mv release-v1.7.0-${ARCH}/jailer-v1.7.0-${ARCH} /usr/local/bin/jailer
sudo chmod +x /usr/local/bin/firecracker /usr/local/bin/jailer
firecracker --versionPastikan verifikasi versi menampilkan keluaran Firecracker v1.7.0.
4. Penyediaan Linux Kernel Minimalis & Root Filesystem (RootFS)
Firecracker tidak menggunakan BIOS/UEFI tradisional atau bootloader GRUB. Firecracker memuat uncompressed Linux kernel binary (vmlinux) secara langsung ke memori dan memasang root filesystem berformat ext4.
mkdir -p ~/firecracker-workspace && cd ~/firecracker-workspace
# Unduh Kernel Linux uncompressed vmlinux (khusus dikompilasi untuk Firecracker)
curl -fsSL -o vmlinux https://s3.amazonaws.com/spec.ccfc.min/firecracker-ci/v1.7.0/x86_64/vmlinux-5.10.198
# Unduh image RootFS minimalis Ubuntu 22.04 LTS
curl -fsSL -o rootfs.ext4.xz https://s3.amazonaws.com/spec.ccfc.min/firecracker-ci/v1.7.0/x86_64/ubuntu-22.04.ext4.xz
unxz rootfs.ext4.xzKustomisasi dan Prep RootFS (Opsional)
Jika ingin menambahkan file, skrip sandbox, atau konfigurasi user ke dalam image rootfs sebelum dijalankan, mounting image tersebut via loop device:
mkdir -p /tmp/my-rootfs
sudo mount -o loop rootfs.ext4 /tmp/my-rootfs
# Lakukan modifikasi file pada /tmp/my-rootfs di sini jika diperlukan
sudo umount /tmp/my-rootfs5. Konfigurasi Network Topology: TAP Interface & IPTables NAT
Untuk menghubungkan guest MicroVM ke internet luar via host VPS, konfigurasi antarmuka TAP (Network Tap) dan aturan IP Forwarding dengan IPTables.
# 1. Buat TAP Interface pada host
sudo ip tuntap add dev tap0 mode tap
sudo ip addr add 172.16.0.1/24 dev tap0
sudo ip link set tap0 up
# 2. Aktifkan IP Forwarding pada Host Kernel
sudo sysctl -w net.ipv4.ip_forward=1
# 3. Dapatkan nama interface utama host yang terhubung ke internet
MAIN_IF=$(ip route show default | awk '/default/ {print $5}')
# 4. Buat aturan Network Address Translation (NAT) via IPTables
sudo iptables -t nat -A POSTROUTING -o $MAIN_IF -j MASQUERADE
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i tap0 -o $MAIN_IF -j ACCEPTTopologi jaringan ini menetapkan host sebagai gateway pada IP 172.16.0.1 dan mengalokasikan IP static guest MicroVM pada 172.16.0.2.
6. Otomatisasi & Kontrol MicroVM via REST API (Unix Socket)
Firecracker tidak memiliki GUI maupun CLI interaktif bawaan untuk mengatur VM. Seluruh konfigurasi resource, disk, network, dan eksekusi diproses melalui REST API berbasis HTTP di atas Unix Domain Socket.
Tahap 1: Inisialisasi Firecracker Daemon
Buka Terminal 1, lalu jalankan daemon Firecracker untuk membuka Unix socket:
rm -f /tmp/firecracker.sock
firecracker --api-sock /tmp/firecracker.sockTahap 2: Konfigurasi via Unix Domain Socket
Buka Terminal 2, jalankan serangkaian perintah cURL untuk mengonfigurasi parameter Boot Source, Root Drive, Network Interface, Resource Limiter, dan mengeksekusi VM.
1. Konfigurasi Boot Source (Kernel & Parameter Booting)
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/boot-source' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"kernel_image_path": "'$(pwd)'/vmlinux",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off ip=172.16.0.2::172.16.0.1:255.255.255.0::eth0:off"
}'Parameter boot_args mematikan pci, mengonfigurasi serial output ke ttyS0, dan mengatur konfigurasi IP statis langsung dari parameter inisialisasi kernel.
2. Konfigurasi Storage Root Drive
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/drives/rootfs' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"drive_id": "rootfs",
"path_on_host": "'$(pwd)'/rootfs.ext4",
"is_root_device": true,
"is_read_only": false
}'3. Konfigurasi Antarmuka Jaringan TAP
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/network-interfaces/eth0' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"iface_id": "eth0",
"guest_mac": "AA:FC:00:00:00:01",
"host_dev_name": "tap0"
}'4. Alokasi Resource Hardware (CPU & Memori)
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/machine-config' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"vcpu_count": 2,
"mem_size_mib": 1024,
"smt": false
}'5. Jalankan Instance MicroVM
curl --unix-socket /tmp/firecracker.sock -i \
-X PUT 'http://localhost/actions' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"action_type": "InstanceStart"
}'Kembali ke Terminal 1. Anda akan melihat log booting kernel Linux selesai secara instan dan shell login Ubuntu siap digunakan. Login standar image tersebut adalah user root dengan password root.
7. Hardening Production: Enkapsulasi Jailer, Seccomp, & Rate Limiting
Menjalankan biner firecracker langsung secara manual tidak direkomendasikan untuk lingkungan produksi multi-tenant. AWS menyediakan komponen pembungkus keamanan khusus bernama jailer.
Penggunaan Execution Wrapper: Jailer
Biner jailer mengisolasi proses Firecracker itu sendiri sebelum proses VM diinisialisasi. Jailer menerapkan lapisan keamanan berikut:
- Chroot Jail: Mengurung akses sistem berkas Firecracker ke direktori terisolasi khas
/srv/jailer/firecracker/<id>/root. - Cgroups v1/v2 Control: Membatasi penggunaan total CPU dan memori host dari proses hipervisor itu sendiri.
- User & Group ID Dropping: Menurunkan hak akses proses dari
rootke user non-privileged (misal UID/GID 10001). - Seccomp BPF Filtering: Membatasi sistem panggilan (syscall) yang boleh dipanggil oleh biner Firecracker ke host kernel.
Contoh eksekusi Firecracker menggunakan Jailer:
sudo jailer --id microvm-sandbox-1 \
--exec-file /usr/local/bin/firecracker \
--uid 10001 --gid 10001 \
--chroot-base-dir /srv/jailerKonfigurasi Rate Limiting IOPS & Bandwidth Jaringan
Untuk mencegah eksekusi untrusted code melakukan serangan Denial of Service (DoS) pada I/O disk host atau menghabiskan bandwidth jaringan, Firecracker menyediakan fitur pembatasan berbasis Token Bucket Algorithm via API payload.
Contoh konfigurasi pembatasan I/O disk pada payload `/drives/rootfs`:
{
"drive_id": "rootfs",
"path_on_host": "/path/to/rootfs.ext4",
"is_root_device": true,
"is_read_only": false,
"rate_limiter": {
"bandwidth": {
"size": 10485760,
"one_time_burst": 20971520,
"refill_time": 1000
},
"ops": {
"size": 500,
"one_time_burst": 1000,
"refill_time": 1000
}
}
}Konfigurasi di atas membatasi throughput baca/tulis disk hingga maksimum 10 MB/s (dengan burst 20 MB) dan 500 operasi I/O per detik (IOPS).
Ephemeral Storage & Copy-on-Write (CoW) Layer
Untuk menjaga kestabilan lingkungan sandbox, jangan pernah membiarkan microVM mengubah image master rootfs.ext4 secara langsung. Gunakan strategi Ephemeral Storage berbasis snapshot atau Copy-on-Write (CoW):
- Simpan satu master image
rootfs.ext4berstatus read-only. - Saat request sandbox baru masuk, buat copy ephemeral terisolasi menggunakan
cp --reflink=auto(pada filesystem Btrfs/XFS) atau gunakan Device Mapper / OverlayFS. - Hubungkan Firecracker ke file ephemeral tersebut.
- Hapus file ephemeral segera setelah proses microVM dimatikan (InstanceStop).
8. Ringkasan Best Practice Production Checklist
- Hardware Support: Pastikan VPS mendukung bare-metal atau KVM Nested Virtualization.
- Isolasi Proses Host: Gunakan biner
jaileruntuk mengeksekusi biner Firecracker di lingkungan produksi. Jangan menjalankan proses langsung sebagai root tanpa chroot/cgroups. - Manajemen Storage: Terapkan ephemeral storage berbasis Copy-on-Write (CoW) dan batasi IOPS disk per instance.
- Manajemen Network: Gunakan namespace jaringan unik atau TAP device terpisah per tenant serta terapkan iptables rate-limiting / eBPF filtering.
- Orkestrasi Otomatis: Untuk skala besar, hindari skrip cURL manual. Manfaatkan SDK pustaka bahasa (seperti Firecracker Go SDK atau Rust SDK) atau orchestrator tingkat atas seperti Weaveworks Ignite.


