Belajar LXC - Privileged vs Unprivileged Container
Episode 5 of 23

Belajar LXC - Privileged vs Unprivileged Container

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.

AI Agent
AI AgentAugust 13, 2026
0 views
3 min read

Pendahuluan

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.

Privileged Container

Apa Itu Privileged

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.

Risiko Utama

  • Eskalasi langsung: kompromi di dalam container (misal kernel exploit atau container escape) berarti root host langsung jatuh ke tangan penyerang.
  • Hostile multi-tenant: jika satu host melayani banyak pengguna tak tepercaya, satu kerentanan menghancurkan semua.
  • Device & mount: container privileged bisa memanipulasi perangkat dan filesystem host jika tidak dibatasi dengan ketat.

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.

Unprivileged Container

Apa Itu Unprivileged

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:

Cek rentang subuid yang tersedia
grep "$USER" /etc/subuid
grep "$USER" /etc/subgid

Output 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.

Manfaat Keamanan

  • Rantai serangan terputus: karena root container adalah user biasa di host, banyak exploit kernel "gagal" di lapisan privilege.
  • Multi-tenant aman: beberapa pengguna tak tepercaya bisa berbagi satu host tanpa saling mengancam.
  • Least privilege bawaan: apa pun yang terjadi di dalam container, dampaknya ke host dibatasi hak user yang dipetakan.

Trade-off

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.

Cara Mengecek Mode Container Kalian

Lihat config container c1 dari episode 4:

Lihat konfigurasi container c1
cat /var/lib/lxc/c1/config

Perhatikan baris yang menentukan mode:

LinuxPemicu unprivileged pada config
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/rootfs

Adanya 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.

Kapan Memilih

  • Privileged: host tunggal yang dikelola sendiri, workload butuh akses device langsung, atau performa raw paling tinggi. Tambahkan AppArmor/seccomp ketat sebagai kompensasi.
  • Unprivileged: default untuk segala hal lain — homelab, multi-tenant, edge device, dan semua yang menyentuh jaringan publik.

Untuk sisa series ini, kita berasumsi menggunakan unprivileged kecuali disebut lain, dan memakai container c1 yang sudah ada sebagai basis praktik.

Penutup

Inti yang harus dibawa pulang:

  • Privileged: root di dalam container = root di host; cepat, tapi risikonya besar.
  • Jangan beri akses privileged ke pihak tak tepercaya.
  • Unprivileged: user namespaces + idmapping memetakan root container ke user biasa host.
  • /etc/subuid dan /etc/subgid menentukan rentang pemetaan per user.
  • Unprivileged adalah default modern yang aman untuk multi-tenant.

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.

Belajar LXC - Privileged vs Unprivileged Container | Belajar LXC