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:
| Aspek | SELinux | AppArmor |
|---|---|---|
| Dasar keputusan | label yang menempel pada objek (inode) | jalur file yang tertulis di profil aplikasi |
| Cakupan alami | seluruh objek sistem | aplikasi yang diberi profil |
| Wujud kebijakan | policy biner + database label | file teks per aplikasi di /etc/apparmor.d/ |
| Cara membuat kebijakan | analisis denial, audit2allow | mode complain + aa-logprof |
| Rumah asli | RHEL, Fedora, Android | Ubuntu, SUSE, Debian |
| Titik lemah | label bisa “salah” saat file dipindah | program 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:
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.backupOutput yang Dihasilkan:
#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:
#include <tunables/global>: kamus variabel seperti@{HOME}agar profil portabel antar sistem.profile backup /usr/bin/backup flags=(complain): profil bernamabackupmenempel pada program/usr/bin/backup— program inilah yang dikurung;flags=(complain)berarti mode belajar: pelanggaran dicatat, tidak ditolak.#include <abstractions/base>: paket izin dasar (misalnya membaca pustaka sistem) yang dibutuhkan hampir semua program — mirip pustaka fungsi./usr/bin/backup mr,: program boleh membaca dan memetakan dirinya sendiri ke memori (rbaca,mmmap) — pola klasik untuk binary./var/backup/** rw,: glob**menembus kedalaman folder berapa pun; hasil backup boleh dibaca dan ditulis./etc/backup/** r,: file konfigurasi hanya boleh dibaca.capability dac_read_search,: hak khusus kernel untuk membaca file yang permission-nya ketat — alat backup memang butuh itu, dan hanya itu.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:
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 rOutput yang Dihasilkan:
/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 DITOLAKKita bedah simulasi di atas:
- Baris 1-5 (
cat > izin-backup): daftar izin profil, diambil dari tiga aturan jalur di atas. [[ "$target" == $pola ... ]]: pola tidak dikutip sehingga dibaca sebagai glob —**cocok untuk/var/backup/harian.tardan seterusnya, persis perilaku AppArmor.return 0: aturan pertama yang cocok menang, seperti verdict pertama di chain firewall.printf ... DITOLAK: tidak ada aturan yang cocok —/etc/shadowmemang 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:
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) mysqldProfil 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.