Episode ini membandingkan dua mode container: privileged yang cepat namun berisiko karena root di dalamnya setara root di host, dan unprivileged yang memakai user namespaces serta idmapping (subuid/subgid) sehingga aman untuk multi-tenant.

Di episode 4 container pertama c1 kalian berjalan. Tapi pertanyaannya: container itu berjalan sebagai privileged atau unprivileged? Perbedaan dua mode ini adalah keputusan keamanan paling mendasar dalam LXC. Di episode 5 kita membedah keduanya: mengapa privileged berbahaya, bagaimana unprivileged memakai user namespaces dan idmapping, dan kapan masing-masing layak dipakai.
Container privileged berjalan langsung sebagai root di host tanpa pemetaan user. Artinya UID 0 di dalam container adalah UID 0 di host, dengan semua kemampuan yang melekat padanya. LXC mencoba mengurangi risiko dengan AppArmor dan seccomp default (episode 13), tetapi batas isolasi tetap tipis.
Keunggulannya kecepatan dan kesederhanaan: tidak ada lapisan idmapping, akses ke device (misal /dev/loop*, kernel modules) bekerja langsung, dan performa I/O paling dekat dengan host. Karena itu privileged masih dipakai untuk workload yang butuh akses hardware mentah.
Warning
Aturan emasnya: jangan pernah memberikan akses privileged container kepada pihak yang tidak kalian percaya penuh. Privileged container cocok untuk infrastruktur yang dikelola sendiri dalam satu trust domain — bukan untuk tenant publik.
Container unprivileged adalah default modern LXC. Ia memakai user namespaces untuk memetakan UID/GID di dalam container ke UID/GID tidak berbahaya di host. Root di dalam container (UID 0) dipetakan ke user biasa di host — misal UID 100000 — sehingga tindakan yang dianggap "sebagai root" di dalam container tetap berjalan dengan privilege user biasa dari sudut pandang host.
Kita lihat pemetaannya nanti secara detail di episode 15, tapi intinya begini:
grep "$USER" /etc/subuid
grep "$USER" /etc/subgidOutput tipikal: devnull:100000:65536 — artinya UID 0-65535 di dalam container dipetakan ke UID 100000-165535 di host. Setiap container bisa mendapat rentang yang berbeda.
Unprivileged punya biaya kecil: akses ke beberapa perangkat host dibatasi, dan kasus-kasus tertentu (bind-mount dengan permission aneh, atau akses hardware langsung) butuh konfigurasi ekstra. Performa murni hampir sama — user namespaces tidak menambah overhead runtime yang berarti setelah container berjalan.
Lihat config container c1 dari episode 4:
cat /var/lib/lxc/c1/configPerhatikan baris yang menentukan mode:
lxc.include = /usr/share/lxc/config/common.conf.d/00-lxcfs.conf
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.include = /usr/share/lxc/config/ubuntu.userns.conf
lxc.rootfs.path = dir:/var/lib/lxc/c1/rootfsAdanya include ubuntu.userns.conf menandakan container berjalan unprivileged. Sebaliknya, tanpa include userns (dan tanpa lxc.idmap), container berjalan privileged. Kalian juga bisa melihatnya saat runtime: file yang di-create root di dalam container akan tampak dimiliki UID besar (misal 100000) jika dilihat dari host.
Tip
Cek cepat: dari host, jalankan ls -n /var/lib/lxc/c1/rootfs/. Jika pemilik file tampak sebagai angka besar seperti 100000, container itu unprivileged. Jika 0, berarti privileged.
Untuk sisa series ini, kita berasumsi menggunakan unprivileged kecuali disebut lain, dan memakai container c1 yang sudah ada sebagai basis praktik.
Inti yang harus dibawa pulang:
/etc/subuid dan /etc/subgid menentukan rentang pemetaan per user.Di episode 6 selanjutnya kita akan membahas networking: bridge, veth & NAT — bagaimana lxcbr0 menjadi jembatan NAT default, cara kerja veth pairs, konfigurasi di /etc/lxc/default.conf dan /etc/lxc/lxc-usernet, serta mode network none, veth, macvlan, dan phys beserta static IP/DHCP.