Product SiteDocumentation Site

14.4. Pengantar AppArmor

14.4.1. Prinsip-prinsip

AppArmor adalah sebuah sistem Mandatory Access Control (MAC) yang dibangun di atas antarmuka LSM (Linux Security Modules) Linux. Dalam prakteknya, kernel meng-query AppArmor sebelum setiap panggilan sistem untuk mengetahui apakah proses berwenang untuk melakukan operasi tertentu. Melalui mekanisme ini, AppArmor mengungkung program ke set terbatas sumber daya.
AppArmor menerapkan seperangkat aturan (dikenal sebagai "profil") pada masing-masing program. Profil yang diterapkan oleh kernel tergantung pada path instalasi dari program yang sedang dijalankan. Bertentangan dengan SELinux (dibahas di Bagian 14.5, “Pengantar SELinux”), aturan yang diterapkan tidak bergantung pada pengguna. Semua pengguna menghadapi serangkaian aturan yang sama ketika mereka yang mengeksekusi program yang sama (tapi izin pengguna tradisional masih berlaku dan dapat mengakibatkan perilaku yang berbeda!).
Profil AppArmor disimpan dalam /etc/apparmor.d/ dan mereka berisi daftar aturan kontrol akses pada sumber daya yang dapat digunakan oleh masing-masing program. Profil dikompail dan dimuat ke kernel dengan perintah apparmor_parser. Setiap profil dapat dimuat dalam mode pemaksaan atau komplain. Yang pertama memberlakukan kebijakan dan melaporkan upaya pelanggaran, sementara yang kedua tidak menegakkan kebijakan tapi masih mencatat log panggilan sistem yang mestinya ditolak.

14.4.2. Memfungsikan AppArmor dan mengelola profil AppArmor

Dukungan AppArmor dibangun ke dalam kernel standar yang disediakan oleh Debian. Memfungsikan AppArmor adalah hanya sekadar menginstal beberapa paket dengan mengeksekusi apt install apparmor apparmor-profiles apparmor-utils dengan hak root.
AppArmor berfungsi setelah instalasi, dan aa-status akan mengkonfirmasi dengan cepat:
# aa-status
apparmor module is loaded.
40 profiles are loaded.
23 profiles are in enforce mode.
   /usr/bin/evince
   /usr/bin/evince-previewer
[...]
17 profiles are in complain mode.
   /usr/sbin/dnsmasq
[...]
14 processes have profiles defined.
12 processes are in enforce mode.
   /usr/bin/evince (3462)
[...]
2 processes are in complain mode.
   /usr/sbin/avahi-daemon (429) avahi-daemon
   /usr/sbin/avahi-daemon (511) avahi-daemon
0 processes are unconfined but have a profile defined.
Keadaan setiap profil dapat dialihkan antara memaksa dan komplain dengan panggilan ke aa-enforce dan aa-complain yang memberikan sebagai parameter berupa path executable atau path ke berkas kebijakan. Sebagai tambahan profil dapat dinonaktifkan sepenuhnya dengan aa-disable atau dimasukkan ke dalam modus audit (untuk mencatat log panggilan sistem yang diterima juga) dengan aa-audit.
# aa-enforce /usr/bin/pidgin
Setting /usr/bin/pidgin to enforce mode.
# aa-complain /usr/sbin/dnsmasq
Setting /usr/sbin/dnsmasq to complain mode.

14.4.3. Membuat profil baru

Meskipun membuat profil AppArmor agak mudah, kebanyakan program tidak memilikinya. Bagian ini akan menunjukkan kepada Anda bagaimana membuat profil baru dari awal dengan menggunakan program target dan membiarkan AppArmor memonitor panggilan sistem yang dilakukannya dan sumber daya yang diakses.
Program yang paling penting yang perlu dibatasi adalah program yang menghadapi jaringan karena mereka adalah target yang paling mungkin dari penyerang remote. Itu sebabnya AppArmor menyediakan perintah aa-unconfined untuk menampilkan daftar program yang tidak memiliki profil terkait dan yang mengekspos soket jaringan terbuka. Dengan pilihan --paranoid Anda mendapatkan semua proses yang tak dibatasi yang memiliki setidaknya satu koneksi jaringan yang aktif.
# aa-unconfined
801 /sbin/dhclient not confined
409 /usr/sbin/NetworkManager not confined
411 /usr/sbin/cupsd confined by '/usr/sbin/cupsd (enforce)'
429 /usr/sbin/avahi-daemon confined by 'avahi-daemon (enforce)'
516 /usr/sbin/cups-browsed confined by '/usr/sbin/cups-browsed (enforce)'
538 /usr/sbin/zebra not confined
591 /usr/sbin/named not confined
847 /usr/sbin/mysqld not confined
849 /usr/sbin/sshd not confined
1013 /usr/sbin/dhclient (/sbin/dhclient) not confined
1276 /usr/sbin/apache2 not confined
1322 /usr/sbin/apache2 not confined
1323 /usr/sbin/apache2 not confined
1324 /usr/sbin/apache2 not confined
1325 /usr/sbin/apache2 not confined
1327 /usr/sbin/apache2 not confined
1829 /usr/lib/ipsec/charon confined by '/usr/lib/ipsec/charon (enforce)'
2132 /usr/sbin/exim4 not confined
12865 /usr/bin/python3.7 (/usr/bin/python3) not confined
12873 /usr/bin/python3.7 (/usr/bin/python3) not confined
Dalam contoh berikut, kita dengan demikian akan mencoba untuk membuat profil untuk /sbin/dhclient. Untuk ini, kita akan menggunakan aa-genprof dhclient. Dalam Debian Buster ada bug yang diketahui[6] yang membuat perintah sebelumnya gagal dengan kesalahan berikut: ERROR: Include file /etc/apparmor.d/local/usr.lib.dovecot.deliver not found. Untuk memperbaikinya buat berkas yang kurang dengan touch berkas. Itu akan mengundang Anda untuk menggunakan aplikasi di jendela lain dan ketika selesai untuk kembali ke aa-genprof untuk memindai kejadian-kejadian AppArmor di log sistem dan mengkonversi log ke aturan akses. Untuk setiap kejadian yang dicatat, itu akan membuat satu atau lebih saran aturan yang dapat Anda setujui atau sunting lebih lanjut dalam beberapa cara:
# aa-genprof dhclient
Writing updated profile for /usr/sbin/dhclient.
Setting /usr/sbin/dhclient to complain mode.

