Anatomi Ancaman: Lateral Pivot dan Metadata Poisoning
- Cloud Metadata Extraction: Mengakses endpoint link-local
169.254.169.254untuk mencuri IAM role bare-metal instance atau gateway proxy. - Lateral Network Scanning: Mengirimkan paket probe TCP SYN/ARP spoofing ke subnet internal host lain melalui jembatan bridge Linux lokal.
- C2 Beaconing via Egress Tersembunyi: Membangun tunnel terenkripsi ke command-and-control server menggunakan port umum seperti UDP/443 (QUIC) atau TCP/80.
TEXT
+--------------------------------------------------------------------------+
| BARE-METAL HOST (Linux Kernel 6.8+ / cgroup v2) |
| |
| +---------------------------+ +--------------------------------+ |
| | Firecracker microVM (VM1) | | Unprivileged LXC (Tenant B) | |
| | UID Mapping: 100000 | | UID Mapping: 200000 | |
| | +-------------------+ | | +------------------------+ | |
| | | App + SPIRE Agent | | | | App + Spiffe Helper | | |
| | +---------+---------+ | | +-----------+------------+ | |
| +-------------|-------------+ +---------------|----------------+ |
| | /tmp/agent.sock (UDS bind-mount) | |
| v v |
| +---------------------------+ +--------------------------------+ |
| | SPIRE Server Node Agent | | Kernel tc-bpf / nftables | |
| | Attestation: PID + cgroup | | Strict Egress Drop Rules | |
| +-------------+-------------+ +---------------+----------------+ |
| | | |
| v v |
| tap-vm1 (veth) tap-lxc (veth) |
| +------------------+------------------+ |
| v |
| br-isolated (Bridge tanpa ARP/DHCP) |
| | |
| v |
| [ eBPF Redirection & Egress Gateway ] |
+-----------------------------------|--------------------------------------+
v
Internet / Public APIsIsolasi Egress pada Linux TAP Interface via nftables
nftables atomik begitu microVM diinisialisasi.
Berikut konfigurasi /etc/nftables/microvm-egress.nft yang membatasi egress hanya ke resolver DNS internal terpercaya dan memblokir seluruh akses ke subnet privat internal serta endpoint metadata cloud:
TEXT
table inet microvm_filter {
set allowed_dns {
type ipv4_addr
elements = { 10.0.0.53, 1.1.1.1 }
}
chain vm_egress {
type filter hook prerouting priority mangle; policy drop;
# Blokir keras Cloud Metadata Service (AWS/GCP/Azure link-local)
ip daddr 169.254.169.254 drop
# Izinkan paket established/related (jawaban dari koneksi sah)
ct state established,related accept
# Izinkan DNS hanya ke IP resolver resmi
ip daddr @allowed_dns udp dport 53 accept
ip daddr @allowed_dns tcp dport 53 accept
# Blokir akses ke subnet internal hybrid (RFC 1918) kecuali gateway
ip daddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } drop
# Izinkan egress HTTPS ke internet publik via TLS (Port 443)
tcp dport 443 ct state new accept
# Drop dan log seluruh paket mencurigakan lainnya
log prefix '[NFT-EGRESS-BLOCKED]: ' flags all counter drop
}
}BASH
nft -f /etc/nftables/microvm-egress.nftEliminasi Kredensial Statis: SPIFFE/SPIRE Workload Attestation
/etc/spire/agent.conf pada host bare-metal:
TEXT
agent {
data_dir = '/var/lib/spire/data'
log_level = 'INFO'
server_address = 'spire-server.internal.infra'
server_port = 8443
socket_path = '/run/spire/sockets/agent.sock'
trust_bundle_path = '/etc/spire/bundle.crt'
trust_domain = 'infra.internal'
}
plugins {
NodeAttestor 'join_token' {}
KeyManager 'disk' {
plugin_data {
directory = '/var/lib/spire/data'
}
}
WorkloadAttestor 'unix' {
plugin_data {
discover_workload_path = true
}
}
WorkloadAttestor 'cgroup' {
plugin_data {
cgroup_root = '/sys/fs/cgroup'
}
}
}pid dan mnt), memvalidasi bahwa proses tersebut memang benar berjalan di dalam cgroup microVM milik tenant terkait sebelum menyerahkan token X.509 berumur pendek (TTL 15 menit).
Hardening Kernel Host untuk Micro-Virtualization
/etc/sysctl.d/99-microvm-security.conf:
TEXT
# Matikan source routing IP demi mencegah paket spoofing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Aktifkan Strict Reverse Path Filtering (Strict Mode: 1)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Matikan ICMP Redirect acceptance & sending
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Batasi unprivileged eBPF untuk mencegah kernel memory probe dari host container
kernel.unprivileged_bpf_disabled = 1
net.core.bpf_jit_harden = 2
# Tingkatkan kapasitas koneksi bridge dan antrean network packet
net.core.netdev_max_backlog = 16384
net.core.somaxconn = 8192BASH
sysctl -p /etc/sysctl.d/99-microvm-security.confPerbandingan Solusi Manajemen Akses & Egress
| Metode Kontrol Identitas & Egress | Overhead Latensi Jaringan | Konsumsi Memori Host | Vektor Keamanan Sisa | Kompleksitas Operasional |
|---|---|---|---|---|
| Static SSH Keys + Open NAT Bridge | Negligible (< 0.05 ms) | ~2 MB per VM | Lateral pivot, MITM, key theft | Sangat Rendah |
| OpenVPN/WireGuard Sidecar + PAM LDAP | Tinggi (1.8 - 4.2 ms) | ~64 MB per VM | Long-lived certs, LDAP bottleneck | Sedang |
| HashiCorp Vault Agent (Dynamic Secret) | Rendah (0.2 - 0.5 ms) | ~32 MB per VM | Disk token leak, secret polling | Tinggi |
| SPIFFE/SPIRE (mTLS) + Kernel eBPF/nft | Sangat Rendah (< 0.1 ms) | ~8 MB per Host Agent | Tidak ada kredensial disk, zero-trust | Menengah-Tinggi |
Otomasi Inisialisasi Interface dan Tap Firecracker
launch-tenant-microvm.sh):
BASH
#!/usr/bin/env bash
set -euo pipefail
TENANT_ID='tenant-402'
TAP_DEV="tap-${TENANT_ID}"
CGROUP_PATH="/sys/fs/cgroup/microvms/${TENANT_ID}"
FIRECRACKER_SOCKET="/tmp/firecracker-${TENANT_ID}.socket"
echo '[*] Membuat namespace cgroup v2...'
mkdir -p "${CGROUP_PATH}"
echo '+memory +pids +cpu' > /sys/fs/cgroup/microvms/cgroup.subtree_control
echo '1024M' > "${CGROUP_PATH}/memory.max"
echo '100' > "${CGROUP_PATH