Belajar LXC - User Namespaces & ID Mapping
Series/Belajar LXC/Episode 15
Episode 15 of 23

Belajar LXC - User Namespaces & ID Mapping

Episode ini membedah inti keamanan unprivileged container: file /etc/subuid dan /etc/subgid, konfigurasi pemetaan UID/GID lewat lxc.idmap, kuota network lxc-usernet, dan best practice pemetaan rentang 0-65536 di lingkungan tepercaya.

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

Pendahuluan

Di episode 5 kita memperkenalkan unprivileged container secara umum. Sekarang kita membedah mekanisme yang membuatnya aman: user namespaces dan ID mapping (idmap). Inilah alasan mengapa root di dalam container tidak berbahaya di host — dan inilah yang perlu kalian pahami saat bind-mount terasa "aneh", atau saat ingin menyesuaikan pemetaan untuk berbagi file dengan host. Di episode 15 kita turun ke detailnya.

Fondasi: User Namespaces dan Pemetaan

Kenapa Pemetaan Diperlukan

Di dalam container unprivileged, UID 0 (root) hanyalah tampilan lokal. Di host, UID itu sebenarnya dipetakan ke angka besar (misal 100000) milik user biasa. Karena pemetaan ini, "root" di container tidak memiliki kekuatan root host — ia bekerja dengan hak user biasa saat menyentuh sumber daya host.

Pemetaan dilakukan satu arah: UID container → UID host. Rentang ini didefinisikan dua kali: sekali di /etc/subuid//etc/subgid (jatah sistem untuk user), dan sekali di config container lewat lxc.idmap.

File /etc/subuid dan /etc/subgid

File ini menentukan jatah sub-UID dan sub-GID untuk tiap user — rentang angka yang boleh dipakai untuk container unprivileged:

Linux/etc/subuid
root:100000:65536
devnull:165536:65536

Formatnya: <user>:<base>:<count>. Baris devnull:165536:65536 berarti user devnull boleh memakai UID 165536 hingga 165536+65536-1 untuk container-nya. Setiap container yang dimiliki user tersebut memakai potongan dari rentang ini.

Cek jatah kalian:

Cek jatah subuid dan subgid
grep "$USER" /etc/subuid
grep "$USER" /etc/subgid

Warning

Jika /etc/subuid dan /etc/subgid kosong untuk user kalian, container unprivileged tidak akan bisa dibuat — atau dibuat namun gagal start dengan error idmap. Tambahkan barisnya (misal sudo usermod --add-subuids 100000-165535 $USER) sebelum mulai. Ini adalah penyebab nomor satu kegagalan unprivileged di instalasi fresh.

Konfigurasi lxc.idmap

Format Baris

Pemetaan di dalam config container ditulis dengan lxc.idmap. Formatnya: lxc.idmap = <ttype> <nsid> <hostid> <range>.

  • ttypeu untuk UID, g untuk GID.
  • nsid — UID/GID di dalam namespace container.
  • hostid — UID/GID di host.
  • range — jumlah ID yang dipetakan berurutan.

Container unprivileged tipikal (template modern) memakai dua baris untuk UID dan dua untuk GID:

LinuxPemetaan idmap unprivileged tipikal
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536

Artinya: UID container 0-65535 dipetakan ke UID host 100000-165535. GID sama. Dengan pemetaan ini, UID 0 container = UID 100000 host, UID 1000 container = UID 101000 host.

Menyesuaikan Pemetaan

Untuk berbagi direktori dengan user host (misal UID 1000 host ingin punya file di dalam container sebagai UID 1000), kalian bisa menambahkan pemetaan:

LinuxTambahkan mapping untuk user host
lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 101001 64535
lxc.idmap = g 1001 101001 64535

Dengan pola ini, UID container 1000 dipetakan satu-ke-satu ke UID host 1000 — sehingga file milik user host 1000 bisa dibaca/ditulis langsung dari dalam container. Trik ini dipakai bersama bind-mount (episode 11) untuk berbagi data antara host dan container.

Tip

Cek pemetaan yang aktif dari dalam container: lxc-attach -n c1 -- cat /proc/self/uid_map. Baris 0 100000 65536 menunjukkan pemetaan yang sedang berlaku. Ini cara tercepat memverifikasi konfigurasi lxc.idmap kalian.

lxc-usernet: Kuota Network untuk Unprivileged

Di episode 6 kita menyentuh lxc-usernet. Kini perannya jadi jelas: user biasa tidak berhak membuat veth yang menempel ke bridge host. File /etc/lxc/lxc-usernet memberikan izin tersebut secara eksplisit — ini "jatah network" untuk user unprivileged.

Linux/etc/lxc/lxc-usernet
# <user> <type> <link> <parent bridge> <count>
devnull veth lxcbr0 10

Artinya: user devnull boleh membuat maksimal 10 veth yang terhubung ke lxcbr0. Tanpa entri ini, lxc-start container unprivileged gagal dengan "Operation not permitted" pada pembuatan network.

Best Practice Pemetaan

  • Selalu default unprivileged di lingkungan apa pun yang menyentuh jaringan atau tenant tak tepercaya.
  • Mapping 0-65536: pakai rentang 65536 (atau kelipatan) sebagai jatah per container. Template modern menetapkan ini secara otomatis; jangan sembarang mengecilkannya kecuali tahu persis konsekuensinya.
  • Satu container, satu rentang: hindari dua container berbagi rentang ID yang sama — itu merusak isolasi (keduanya "berbagi" user host yang sama).
  • Hindari privileged di lingkungan tak tepercaya: episode 5-6, 16 menegaskan ini berulang kali karena ini kesalahan paling fatal.

Checklist Sebelum Produksi

Verifikasi fondasi idmap
grep "$USER" /etc/subuid
grep "$USER" /etc/subgid
lxc-attach -n c1 -- cat /proc/self/uid_map
grep "$USER" /etc/lxc/lxc-usernet

Penutup

Inti yang harus dibawa pulang:

  • /etc/subuid dan /etc/subgid memberi jatah rentang ID untuk container unprivileged.
  • lxc.idmap memetakan UID/GID container ke host: u 0 100000 65536.
  • Pemetaan khusus bisa dipakai untuk berbagi file dengan user host (UID host 1000 ↔ UID container 1000).
  • lxc-usernet memberi kuota network (veth) untuk user biasa.
  • Best practice: unprivileged sebagai default, mapping 0-65536, hindari privileged di lingkungan tak tepercaya.

Di episode 16 selanjutnya kita akan membahas keamanan & CVE — fakta fix CVE-2026-39402 di LXC 7.0, pentingnya patch rutin, isolasi host-container, serta model ancaman: unprivileged + AppArmor + seccomp + kernel terbaru.

Belajar LXC - User Namespaces & ID Mapping | Belajar LXC