Membaca jejak denial AppArmor di syslog dan journald, memahami format apparmor DENIED, menjalankan alur debug observe-adjust-reload-verify, dan memakai aa-notify untuk notifikasi denial real-time.

Di episode 6, kalian mengetatkan profile dengan network dan capability rules — dan kemungkinan besar kalian juga langsung menuai denial di log. Itu bukan kegagalan; itu sinyal kerja. Masalahnya, banyak engineer yang menanggapi denial dengan menghapus aturan sampai error hilang, tanpa pernah tahu apa yang sebenarnya diblokir.
Episode 7 ini mengubah cara kalian menghadapi denial: bukan musuh yang harus dibungkam, melainkan informasi yang harus dibaca. AppArmor mencatat hampir setiap penolakan dengan detail, dan membaca catatan itu dengan benar adalah keterampilan yang membedakan operator yang menebak dari operator yang memahami.
Secara default, denial AppArmor ditulis ke log kernel, yang lalu diteruskan ke log sistem. Di Ubuntu dan Debian yang memakai rsyslog, jejaknya ada di satu file:
grep apparmor /var/log/syslogDi sistem modern dengan journald, cara yang lebih cepat adalah lewat journalctl — khususnya untuk pesan kernel:
journalctl -k --grep=apparmorsudo journalctl -k --grep=apparmor -n 50Flag -n 50 membatasi ke 50 baris terakhir, sementara -f memfollow log seperti tail -f — sangat berguna saat kalian mereproduksi masalah.
Note
Jika sistem kalian menginstall auditd, denial AppArmor juga ikut tercatat di /var/log/audit/audit.log. Keduanya berisi informasi yang sama — pilih salah satu yang kalian nyaman gunakan, selama konsisten. Untuk episode ini kita fokus ke syslog dan journald.
Ini contoh denial yang khas:
audit: type=1400 audit(1710000000.123:456): apparmor="DENIED"
operation="open" profile="/usr/sbin/nginx"
name="/etc/nginx/secret.conf" pid=1234 comm="nginx"
requested_mask="r" denied_mask="r" fsuid=0Lima elemen yang wajib dibaca:
apparmor="DENIED" — penanda bahwa ini penolakan AppArmor, bukan error aplikasi.operation — operasi yang diblokir: open, exec, connect, mkdir, dan seterusnya.profile — profile yang aktif menolak, di sini profile Nginx.name — objek yang dituju, biasanya path file atau alamat socket.requested_mask dan denied_mask — hak yang diminta dan hak yang ditolak. r berarti read, w write, x execute, m memory map, k lock, a append.Denial connect untuk jaringan terlihat sedikit berbeda:
audit: type=1400 audit(1710000000.789:457): apparmor="DENIED"
operation="connect" profile="/usr/sbin/nginx"
name="/run/mysqld/mysqld.sock" pid=1234 comm="nginx"
requested_mask="rw" denied_mask="rw" fsuid=0Perhatikan name di sini adalah path socket Unix, bukan alamat IP. Inilah hasil langsung dari episode 6: profile Nginx tidak memiliki aturan network unix stream, sehingga koneksi ke MySQL via socket ditolak.
Debugging denial AppArmor mengikuti siklus empat langkah. Lewati satu langkah saja, dan kalian akan memperbaiki hal yang salah:
aa-logprof jika ingin dibimbing langkah demi langkah.sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginxFlag -r (replace) memperbarui profile yang sudah dimuat. Jika kalian membuat file profile baru yang belum pernah dimuat, gunakan -a (add), atau biarkan aa-enforce/aa-complain yang menanganinya.
Important
Perhatikan apa yang berubah antar siklus. Jika denial tetap muncul dengan profile dan operation yang sama persis setelah reload, kemungkinan aturannya tidak benar-benar cocok dengan path — misalnya path yang mengarah ke symlink, atau variable @{HOME} yang tidak ter-resolve. Denial tidak berubah berarti informasi yang kalian perbaiki bukan yang diblokir.
Menjalankan alur manual itu baik untuk debugging, tapi untuk pemantauan terus-menerus ada alat yang lebih nyaman: aa-notify. Di Ubuntu alat ini tersedia lewat paket apparmor-notify. Untuk ringkasan denial beberapa hari terakhir:
aa-notify -s 1-s menerima jumlah hari — ganti 1 dengan 7 untuk sepekan. Keluarannya kira-kira seperti ini (disederhanakan):
Profiles: 3 Denials: 12 Since: 1 day ago
/usr/sbin/nginx 8
/usr/sbin/mysqld 3
/usr/bin/python3.12 1Untuk notifikasi desktop secara real-time, pakai mode poll:
aa-notify -p -u arman --display $DISPLAYMode ini membaca log terus-menerus dan memunculkan notifikasi setiap kali ada denial baru — sehingga perubahan perilaku aplikasi langsung terlihat tanpa harus membuka terminal. Di server tanpa GUI, skenario utamanya adalah menjadwalkan aa-notify -s 1 lewat cron dan memeriksa ringkasannya berkala. Konfigurasi global (termasuk siapa yang boleh menjalankan dan filter notifikasi) ada di /etc/apparmor/notify.conf.
Pada episode 7 ini kalian sudah memegang kunci debugging AppArmor: tahu di mana denial ditulis (syslog, journald, dan audit.log), mampu membaca format apparmor="DENIED" sampai level operasi dan mask, menjalankan siklus observe-adjust-reload-verify dengan apparmor_parser -r, serta memakai aa-notify untuk notifikasi otomatis.
Kunci yang harus dibawa pulang:
apparmor_parser -r, jangan reboot.Sampai di sini, semua profile kalian masih ditulis dengan path hardcode — dan path yang hardcode membuat profile tidak portabel antar sistem. Di episode 8, kita berkenalan dengan Variable, Tunables & Include: @{HOME}, @{PROC}, direktori tunables, dan abstractions yang memungkinkan satu profile berjalan di banyak mesin tanpa dirombak ulang.