AizuDemy

Tutorial Firecracker MicroVM: Deploy Server Sandbox Terisolasi di VPS

Tutorial Firecracker MicroVM: Deploy Server Sandbox Terisolasi di VPS
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 8 mnt baca baca
โšก TL;DR

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).
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

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/kvm

Output 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/kvm

Perintah 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 --version

Pastikan 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.xz

Kustomisasi 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-rootfs

5. 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 ACCEPT

Topologi 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.sock

Tahap 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 root ke 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/jailer

Konfigurasi 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):

  1. Simpan satu master image rootfs.ext4 berstatus read-only.
  2. Saat request sandbox baru masuk, buat copy ephemeral terisolasi menggunakan cp --reflink=auto (pada filesystem Btrfs/XFS) atau gunakan Device Mapper / OverlayFS.
  3. Hubungkan Firecracker ke file ephemeral tersebut.
  4. 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 jailer untuk 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.

๐Ÿ“– Artikel Terkait