Episode ini membahas jailer — garis pertahanan terakhir Firecracker. Kalian akan membungkus microVM dalam namespace, cgroup, seccomp, rootfs read-only, dan user non-root, memahami flag --id, --chroot-base-dir, dan --exec-file, serta menerapkan defense-in-depth bila hypervisor ditembus.

Sejauh ini kita menjalankan Firecracker sebagai proses biasa — root, tanpa pembatasan. Di dunia nyata, itu tidak pernah cukup. Episode 7 memperkenalkan jailer: pembungkus keamanan yang mengurung proses Firecracker sehingga bila microVM di-tembus, penyerang hanya menemukan dinding kosong.
Mengapa episode ini penting? Karena seluruh klaim keamanan Firecracker — isolasi multi-tenant, workload untrusted — berdiri di atas jailer. KVM melindungi host dari guest, tapi siapakah yang melindungi host dari VMM itu sendiri? Jawabannya: jailer, dengan mekanisme isolasi Linux yang mendalam: namespace, cgroup, seccomp, rootfs read-only, dan drop privilege.
Threat model Firecracker berlapis:
Jailer adalah response yang berasumsi bahwa VMM bisa ditembus. Dengan asumsi itu, ia memastikan bahwa penetrasi VMM tidak berarti penetrasi host. Ini pola yang sama dengan container sandbox: jangan percaya bahwa bug tidak akan terjadi — desain supaya bug tidak berbahaya.
Ketika kalian menjalankan jailer --exec-file ./firecracker, jailer melakukan beberapa hal berurutan sebelum mengeksekusi Firecracker:
Hasil akhirnya: proses Firecracker hidup di dunia kecil yang tidak bisa keluar — persis tujuan jailer.
Pola dasar menjalankan microVM lewat jailer:
sudo jailer \
--id 1001 \
--exec-file /usr/local/bin/firecracker \
--uid 123 \
--gid 100 \
--chroot-base-dir /srv/jailer \
--netns /var/run/netns/fcns \
--node 0Memahami flag penting:
--id <uid> — identitas unik microVM. Jailer menggunakannya untuk membuat direktori chroot-base-dir/<id> sebagai rumah proses. Setiap VM harus punya --id berbeda.--chroot-base-dir — direktori tempat jailer membangun root baru (/srv/jailer/<id>/). File kernel, rootfs, dan socket API harus di-copy ke dalamnya agar terlihat proses.--exec-file — binary yang akan dieksekusi setelah jail (Firecracker).--uid / --gid — UID/GID non-root yang menjalankan proses. Firecracker tidak perlu root; hanya perlu akses ke /dev/kvm dan file-nya sendiri.--netns — pindahkan proses ke network namespace tertentu, memberi isolasi jaringan per VM.--node — NUMA node untuk menjepit vCPU.Setelah jailer jalan, socket API berada di /srv/jailer/<id>/run/firecracker.socket — bukan di /tmp lagi. Semua interaksi selanjutnya lewat socket di dalam chroot:
curl --unix-socket /srv/jailer/1001/run/firecracker.socket http://localhost/Important
Di dalam jail, path kernel dan rootfs harus relatif ke chroot. Setelah jailer, Firecracker melihat filesystem sebagai /srv/jailer/1001/ sebagai root /. Jadi kernel_image_path di API harus ditulis sebagai /vmlinux.bin (file yang sudah di-copy ke /srv/jailer/1001/vmlinux.bin), bukan path absolut host.
Jailer mengubah perspektif filesystem proses. Semua yang dibutuhkan Firecracker harus ada di dalam chroot:
sudo mkdir -p /srv/jailer/1001
sudo cp /home/user/fc-demo/vmlinux.bin /srv/jailer/1001/vmlinux.bin
sudo cp /home/user/fc-demo/rootfs.ext4 /srv/jailer/1001/rootfs.ext4Kemudian semua path di payload API memakai path relatif chroot:
{
"kernel_image_path": "/vmlinux.bin",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off"
}Polanya: host cp file ke chroot, API merujuk path di dalamnya. Ini juga keuntungan keamanan — proses di dalam chroot tidak bisa melihat file di luar, jadi kernel dan rootfs VM lain tidak terjangkau.
Seccomp filter Firecracker membuat whitelist syscall yang diizinkan proses. Syscall berbahaya seperti mount, ptrace, kexec, atau userfaultfd ditolak dengan error — bahkan jika penyerang berhasil mengeksekusi kode arbitrer di dalam proses.
Jailer memuat seccomp profile sesuai arsitektur host. Untuk kebutuhan khusus, profil bisa dikustomisasi, tapi prinsipnya selalu: semakin sempit whitelist, semakin kecil jangkauan penyerang. Syscall tambahan hanya ditambahkan bila benar-benar dibutuhkan workload — misalnya untuk device baru atau fitur baru.
Beberapa kebiasaan yang harus menjadi refleks:
--id: jangan pernah berbagi chroot antar VM.memory.max dan cpu.max di cgroup khusus, sehingga satu VM yang bocor memori tidak mematikan tetangganya (detail di episode 10).--uid/--gid non-root adalah prasyarat, bukan opsional.400 Bad Request atau file not found.--id duplikat: dua VM memakai --id sama → jailer menolak atau chroot bentrok./tmp: setelah jailer, socket tidak lagi di /tmp; ia ada di chroot-base-dir/<id>/run/firecracker.socket.--netns, TAP harus ada di namespace tersebut — buat TAP setelah masuk namespace atau dengan ip netns exec./dev/kvm: pastikan user non-root punya izin baca/tulis ke /dev/kvm (via group kvm misalnya).Inti yang harus dibawa pulang:
--id, --chroot-base-dir, --exec-file, --uid/--gid, --netns adalah flag inti.Di episode 8 selanjutnya kita akan menyiapkan bekal yang tepat untuk setiap microVM: MicroVM Images — Build & Optimasi Kernel — membangun rootfs minimal dengan Alpine/musl, mengonfigurasi kernel agar hanya memuat driver yang diperlukan, memilih boot params yang tepat, dan mengenal tooling seperti firectl, firecracker-containerd, NixOS microvm.nix, serta mkosi.