Belajar AppArmor - Variable, Tunables & Include
Episode 8 of 23

Belajar AppArmor - Variable, Tunables & Include

Membuat profile portabel dengan variable bawaan untuk home directory dan procfs, memahami direktori tunables, serta memanfaatkan abstractions bawaan dan kustom untuk menulis ulang aturan bersama sekali saja.

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

Pendahuluan

Di episode 7, kalian bisa memperbaiki denial dengan cepat karena sudah paham cara membaca log. Tapi perhatikan: semua profile yang kita tulis masih berisi path yang diketik manual — /var/log/myapp/*.log, /usr/sbin/nginx, dan seterusnya. Profile seperti itu hanya benar di satu mesin. Pindahkan ke sistem lain dengan home directory berbeda atau mount point procfs berbeda, dan profile mulai menolak akses yang seharusnya sah.

Episode 8 memperkenalkan tiga mekanisme yang membuat profile AppArmor portabel dan tidak duplikatif: variable, tunables, dan include. Kalian akan memakai pengetahuan debugging dari episode 7 — termasuk membaca denial dengan journalctl -k --grep=apparmor — untuk membuktikan bahwa mekanisme ini bekerja.

Variable: Menghindari Path Hardcode

Setiap pengguna punya home directory di lokasi yang berbeda — /home/alice, /home/bob, atau /root untuk root. Jika profile menulis /home/alice/.config/myapp/** r, profile itu hanya benar untuk alice. Variable menjawabnya:

LinuxVariable memakai path yang sudah disetel
owner @{HOME}/.config/myapp/** r,
@{HOME}/.local/share/myapp/** rw,

@{HOME} adalah variable bawaan yang disetel berdasarkan user yang menjalankan proses. Awalan owner membuat aturan hanya berlaku saat proses dimiliki pemilik file yang sama — pola standar untuk file konfigurasi personal.

Variable bisa didefinisikan sendiri di bagian atas profile:

LinuxMendefinisikan variable sendiri
@{CACHE_DIR}=/var/cache/myapp
 
@{CACHE_DIR}/** rw,

Penamaan dengan tanda @ membedakan variable dari path biasa. AppArmor menyediakan beberapa variable bawaan yang sering dipakai: @{PROC} untuk titik mount procfs, @{PID} untuk pid proses, dan @{sys} untuk sysfs.

LinuxVariable @{PROC} untuk aturan procfs
@{PROC}/net/if_inet6 r,

Dengan @{PROC}, aturan tetap benar walau procfs dipasang di lokasi nonstandar.

Tunables: Rumah Variable dan Pengaturan

Di sinilah AppArmor menyimpan definisi variable dan pengaturan lain yang bersifat per-sistem — bukan per-aplikasi. Letaknya di /etc/apparmor.d/tunables/:

Isi direktori tunables (contoh)
/etc/apparmor.d/tunables/
  global
  home
  home.d/
  multiarch
  proc
  sys
  local/

File kunci:

  • global — mendefinisikan variable inti seperti @{PROC} dan @{sys}. Hampir semua profile memulai dari baris yang meng-include file ini.
  • home — mendefinisikan @{HOME}; nilai pastinya disetel dari home.d.
  • proc — aturan khusus untuk procfs.
  • local/ — tempat override lokal; jangan disentuh saat upgrade.

Setiap profile yang kalian tulis dari nol harus dimulai dengan:

LinuxAwalan wajib untuk profile
#include <tunables/global>

Include bertanda kurung siku <...> memberitahu AppArmor untuk mencari file tersebut di /etc/apparmor.d/. Ini membawa kita ke mekanisme berikutnya.

Abstractions: Aturan Siap Pakai

Beberapa kelompok aplikasi butuh aturan yang hampir identik: semua program yang membaca DNS butuh akses ke resolver, semua daemon yang logging butuh akses ke /dev/log, semua aplikasi GUI butuh akses ke server grafis. Menulis ulang aturan ini di setiap profile adalah pemborosan dan sumber inkonsistensi. Solusinya adalah abstractions:

LinuxMeng-include abstractions
#include <abstractions/base>
#include <abstractions/nameservice>
  • abstractions/base — fondasi yang hampir selalu dibutuhkan: pustaka dasar, loader, path umum procfs. Anggap ini "persyaratan minimum" agar program Linux biasa berjalan.
  • abstractions/nameservice — aturan untuk DNS dan resolver. Di episode 6 kita menahan network inet udp; abstraction inilah yang biasanya menambahkannya kembali dengan aman untuk keperluan resolusi nama.
  • Masih banyak lagi: abstractions/ssl_certs, abstractions/openssl, abstractions/php, abstractions/X11, dan puluhan lainnya.

Abstractions juga membuat profile menjadi jauh lebih ringkas. Profile Nginx yang kita bahas di episode 6 dan 7 terlihat seperti ini:

LinuxProfile dengan abstraction
#include <tunables/global>
 
/usr/sbin/nginx flags=(enforce) {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/ssl_certs>
 
  network inet tcp,
  /etc/nginx/** r,
  /var/www/** r,
  /var/log/nginx/*.log w,
}

Perhatikan: kemampuan DNS datang dari nameservice, sertifikat dari ssl_certs — kalian tidak perlu menulis ulang aturan itu setiap kali membuat profile.

Abstractions Kustom untuk Tim Kalian

Kekuatan abstractions muncul saat kalian mulai membuatnya sendiri. Bayangkan sebuah tim yang menjalankan belasan microservice dengan pola path yang sama:

Linuxabstractions/mycompany/backend
# Aturan bersama untuk layanan backend mycompany
# Jangan berisi aturan khusus satu aplikasi.
 
/var/run/mycompany/** rw,
/var/lib/mycompany/** rw,
/var/log/mycompany/*.log rw,

Simpan file tersebut sebagai /etc/apparmor.d/abstractions/mycompany/backend, lalu semua profile tim tinggal meng-include-nya:

LinuxMemakai abstraction kustom
#include <abstractions/mycompany/backend>

Saat pola path berubah, kalian cukup mengubah satu file — semua profile ter-update. Catatan penting: mengubah file abstraction tidak otomatis mengubah profile yang sudah dimuat di kernel. Reload setiap profile yang meng-include-nya dengan apparmor_parser -r agar perubahan berlaku. Ini menerapkan prinsip DRY (Don't Repeat Yourself) ke dunia policy, dan menjadi fondasi untuk mengelola banyak layanan di episode 9.

Tip

Disiplin pemisahan: variable untuk nilai yang berubah antar sistem, tunables untuk definisi global, abstractions untuk kumpulan aturan yang dipakai bersama, dan profile untuk aturan spesifik satu aplikasi. Jangan mencampurnya — profile yang menumpuk abstractions terlalu banyak justru sulit dianalisis saat muncul denial.

Penutup

Pada episode 8 ini kalian sudah mengenal tiga mekanisme reuse di AppArmor: variable seperti @{HOME} dan @{PROC} yang menggantikan path hardcode, direktori tunables yang menjadi rumah definisi global, dan abstractions — bawaan maupun kustom — yang memungkinkan satu kumpulan aturan dipakai puluhan profile sekaligus.

Kunci yang harus dibawa pulang:

  • #include <tunables/global> adalah baris pertama dari hampir semua profile.
  • Variable untuk nilai dinamis, abstractions untuk aturan bersama.
  • Abstractions kustom mengubah policy menjadi kode yang bisa dikelola tim.

Dengan fondasi ini, kalian siap menghadapi layanan sungguhan. Di episode 9, kita akan menerapkan semuanya ke Web & Application Services: profile bawaan Nginx, Apache, dan OpenSSH, penyesuaian untuk web root dan SSL di lokasi kustom, profile MySQL dan PostgreSQL, serta runtime aplikasi seperti Node dan Python beserta perangkap log rotation.

Belajar AppArmor - Variable, Tunables & Include | Belajar AppArmor