SELinux melabeli setiap objek dan memutuskan akses dari pasangan label — teliti, tetapi kebijakannya berbahasa mesin. AppArmor memilih filosofi sebaliknya: kebijakan per aplikasi yang ditulis sebagai daftar jalur file — /var/backup/** rw — sehingga sebuah profil bisa dibaca seperti daftar izin yang ditulis manusia. Kombinasi itu membuatnya jadi pilihan bawaan Ubuntu dan SUSE, dan sejak Debian 10 juga aktif secara default di Debian. Mesin latihan kita tidak menjalankan daemon AppArmor, jadi profil kita tulis sebagai file fixture dengan sintaks aslinya, pencocokan jalurnya kita simulasikan di bash, dan alat sungguhan (aa-status, aa-complain, aa-logprof) kita bahas sebagai panduan.

Dua Cara Memandang MAC: Label dan Jalur #

AppArmor juga merupakan MAC: kernel yang sama-sama memakai hook LSM untuk menolak operasi, tanpa peduli permission DAC. Bedanya sumber kebenaran kebijakan. SELinux bertanya “apa label proses dan label objek ini?”; AppArmor bertanya “jalur program mana yang sedang berjalan, dan apa kata profilnya tentang jalur file itu?”. Tiap pendekatan menang di medan yang berbeda:

AspekSELinuxAppArmor
Dasar keputusanlabel yang menempel pada objek (inode)jalur file yang tertulis di profil aplikasi
Cakupan alamiseluruh objek sistemaplikasi yang diberi profil
Wujud kebijakanpolicy biner + database labelfile teks per aplikasi di /etc/apparmor.d/
Cara membuat kebijakananalisis denial, audit2allowmode complain + aa-logprof
Rumah asliRHEL, Fedora, AndroidUbuntu, SUSE, Debian
Titik lemahlabel bisa “salah” saat file dipindahprogram yang disalin ke jalur lain lolos dari profilnya

Anatomi Profil #

Profil tinggal di /etc/apparmor.d/, dan nama filenya mencerminkan program yang dikurungnya: profil untuk /usr/bin/backup disimpan sebagai usr.bin.backup — garis miring diganti titik. Kita tulis profil tersebut dengan sintaks aslinya:

bash
cat > usr.bin.backup <<'AKHIR'
#include <tunables/global>

profile backup /usr/bin/backup flags=(complain) {
  #include <abstractions/base>

  /usr/bin/backup mr,
  /var/backup/** rw,
  /etc/backup/** r,

  capability dac_read_search,
  network inet stream,
}
AKHIR
cat usr.bin.backup

Output yang Dihasilkan:

text
#include <tunables/global>

profile backup /usr/bin/backup flags=(complain) {
  #include <abstractions/base>

  /usr/bin/backup mr,
  /var/backup/** rw,
  /etc/backup/** r,

  capability dac_read_search,
  network inet stream,
}

Kita bedah profil di atas baris per baris:

  1. #include <tunables/global>: kamus variabel seperti @{HOME} agar profil portabel antar sistem.
  2. profile backup /usr/bin/backup flags=(complain): profil bernama backup menempel pada program /usr/bin/backup — program inilah yang dikurung; flags=(complain) berarti mode belajar: pelanggaran dicatat, tidak ditolak.
  3. #include <abstractions/base>: paket izin dasar (misalnya membaca pustaka sistem) yang dibutuhkan hampir semua program — mirip pustaka fungsi.
  4. /usr/bin/backup mr,: program boleh membaca dan memetakan dirinya sendiri ke memori (r baca, m mmap) — pola klasik untuk binary.
  5. /var/backup/** rw,: glob ** menembus kedalaman folder berapa pun; hasil backup boleh dibaca dan ditulis.
  6. /etc/backup/** r,: file konfigurasi hanya boleh dibaca.
  7. capability dac_read_search,: hak khusus kernel untuk membaca file yang permission-nya ketat — alat backup memang butuh itu, dan hanya itu.
  8. network inet stream,: boleh membuka socket TCP IPv4, misalnya untuk mengirim hasil ke server pusat.

Setiap aturan ditutup koma, dan hanya yang tertulis yang boleh — sisanya ditolak.

Cara Kernel Memutuskan #

Pencocokan pola jalur itulah inti keputusan AppArmor, dan kita bisa menirunya di bash:

bash
cat > izin-backup <<'AKHIR'
/usr/bin/backup mr
/var/backup/** rw
/etc/backup/** r
AKHIR
cek_akses() {
  target="$1" hak="$2"
  while read -r pola izin; do
    if [[ "$target" == $pola && "$izin" == *"$hak"* ]]; then
      printf '%-26s %-2s BOLEH (cocok %s)\n' "$target" "$hak" "$pola"
      return 0
    fi
  done < izin-backup
  printf '%-26s %-2s DITOLAK\n' "$target" "$hak"
}
cek_akses /usr/bin/backup m
cek_akses /var/backup/harian.tar w
cek_akses /etc/backup/backup.conf r
cek_akses /etc/shadow r

Output yang Dihasilkan:

text
/usr/bin/backup            m  BOLEH (cocok /usr/bin/backup)
/var/backup/harian.tar     w  BOLEH (cocok /var/backup/**)
/etc/backup/backup.conf    r  BOLEH (cocok /etc/backup/**)
/etc/shadow                r  DITOLAK

Kita bedah simulasi di atas:

  1. Baris 1-5 (cat > izin-backup): daftar izin profil, diambil dari tiga aturan jalur di atas.
  2. [[ "$target" == $pola ... ]]: pola tidak dikutip sehingga dibaca sebagai glob — ** cocok untuk /var/backup/harian.tar dan seterusnya, persis perilaku AppArmor.
  3. return 0: aturan pertama yang cocok menang, seperti verdict pertama di chain firewall.
  4. printf ... DITOLAK: tidak ada aturan yang cocok — /etc/shadow memang tidak pernah disebut profil, jadi aksesnya ditolak. Pada AppArmor sungguhan, penolakan seperti ini tercatat ke log kernel.

Mode, Tools, dan Alur Kerja #

Dua mode bekerja pada profil: enforce menolak pelanggaran, complain hanya mencatat — persis pasangan enforcing/permissive di SELinux. aa-status memberi gambaran seluruh sistem. Berikut contoh tampilannya di server Ubuntu:

text
apparmor module is loaded.
42 profiles are loaded.
40 profiles are in enforce mode.
2 profiles are in complain mode.
42 processes have profiles defined.
40 processes have profiles in enforce mode.
2 processes have profiles in complain mode.
   /usr/bin/backup (6123) backup (complain)
   /usr/sbin/mysqld (2544) mysqld

Profil dipindahkan antar mode dengan sudo aa-complain /usr/bin/backup dan sudo aa-enforce /usr/bin/backup — keduanya hanya menulis atau menghapus flags=(complain) di file profil, lalu memuat ulang kebijakannya. Alur kerja membangun profil untuk aplikasi baru: mulai dari profil kosong di mode complain, jalankan skenario normal aplikasi, lalu sudo aa-logprof membaca denial yang tercatat dan mengusulkan aturan satu per satu untuk kita setujui. Setelah profilnya lengkap, naikkan ke enforce.

Ubuntu, Debian, dan Snap #

Ubuntu memasang profil untuk banyak daemon sejak awal, dan snap lebih jauh lagi: setiap aplikasi snap otomatis dikurung profil AppArmor yang dibuat snapd — sandaran sistem confinement snap. Di Debian, AppArmor aktif bawaan sejak Debian 10 dengan sekumpulan profil siap pakai; daftarnya terlihat dari isi /etc/apparmor.d/.

AppArmor dan SELinux sama-sama menjaga proses tetap di jalur yang dibolehkan kebijakannya. Tetapi keduanya tidak menjawab satu pertanyaan: bagaimana kita tahu bila file penting justru sudah berubah diam-diam? Chapter berikutnya memasang alarm itu — integritas file.

Referensi lanjut: wiki Debian tentang AppArmor untuk statusnya di Debian, wiki Arch Linux tentang AppArmor untuk contoh profil dan alur aa-logprof, serta dokumentasi server Ubuntu untuk panduan resminya.