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 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.