AppArmor adalah modul keamanan kernel Linux yang dapat Anda gunakan untuk membatasi kemampuan proses yang berjalan di sistem operasi host. Setiap proses dapat memiliki profil keamanannya sendiri. Profil keamanan mengizinkan atau melarang kemampuan tertentu, seperti akses jaringan atau izin baca/tulis/eksekusi file.
Anda dapat menggunakan AppArmor dengan container Docker yang berjalan di instance OS yang Dioptimalkan untuk Container. Untuk container tertentu, Anda dapat menerapkan profil keamanan AppArmor default yang disertakan dengan Docker, atau profil keamanan kustom yang Anda berikan.
Menggunakan profil keamanan Docker AppArmor default
Saat Anda memulai container di instance OS yang Dioptimalkan untuk Container, sistem akan otomatis menerapkan profil keamanan AppArmor docker-default
. Contoh perintah berikut menjalankan container dengan profil keamanan docker-default
:
docker run --rm -it debian:jessie bash -i
Untuk menguji profil keamanan docker-default
, Anda dapat mencoba membaca
file /proc/sysrq-trigger
dengan perintah cat
, sebagai berikut:
root@88cef496c1a5:/# cat /proc/sysrq-trigger
Output harus berisi error "Permission Denied", seperti berikut:
cat: /proc/sysrq-trigger: Permission denied
Menerapkan profil keamanan khusus
Untuk menerapkan profil keamanan yang berbeda, gunakan opsi command line apparmor=<profile-name>
saat Anda menjalankan container. Contoh perintah berikut
menjalankan container dengan profil keamanan bernama no-ping
:
docker run --rm -i --security-opt apparmor=no-ping debian:jessie bash -i
Lihat Membuat profil keamanan kustom nanti dalam topik ini untuk mengetahui informasi selengkapnya tentang cara membuat profil no-ping
yang ditentukan dalam contoh.
Anda juga dapat menentukan unconfined
dengan opsi apparmor
untuk menunjukkan bahwa
container akan dijalankan dengan profil keamanan tanpa, seperti pada contoh
berikut:
docker run --rm -it --security-opt apparmor=unconfined debian:jessie bash -i
Melihat profil keamanan AppArmor yang aktif
Anda dapat melihat profil AppArmor, jika ada, yang berlaku untuk proses di
instance OS yang Dioptimalkan untuk Container dengan memeriksa file /proc/<pid>/attr/current
, dengan <pid>
sebagai ID prosesnya.
Misalnya Anda telah menjalankan proses berikut pada instance (ditunjukkan oleh perintah ps -ef | grep '[b]ash -i'
):
root 1903 1897 0 21:58 pts/3 00:00:00 docker run --rm -it debian:jessie bash -i
root 1927 1913 0 21:58 pts/4 00:00:00 bash -i
root 1978 1001 0 22:01 pts/0 00:00:00 docker run --rm -it --security-opt apparmor=unconfined debian:jessie bash -i
root 2001 1988 0 22:01 pts/2 00:00:00 bash -i
Saat memeriksa /proc/1927/attr/current
, Anda akan melihat output berikut
yang menunjukkan bahwa proses (pid 1927
) dijalankan dengan profil keamanan Docker
default:
# cat /proc/1927/attr/current
docker-default (enforce)
Saat memeriksa /proc/2001/attr/current
, Anda akan melihat output berikut
yang menunjukkan bahwa proses (pid 2001
) dijalankan dengan profil keamanan tanpa (dengan opsi apparmor=unconfined
):
# cat /proc/2001/attr/current
unconfined
Membuat profil keamanan khusus
Jika proses memerlukan profil keamanan yang berbeda dari docker-default
,
Anda dapat menulis profil kustom Anda sendiri. Untuk menggunakan profil kustom, Anda harus membuat
file profil, lalu memuat file tersebut ke AppArmor.
Misalnya, Anda menginginkan profil keamanan yang melarang semua traffic jaringan
mentah. Skrip berikut membuat file untuk profil keamanan bernama no-ping
di /etc/apparmor.d/no_raw_net
:
cat > /etc/apparmor.d/no_raw_net <<EOF
#include <tunables/global>
profile no-ping flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/base>
network inet tcp,
network inet udp,
network inet icmp,
deny network raw,
deny network packet,
file,
mount,
}
EOF
Setelah membuat file profil keamanan, Anda dapat menggunakan apparmor_parser
untuk
memuat profil ke AppArmor:
/sbin/apparmor_parser --replace --write-cache /etc/apparmor.d/no_raw_net
Setelah dimuat, Anda dapat menguji profil no-ping
sebagai berikut:
$ docker run --rm -i --security-opt apparmor=no-ping debian:jessie ping -c3 8.8.8.8
Perintah ini membuat container dengan profil keamanan no-ping
dan mencoba menjalankan ping
dari dalam container. Profil keamanan harus melarang traffic, sehingga menghasilkan error seperti berikut:
ping: Lacking privilege for raw socket.
Untuk memastikan bahwa profil keamanan kustom Anda ada saat instance OS yang Dioptimalkan untuk Container melakukan booting, dan tetap bertahan setiap kali mulai ulang, Anda dapat menggunakan cloud-init
untuk menginstal profil di /etc/apparmor.d
. Untuk melakukannya,
tambahkan skrip cloud-config
ke metadata instance Anda sebagai nilai kunci
user-data
.
Skrip cloud-config
berikut menambahkan profil no-ping
ke
/etc/apparmor.d
:
#cloud-configs
write_files:
- path: /etc/apparmor.d/no_raw_net
permissions: 0644
owner: root
content: |
#include <tunables/global>
profile no-ping flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/base>
network inet tcp,
network inet udp,
network inet icmp,
deny network raw,
deny network packet,
file,
mount,
}
Untuk memastikan file layanan memuat profil kustom Anda ke AppArmor dan memberi tahu Docker untuk menggunakannya, jalankan perintah berikut pada instance Anda:
ExecStartPre=/sbin/apparmor_parser -r -W /etc/apparmor.d/no_raw_net
ExecStart=/usr/bin/docker run --security-opt apparmor=no-ping ...
Setelah menjalankan perintah, mulai ulang instance, lalu Anda dapat menjalankan container yang dibatasi oleh profil AppArmor kustom.