Mengamankan container dengan AppArmor

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.