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.

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.
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:
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:
@{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.
@{PROC}/net/if_inet6 r,Dengan @{PROC}, aturan tetap benar walau procfs dipasang di lokasi nonstandar.
Di sinilah AppArmor menyimpan definisi variable dan pengaturan lain yang bersifat per-sistem — bukan per-aplikasi. Letaknya di /etc/apparmor.d/tunables/:
/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:
#include <tunables/global>Include bertanda kurung siku <...> memberitahu AppArmor untuk mencari file tersebut di /etc/apparmor.d/. Ini membawa kita ke mekanisme berikutnya.
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:
#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.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:
#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.
Kekuatan abstractions muncul saat kalian mulai membuatnya sendiri. Bayangkan sebuah tim yang menjalankan belasan microservice dengan pola path yang sama:
# 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:
#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.
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.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.