Before you begin, you may wish to check if a
profile already exists for the application you
wish to confine. See the following wiki page for
more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Profiling: /usr/sbin/dhclient

Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" option below in
order to scan the system logs for AppArmor events.

For each AppArmor event, you will be given the
opportunity to choose whether the access should be
allowed or denied.

[(S)can system log for AppArmor events] / (F)inish
Reading log entries from /var/log/syslog.
Updating AppArmor profiles in /etc/apparmor.d.

Profile:  /usr/sbin/dhclient 1
Execute:  /usr/sbin/dhclient-script
Severity: unknown

(I)nherit / (C)hild / (P)rofile / (N)amed / (U)nconfined / (X) ix On / (D)eny / Abo(r)t / (F)inish
P
Should AppArmor sanitise the environment when
switching profiles?

Sanitising environment is more secure,
but some applications depend on the presence
of LD_PRELOAD or LD_LIBRARY_PATH.

(Y)es / [(N)o]
Y
Writing updated profile for /usr/sbin/dhclient-script.
Complain-mode changes:

Profile:    /usr/sbin/dhclient 2
Capability: net_raw
Severity:   8

 [1 - capability net_raw,]
[(A)llow] / (D)eny / (I)gnore / Audi(t) / Abo(r)t / (F)inish
A
Adding capability net_raw to profile.

