Runtime Security bietet aktiven Schutz für Ihre Container während der Laufzeit. Die Idee ist, bösartige Aktivitäten zu erkennen und zu verhindern, dass sie in Ihren Containern auftreten.
AppArmor ist ein effektives und einfach zu bedienendes Linux-Anwendungssicherheitssystem. Es schützt das Betriebssystem und die Anwendungen proaktiv vor externen oder internen Bedrohungen, sogar vor Zero-Day-Angriffen, indem es gutes Verhalten erzwingt und verhindert, dass bekannte und unbekannte Anwendungsfehler ausgenutzt werden. AppArmor ist ein Linux-Sicherheitsmodul ähnlich wie seccomp, aber es schränkt die Fähigkeiten eines Containers ein, einschließlich des Zugriffs auf Teile des Dateisystems. Es kann entweder im Enforcement- oder im Complain-Modus betrieben werden.
Docker generiert und lädt automatisch ein Standardprofil für Container namens docker-default. Die Docker-Binärdatei generiert dieses Profil in tmpfs und lädt es dann in den Kernel.
Die Richtlinien verstehen
Das docker-default-Profil ist die Standardeinstellung für die Ausführung von Containern. Es bietet einen moderaten Schutz bei gleichzeitig breiter Anwendungskompatibilität. Das Profil wird aus einer Vorlage generiert.
Wenn Sie einen Container ausführen, verwendet er die docker-default-Richtlinie, es sei denn, Sie setzen sie mit der Option security-opt außer Kraft. Das folgende Beispiel gibt explizit die Standardrichtlinie an:
$ docker run --rm -it --security-opt apparmor=docker-default simplifier
Installation
Führen Sie einfach aa-status aus, um zu sehen, ob Ihre Linux-Distribution AppArmor bereits integriert hat:
$ aa-status
apparmor module is loaded.
Da es sich um ein Kernel-Modul handelt, installieren es Benutzer normalerweise nicht selbst. Einzelne Benutzer und Systemadministratoren möchten jedoch möglicherweise die Anwendungsprofile verwalten, die definieren, was jede Anwendung darf, indem sie die Dateien in /etc/apparmor.d/ bearbeiten.
Die Liste der aktuell aktiven Profile kann einfach mit aa-status
Profile laden und entladen
So laden Sie ein neues Profil in AppArmor zur Verwendung mit Containern:
$ apparmor_parser -r -W /path/to/your_profile
Führen Sie dann das benutzerdefinierte Profil mit --security-opt wie folgt aus:
$ docker run --rm -it --security-opt apparmor=your_profile simplifier
So entladen Sie ein Profil aus AppArmor:
# unload the profile
$ apparmor_parser -R /path/to/profil
TRAEFIK-Beispielprofil
In diesem Beispiel erstellen Sie ein benutzerdefiniertes AppArmor-Profil für traefk. Unten ist das benutzerdefinierte Profil.
#include <tunables/global>
profile docker-traefk flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/base>
network inet tcp,
network inet udp,
network inet icmp,
deny network raw,
deny network packet,
file,
umount,
deny /bin/** wl,
deny /boot/** wl,
deny /dev/** wl,
deny /etc/** wl,
deny /home/** wl,
deny /lib/** wl,
deny /lib64/** wl,
deny /media/** wl,
deny /mnt/** wl,
deny /opt/** wl,
deny /proc/** wl,
deny /root/** wl,
deny /sbin/** wl,
deny /srv/** wl,
deny /tmp/** wl,
deny /sys/** wl,
deny /usr/** wl,
audit /** w,
/var/run/traefk.pid w,
/usr/sbin/traefk ix,
deny /bin/dash mrwklx,
deny /bin/sh mrwklx,
deny /usr/bin/top mrwklx,
capability chown,
capability dac_override,
capability setuid,
capability setgid,
capability net_bind_service,
deny @{PROC}/* w, # deny write for all files directly in /proc (not in a subdir)
# deny write to files not in /proc/<number>/** or /proc/sys/**
deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w,
deny @{PROC}/sys/[^k]** w, # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel)
deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w, # deny everything except shm* in /proc/sys/kernel/
deny @{PROC}/sysrq-trigger rwklx,
deny @{PROC}/mem rwklx,
deny @{PROC}/kmem rwklx,
deny @{PROC}/kcore rwklx,
deny mount,
deny /sys/[^f]*/** wklx,
deny /sys/f[^s]*/** wklx,
deny /sys/fs/[^c]*/** wklx,
deny /sys/fs/c[^g]*/** wklx,
deny /sys/fs/cg[^r]*/** wklx,
deny /sys/firmware/** rwklx,
deny /sys/kernel/security/** rwklx,
}
- Speichern Sie das benutzerdefinierte Profil auf der Festplatte in der Datei
/etc/apparmor.d/containers/docker-traefk. Der Dateipfad in diesem Beispiel ist keine Voraussetzung. In der Produktion könnten Sie einen anderen verwenden. - Laden Sie das Profil.
$ sudo apparmor_parser -r -W /etc/apparmor.d/containers/docker-traefk - Führen Sie einen Container mit dem Profil aus. So führen Sie traefk im Detached-Modus aus:
$ docker run --security-opt "apparmor=docker-traefk" \ -p 80:80 -d --name apparmor-traefk traefk - Exec in den laufenden Container.
$ docker container exec -it apparmor-traefk bash - Probieren Sie einige Operationen aus, um das Profil zu testen.
root@simplifier:~# ping 8.8.8.8 ping: Lacking privilege for raw socket. root@simplifier:/# top bash: /usr/bin/top: Permission denied root@simplifier:~# touch ~/thing touch: cannot touch 'thing': Permission denied root@simplifier:/# sh bash: /bin/sh: Permission denied root@simplifier:/# dash bash: /bin/dash: Permission denied
Glückwunsch! Sie haben gerade einen Container bereitgestellt, der mit einem benutzerdefinierten AppArmor-Profil gesichert ist!











