Episode ini membahas pelapis keamanan MAC LXC: profil AppArmor per-container, konteks SELinux, dan policy seccomp lewat lxc.seccomp.profile untuk membatasi syscall, termasuk memperbarui profile untuk workload seperti Docker-in-LXC.

Di episode 5 kita melihat unprivileged container membatasi privilege user. Tapi itu baru satu lapis. Di episode 13 kita menambah dua lapis berikutnya: Mandatory Access Control (MAC) dengan AppArmor/SELinux, dan seccomp untuk membatasi syscall yang bisa dipakai proses di dalam container. Ini adalah "pagar pengaman" yang menahan kerusakan bahkan ketika sesuatu di dalam container sudah bocor.
Konsepnya: bahkan proses yang berjalan sebagai root tidak bisa melakukan apa pun yang tidak diizinkan oleh policy. Berbeda dari DAC (permission klasik rwx), MAC mengikat akses ke label dan profil — bukan ke user. Kalian sudah belajar konsep privilege di episode 5; MAC adalah penjaga yang lebih tegas di atasnya.
Pada Ubuntu dan turunannya, LXC memakai AppArmor. Setiap container diberi profil yang membatasi akses file, capability, dan mount. Profil yang di-generate LXC berisi aturan default yang aman, lalu meng-overlay ke profil generik lxc-container-default.
Config container mereferensikan profil:
lxc.apparmor.profile = generatedgenerated (default) — LXC membuat profil khusus per container.lxc-container-default — memakai profil default global./etc/apparmor.d/.Lihat profil yang sedang dipakai:
cat /proc/<container_pid>/attr/currentPada distro ber-SELinux (Fedora, RHEL/CentOS), isolasi MAC dijalankan dengan SELinux, di mana tiap container mendapat konteks (label) khusus. LXC mengintegrasikan dengan policy container_t dan turunannya. Konsepnya sama — akses diikat ke label — hanya implementasinya berbeda dari AppArmor.
lxc-attach -n c1 -- id -ZNote
Pilih salah satu: distro Ubuntu/Debian memakai AppArmor, distro Fedora/RHEL memakai SELinux. Keduanya adalah MAC yang sepadan — yang penting adalah jangan menonaktifkannya. Mematikan MAC untuk "menghemat waktu" sama dengan membuka semua pintu rumah demi tidak repot membawa kunci.
seccomp membatasi syscall yang boleh dipanggil proses di dalam container. Kernel menolak syscall yang tidak diizinkan oleh policy sebelum sempat dieksekusi. Ini lapisan pertahanan terhadap exploit kernel: penyerang yang sudah masuk masih dibatasi peralatan yang bisa dipakainya.
LXC memberi policy seccomp default, dan bisa diperluas lewat lxc.seccomp.profile di config container:
lxc.seccomp.profile = /etc/lxc/seccomp/custom.profileFormat file profil seccomp LXC (sintaks arsitektur + aturan):
1
whitelist
vuname x86_64
reject_force kill
open
close
read
write
execve
...Blok whitelist artinya: hanya syscall yang terdaftar yang diizinkan; sisanya di-kill. Pendekatan ini paling ketat — cocok untuk workload yang sudah diketahui syscall-nya. Untuk fleksibilitas lebih, pakai mode blacklist dengan daftar syscall berbahaya yang diblokir.
Warning
Jangan mengaktifkan seccomp profil yang terlalu ketat untuk workload umum — container bisa berhenti dengan error syscall yang tidak jelas, atau service berjalan "tiba-tiba mati". Mulai dari policy default LXC, tambahkan pengecualian hanya yang terbukti diperlukan, dan uji menyeluruh sebelum produksi.
Ketika menjalankan Docker-in-LXC (episode 12), container LXC harus mengizinkan syscall dan operasi yang dibutuhkan runtime container Docker (seperti clone dengan flag namespace, mount, dan fitur overlayfs). Policy AppArmor default LXC sering memblokir operasi ini, dan profile seccomp default bisa terlalu ketat.
Langkah penyelesaian yang benar — bukan menonaktifkan keamanan:
mount, unshare, setns), bukan seluruh profil.docker run hello-world dari dalam CT; jika masih error, periksa audit log:sudo journalctl -k | grep -i apparmor | grep -i denied
sudo ausearch -m avc 2>/dev/null | tail -20Tip
Prinsipnya selalu sama: longgarkan secukupnya, bukan matikan. Docker-in-LXC butuh pelonggaran terbatas pada operasi container runtime — itu normal dan terdokumentasi. Yang tidak pernah disarankan adalah lxc.apparmor.profile = unconfined sembarangan, kecuali untuk lab pribadi yang risiko-nya diterima secara sadar.
Saat sesuatu "gagal misterius" di dalam container, cek dulu tiga lapis:
dmesg/journal untuk penolakan AppArmor atau SELinux.lxc-attach -n c1 -- dmesg | tail dari dalam container.sudo dmesg | grep -iE "apparmor|selinux|seccomp" | tail -20Inti yang harus dibawa pulang:
lxc.apparmor.profile memilih profil; generated adalah default aman.lxc.seccomp.profile mengaktifkan policy kustom.Di episode 14 selanjutnya kita akan membahas capabilities & device control — lxc.cap.drop dan lxc.cap.keep untuk least privilege, lxc.aa_profile, pembatasan akses device via cgroup devices, serta passthrough GPU/USB.