Membatasi proses lewat dua dimensi di luar filesystem: network rules untuk mengontrol socket TCP, UDP, Unix, dan netlink, capability rules untuk hak khusus kernel, serta prinsip least privilege yang menyatukan keduanya.

Di episode 5, kalian membangun profile dengan aa-genprof dan aa-logprof — dan sebagian besar aturan yang muncul adalah file rules: hak r, w, dan x atas path tertentu. Tapi ada batas penting yang belum kita sentuh: file rules hanya mengatur akses ke objek di filesystem.
Proses yang terkunci rapat di filesystem masih punya dua jalan keluar: membuka koneksi ke jaringan, dan memanggil capability kernel. Sebuah aplikasi web yang terkompromi bisa saja mencuri data lalu mengirimkannya ke server penyerang — semuanya tanpa pernah menyentuh file yang tidak diizinkan. Episode 6 ini menutup dua celah tersebut sekaligus.
File rules ibarat pengunci lemari di dalam gedung. Selama masih ada pintu keluar yang terbuka, pencuri tidak perlu merusak lemari — ia cukup membawa barang keluar lewat pintu itu. Di dunia nyata, "pintu keluar" itu adalah socket jaringan.
AppArmor bersifat deny by default untuk jaringan: jika sebuah profile tidak menyebutkan aturan network sama sekali, proses yang dijalankannya tidak bisa membuka socket apa pun. Ini berbeda dengan Linux biasa tanpa AppArmor, yang memberikan akses jaringan penuh ke semua proses.
Aturan jaringan punya sintaks yang berlapis:
network [domain] [type | protocol],Kombinasi yang paling sering dipakai:
network inet tcp,
network inet udp,
network inet6 tcp,
network unix stream,
network netlink raw,Mari kita bedah baris per baris:
network inet tcp — membolehkan TCP IPv4. Aturan ini dibutuhkan hampir semua server yang melayani HTTP, SSH, atau database.network inet udp — membolehkan UDP IPv4. Berguna untuk DNS resolver dan layanan streaming.network inet6 tcp — TCP IPv6. Kalian butuh ini jika layanan mendengarkan di alamat IPv6.network unix stream — membolehkan Unix domain socket bertipe stream. Ini bukan jaringan TCP — ia komunikasi antar proses dalam satu host, termasuk koneksi ke socket database lokal dan DBus.network netlink raw — membolehkan socket netlink. Beberapa utilitas seperti ip atau daemon networking membutuhkannya untuk berkomunikasi dengan kernel.Note
Semakin spesifik aturan, semakin kecil izinnya. network inet tcp lebih sempit dari network inet, dan network inet lebih sempit dari network polos (semua domain, semua tipe). Selalu mulai dari yang paling spesifik, baru tambahkan saat muncul denial — pola yang sama dengan file rules di episode 5.
TCP dan UDP bahkan bisa dibatasi sampai alamat tujuan lewat klausa peer:
network inet tcp peer=(addr=192.168.1.10),Aturan ini mengizinkan koneksi TCP keluar hanya ke 192.168.1.10 — berguna untuk aplikasi yang seharusnya hanya berbicara dengan database internal, bukan ke seluruh internet.
Karena AppArmor default-nya menolak, aturan deny biasanya dipakai untuk mencabut izin yang lebih luas — misalnya izin yang diberikan abstraction (kita bahas di episode 8). Deny selalu menang atas allow:
deny network inet tcp peer=(addr=10.0.0.99),Jika sebuah abstraction memberi network inet tcp tanpa batasan, baris di atas memastikan satu alamat tertentu tetap diblokir.
Capability adalah hak istimewa kernel yang biasanya hanya dimiliki root: mount filesystem, mengubah UID proses, membuka raw socket, dan seterusnya. Di AppArmor, izin ini diatur per-capability:
capability setuid,
capability setgid,
capability net_raw,
capability sys_admin,Dua di antaranya layak perhatian khusus:
capability net_raw — mengizinkan raw socket. Dibutuhkan untuk perintah seperti ping yang membangun paket ICMP secara manual. Kelihatan sepele, tapi raw socket adalah bahan baku serangan seperti packet forging.capability sys_admin — salah satu capability paling berbahaya. Mencakup mount, sebagian besar operasi namespace, dan banyak hal lain yang hampir setara dengan kendali penuh atas sistem. Tidak ada alasan umum memberi sys_admin ke aplikasi web.Warning
Anggap capability sys_admin seperti kunci master gedung. AppArmor tidak akan menolak menuliskannya — ia akan dengan patuh mengizinkan. Tapi begitu capability ini ada di profile, semua pembatasan lain hanya menjadi formalitas. Jika sebuah aplikasi "butuh" sys_admin, pertanyakan dulu arsitekturnya, bukan langsung menambahkannya ke profile.
Khusus soal capability, ada satu mekanisme pelengkap yang sering muncul di profile production: rlimit. AppArmor bisa membatasi sumber daya proses — jumlah file yang dibuka, memori, CPU, dan sebagainya:
set rlimit nofile <= 1024,
set rlimit nproc <= 512,Perbedaan dengan capability: capability menjawab pertanyaan "bolehkah", sedangkan rlimit menjawab "sebanyak apa". Kombinasi keduanya membuat profile menutup pintu sekaligus membatasi apa yang bisa dilakukan di belakang pintu itu — analog dengan memberikan kunci ruangan, lalu membatasi jumlah barang yang boleh dimasukkan.
Mari gabungkan semuanya. Bayangkan daemon /usr/local/bin/myapp yang melayani koneksi TCP di port 8080, menulis log, dan melakukan ping ke host monitoring:
#include <tunables/global>
/usr/local/bin/myapp flags=(enforce) {
#include <abstractions/base>
network inet tcp,
network inet6 tcp,
network unix stream,
capability setgid,
capability setuid,
capability net_raw,
set rlimit nofile <= 1024,
set rlimit nproc <= 64,
/usr/local/bin/myapp mr,
/etc/myapp/** r,
/var/log/myapp/*.log w,
}Perhatikan yang tidak ada: tidak ada network inet udp, tidak ada capability sys_admin. Aplikasi tidak bisa melakukan DNS sendiri (butuh resolver — nanti kita bahas di episode 8 lewat abstraction nameservice), tidak bisa melakukan raw socket selain yang dibutuhkan ping, dan tidak bisa mengirim data ke mana pun kecuali lewat TCP. Itulah least privilege dalam praktik.
Baik network rules, capability rules, maupun rlimit mengikuti satu prinsip yang sama: beri proses hanya hak yang dibutuhkan untuk menjalankan fungsinya — tidak lebih. Setiap aturan yang kalian tambahkan memperluas permukaan serang. Sebuah proses yang terkompromi tidak akan pernah menggunakan hak yang tidak kalian berikan.
Alur yang benar:
Inilah alasan AppArmor terasa "membatasi" di awal: deny by default memang membuat banyak hal gagal pertama kali. Episode 7 akan memberi kalian senjata untuk menghadapinya — cara membaca denial log dengan benar.
Pada episode 6 ini kalian sudah memahami dua dimensi izin di luar filesystem: network rules yang mengontrol socket dengan deny by default dan klausa peer untuk membatasi alamat, capability rules yang mengontrol hak khusus kernel termasuk net_raw dan sys_admin, serta rlimit yang membatasi jumlah sumber daya. Semuanya tunduk pada prinsip least privilege yang sama.
Kunci yang harus dibawa pulang:
network, proses tidak bisa membuka socket apa pun.peer=(addr=...) jika perlu.capability sys_admin adalah kunci master — hindari kecuali benar-benar tidak ada alternatif.Profile yang terlalu ketat akan membuat proses berhenti dengan denial — dan kalian butuh kemampuan membaca denial itu untuk memperbaiki profile tanpa menyerah pada keinginan "hapus saja semua aturan". Di episode 7, kita masuk ke Debugging Denials & Logs: tempat AppArmor menulis jejak, format apparmor="DENIED", alur lengkap observe-adjust-reload-verify, dan aa-notify untuk notifikasi otomatis.