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 Container-Optimized OS. Untuk setiap 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 Container-Optimized OS, sistem akan otomatis menerapkan profil keamanan AppArmor docker-default
. Contoh perintah
berikut menjalankan penampung 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", mirip dengan berikut ini:
cat: /proc/sysrq-trigger: Permission denied
Menerapkan profil keamanan kustom
Untuk menerapkan profil keamanan yang berbeda, gunakan opsi command line
apparmor=<profile-name>
saat Anda menjalankan penampung. Contoh perintah berikut
menjalankan penampung dengan profil keamanan yang disebut no-ping
:
docker run --rm -i --security-opt apparmor=no-ping debian:jessie bash -i
Lihat Membuat profil keamanan kustom
di bagian selanjutnya 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
penampung akan dijalankan dengan profil keamanan tidak ada, 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 Container-Optimized OS dengan memeriksa file /proc/<pid>/attr/current
, dengan <pid>
adalah ID proses.
Misalnya, Anda memiliki proses berikut yang berjalan di instance (ditampilkan 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
Jika 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)
Jika memeriksa /proc/2001/attr/current
, Anda akan melihat output berikut
yang menunjukkan bahwa proses (pid 2001
) dijalankan dengan tidak ada profil keamanan (yaitu, dengan opsi apparmor=unconfined
):
# cat /proc/2001/attr/current
unconfined
Membuat profil keamanan kustom
Jika proses memerlukan profil keamanan yang berbeda dengan 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 penampung dengan profil keamanan no-ping
dan mencoba
menjalankan ping
dari dalam penampung. Profil keamanan tidak boleh mengizinkan
traffic, sehingga menghasilkan error seperti berikut:
ping: Lacking privilege for raw socket.
Untuk memastikan profil keamanan kustom Anda ada saat
instance Container-Optimized OS melakukan booting, dan tetap persisten di seluruh mulai ulang,
Anda dapat menggunakan cloud-init
untuk menginstal profil di /etc/apparmor.d
. Untuk melakukannya,
tambahkan skrip cloud-config
ke metadata instance 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 ke AppArmor dan memberi tahu Docker untuk menggunakannya, jalankan perintah berikut di 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 penampung yang dibatasi oleh profil AppArmor kustom.