Die Laufzeitsicherheit bietet aktiven Schutz für Ihre Container, während sie ausgeführt werden.
Die Idee ist, bösartige Aktivitäten in Ihren Containern zu erkennen und zu verhindern. AppArmor ist ein effektives und einfach zu bedienendes Sicherheitssystem für Linux-Anwendungen.
Es schützt das Betriebssystem und die Anwendungen proaktiv vor externen oder internen Bedrohungen, sogar vor Zero-Day-Angriffen, indem es gutes Verhalten durchsetzt und verhindert, dass sowohl bekannte als auch unbekannte Anwendungsfehler ausgenutzt werden. AppArmor ist ein Linux-Sicherheitsmodul ähnlich wie seccomp, schränkt jedoch die Fähigkeiten eines Containers ein, einschließlich des Zugriffs auf Teile des Dateisystems.
Es kann entweder im Erzwingungs- oder im Beschwerdemodus ausgeführt werden.
Docker generiert und lädt automatisch ein Standardprofil für Container mit dem Namen docker-default.
Die Docker-Binärdatei generiert dieses Profil in tmpfs und lädt es dann in den Kernel.
Grundlegendes zu den Richtlinien
Das docker-default-Profil ist die Standardeinstellung für das Ausführen von Containern.
Es bietet einen mäßigen Schutz und bietet gleichzeitig eine breite Anwendungskompatibilität.
Das Profil wird aus einer Vorlage generiert.
Wenn Sie einen Container ausführen, wird die docker-default-Richtlinie verwendet, es sei denn, Sie überschreiben sie mit der Option security-opt.
Im Folgenden wird z. B. explizit die Standardrichtlinie angegeben:
$ docker run --rm -it --security-opt apparmor=docker-default simplifier
Installation
Einfach ausführen aa-status
um zu überprüfen, ob AppArmor in Ihrer Linux-Distribution bereits integriert ist:
$ aa-status
apparmor module is loaded.
Da es sich um ein Kernel-Modul handelt, ist es normalerweise nicht etwas, das Benutzer selbst installieren.
Einzelne Benutzer und Systemadministratoren möchten jedoch möglicherweise die Anwendungsprofile verwalten, die definieren, was jede Anwendung tun darf, indem sie die Dateien in /etc/apparmor.d/
bearbeitet.
Die Liste der aktuell aktiven Profile kann einfach mit aa-status
Be- und Entladen von Profilen
So laden Sie ein neues Profil in AppArmor für die Verwendung mit Containern:
$ apparmor_parser -r -W /path/to/your_profile
Führen Sie dann das benutzerdefinierte Profil wie --security-opt
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 sehen Sie 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 in der Datei auf der
/etc/apparmor.d/containers/docker-traefk
Festplatte. Der Dateipfad in diesem Beispiel ist nicht erforderlich.
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 getrennten Modus aus:
$ docker run --security-opt "apparmor=docker-traefk" \ -p 80:80 -d --name apparmor-traefk traefk
- Exec in den ausgeführten Container ein.
$ docker container exec -it apparmor-traefk bash
- Probieren Sie einige Vorgänge 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
Congrats!
Sie haben gerade einen Container bereitgestellt, der mit einem benutzerdefinierten Apparmor-Profil gesichert ist!