Belajar LXC - AppArmor, SELinux & seccomp
Series/Belajar LXC/Episode 13
Episode 13 of 23

Belajar LXC - AppArmor, SELinux & seccomp

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.

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

Pendahuluan

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.

Mandatory Access Control: AppArmor dan SELinux

Apa Itu MAC

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.

AppArmor: Profil per Container

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:

LinuxAppArmor di config container
lxc.apparmor.profile = generated
  • generated (default) — LXC membuat profil khusus per container.
  • lxc-container-default — memakai profil default global.
  • Nama profil kustom — jika kalian menulis profil sendiri di /etc/apparmor.d/.

Lihat profil yang sedang dipakai:

Cek profil AppArmor container
cat /proc/<container_pid>/attr/current

SELinux: Konteks dan Policy

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

Cek konteks SELinux dari container (Fedora)
lxc-attach -n c1 -- id -Z

Note

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

Konsep

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.

Konfigurasi via lxc.seccomp.profile

LXC memberi policy seccomp default, dan bisa diperluas lewat lxc.seccomp.profile di config container:

LinuxAktifkan profil seccomp
lxc.seccomp.profile = /etc/lxc/seccomp/custom.profile

Format file profil seccomp LXC (sintaks arsitektur + aturan):

Linux/etc/lxc/seccomp/custom.profile
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.

Kasus Nyata: Memperbarui Profile untuk Docker-in-LXC

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:

  1. Perbarui AppArmor profile LXC untuk mengizinkan operasi yang dibutuhkan (misal menambahkan aturan mount tertentu), atau pakai profil khusus Docker yang direkomendasikan dokumentasi resmi.
  2. Longgarkan seccomp hanya pada syscall yang diperlukan Docker (misal mount, unshare, setns), bukan seluruh profil.
  3. Uji docker run hello-world dari dalam CT; jika masih error, periksa audit log:
Lihat penolakan AppArmor di audit log
sudo journalctl -k | grep -i apparmor | grep -i denied
sudo ausearch -m avc 2>/dev/null | tail -20

Tip

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.

Mendiagnosis Penolakan Keamanan

Saat sesuatu "gagal misterius" di dalam container, cek dulu tiga lapis:

  1. dmesg/journal untuk penolakan AppArmor atau SELinux.
  2. Log seccomp untuk syscall yang di-kill.
  3. lxc-attach -n c1 -- dmesg | tail dari dalam container.
Cek penolakan di host
sudo dmesg | grep -iE "apparmor|selinux|seccomp" | tail -20

Penutup

Inti yang harus dibawa pulang:

  • AppArmor (Ubuntu) dan SELinux (Fedora/RHEL) memberi MAC per-container — jangan dinonaktifkan.
  • lxc.apparmor.profile memilih profil; generated adalah default aman.
  • seccomp membatasi syscall; lxc.seccomp.profile mengaktifkan policy kustom.
  • Whitelist lebih ketat, blacklist lebih fleksibel.
  • Docker-in-LXC butuh update profile AppArmor dan seccomp yang terkendali, bukan menonaktifkan keamanan.

Di episode 14 selanjutnya kita akan membahas capabilities & device controllxc.cap.drop dan lxc.cap.keep untuk least privilege, lxc.aa_profile, pembatasan akses device via cgroup devices, serta passthrough GPU/USB.

Belajar LXC - AppArmor, SELinux & seccomp | Belajar LXC