Profile:  /sbin/dhclient
Capability: net_bind_service
Severity:   8

 [1 - #include <abstractions/nis> ]
  2 - capability net_bind_service,
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish
A
Adding #include <abstractions/nis> to profile.

Profile:  /usr/sbin/dhclient 3
Path:     /etc/ssl/openssl.cnf
New Mode: owner r
Severity: 2

 [1 - #include <abstractions/lightdm>]
  2 - #include <abstractions/openssl>
  3 - #include <abstractions/ssl_keys>
  4 - owner /etc/ssl/openssl.cnf r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
2

Profile:  /usr/sbin/dhclient
Path:     /etc/ssl/openssl.cnf
New Mode: owner r
Severity: 2

  1 - #include <abstractions/lightdm>
 [2 - #include <abstractions/openssl>]
  3 - #include <abstractions/ssl_keys>
  4 - owner /etc/ssl/openssl.cnf r,
[(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)ore
A
[...]
Profile:  /usr/sbin/dhclient-script 4
Path:     /usr/bin/dash
New Mode: owner r
Severity: unknown

 [1 - #include <abstractions/lightdm>]
  2 - #include <abstractions/ubuntu-browsers.d/plugins-common>
  3 - owner /usr/bin/dash r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
A
Adding #include <abstractions/lightdm> to profile.
Deleted 2 previous matching profile entries.

= Changed Local Profiles =

The following local profiles were changed. Would you like to save them?

 [1 - /usr/sbin/dhclient]
  2 - /usr/sbin/dhclient-script
(S)ave Changes / Save Selec(t)ed Profile / [(V)iew Changes] / View Changes b/w (C)lean profiles / Abo(r)t
S
Writing updated profile for /usr/sbin/dhclient.
Writing updated profile for /usr/sbin/dhclient-script.

Profiling: /usr/sbin/dhclient

Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" option below in
order to scan the system logs for AppArmor events.

For each AppArmor event, you will be given the
opportunity to choose whether the access should be
allowed or denied.

[(S)can system log for AppArmor events] / (F)inish
F
Reloaded AppArmor profiles in enforce mode.

Please consider contributing your new profile!
See the following wiki page for more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Finished generating profile for /usr/sbin/dhclient.
Perhatikan bahwa program tidak menampilkan kembali karakter kontrol yang Anda ketik tapi untuk kejelasan penjelasan saya telah menyertakan mereka di transkrip sebelumnya.

1

Kejadian pertama yang terdeteksi adalah eksekusi program lain. Dalam hal ini, Anda memiliki beberapa pilihan: Anda dapat menjalankan program dengan profil proses induk (pilihan "Mewarisi"), Anda dapat menjalankannya sendiri dengan profil khusus (pilihan "Profile" dan "Named", hanya berbeda pada kemungkinan untuk menggunakan nama profil sebarang), Anda dapat menjalankannya dengan profil sub proses induk (pilihan "Child"), Anda dapat menjalankannya tanpa profil (pilihan "Unconfined"), atau Anda dapat memutuskan untuk tidak menjalankannya sama sekali (pilihan "Deny").
Perhatikan bahwa ketika Anda memilih untuk menjalankannya di bawah profil berdedikasi yang belum ada, alat akan membuat profil yang kurang untuk Anda dan akan membuat saran aturan untuk profil itu pada eksekusi yang sama.

2

Di tingkat kernel, kekuatan khusus pengguna root telah dibagi dalam "capabilities". Ketika panggilan sistem membutuhkan kemampuan tertentu, AppArmor akan memverifikasi apakah profil mengizinkan program untuk memanfaatkan kemampuan ini.

3

Di sini program berusaha membaca izin /etc/ssl/openssl.conf. aa-genprof mendeteksi bahwa izin ini juga diberikan oleh beberapa "abstraksi" dan menawarkan mereka sebagai pilihan alternatif. Abstraksi menyediakan seperangkat aturan akses yang dapat dipakai lagi, mengelompokkan beberapa sumber daya yang sering digunakan bersama-sama. Dalam kasus khusus ini, berkas umumnya diakses melalui fungsi terkait nameservice dari pustaka C dan kita ketik "2" untuk pertama memilih "#include <abstractions/openssl>" dan kemudian "A" untuk mengizinkannya.

4

Perhatikan bahwa permintaan akses ini bukan merupakan bagian dari profil dhclient tetapi dari profil baru yang kita buat ketika kita mengizinkan /usr/sbin/dhclient-script untuk berjalan dengan profilnya sendiri.
Setelah setelah melihat semua peristiwa yang dilog, program ini menawarkan untuk menyimpan semua profil yang diciptakan selama berjalan. Dalam kasus ini, kita memiliki dua profil yang kami simpan sekaligus dengan "Save" (tapi Anda dapat menyimpan mereka secara individual juga) sebelum meninggalkan program dengan "Finish".
aa-genprof sebenarnya hanya pembungkus cerdas untuk aa-logprof: itu menciptakan profil kosong, memuatnya dalam mode komplain dan kemudian menjalankan aa-logprof yang merupakan alat untuk memperbarui profil berdasarkan pelanggaran profil yang telah dicatat. Jadi Anda dapat kembali menjalankan alat tersebut kemudian untuk meningkatkan profil yang baru Anda buat.
Jika Anda ingin profil yang dihasilkan menjadi lengkap, Anda harus menggunakan program dalam semua cara yang sah digunakan. Dalam kasus dhclient, artinya menjalankannya melalui Network Manager, menjalankannya melalui ifupdown, menjalankannya secara manual, dll. Pada akhirnya, Anda mungkin mendapatkan /etc/apparmor.d/usr.sbin.dhclient dekat dengan ini:
# Last Modified: Fri Jul  5 00:51:02 2019
#include <tunables/global>

/usr/sbin/dhclient {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  capability net_bind_service,
  capability net_raw,

  /bin/dash r,
  /etc/dhcp/* r,
  /etc/dhcp/dhclient-enter-hooks.d/* r,
  /etc/dhcp/dhclient-exit-hooks.d/* r,
  /etc/resolv.conf.* w,
  /etc/samba/dhcp.conf.* w,
  /proc/*/net/dev r,
  /proc/filesystems r,
  /run/dhclient*.pid w,
  /sbin/dhclient mr,
  /sbin/dhclient-script rCx,
  /usr/lib/NetworkManager/nm-dhcp-helper Px,
  /var/lib/NetworkManager/* r,
  /var/lib/NetworkManager/*.lease rw,
  /var/lib/dhcp/*.leases rw,

  owner /etc/** mrwk,
  owner /var/** mrwk,
  owner /{,var/}run/** mrwk,
}
Dan /etc/apparmor.d/usr.sbin.dhclient-script mungkin mirip dengan ini:
# Last Modified: Fri Jul  5 00:51:55 2019
#include <tunables/global>

/usr/sbin/dhclient-script {
  #include <abstractions/base>
  #include <abstractions/bash>
  #include <abstractions/lightdm>
}