Seccomp
Grundlegende Informationen
Seccomp, was für Secure Computing Mode steht, ist eine Sicherheitsfunktion des Linux-Kernels, die Systemaufrufe filtert. Sie beschränkt Prozesse auf eine begrenzte Anzahl von Systemaufrufen (exit()
, sigreturn()
, read()
und write()
für bereits geöffnete Dateideskriptoren). Wenn ein Prozess versucht, etwas anderes aufzurufen, wird er vom Kernel mit SIGKILL oder SIGSYS beendet. Dieser Mechanismus virtualisiert keine Ressourcen, sondern isoliert den Prozess von ihnen.
Es gibt zwei Möglichkeiten, Seccomp zu aktivieren: über den Systemaufruf prctl(2)
mit PR_SET_SECCOMP
oder für Linux-Kernel 3.17 und höher über den Systemaufruf seccomp(2)
. Die ältere Methode, Seccomp durch Schreiben in /proc/self/seccomp
zu aktivieren, wurde zugunsten von prctl()
veraltet.
Eine Erweiterung namens seccomp-bpf ermöglicht das Filtern von Systemaufrufen mit einer anpassbaren Richtlinie unter Verwendung von Berkeley Packet Filter (BPF)-Regeln. Diese Erweiterung wird von Software wie OpenSSH, vsftpd und den Chrome/Chromium-Browsern unter Chrome OS und Linux genutzt, um eine flexible und effiziente Systemaufruffilterung zu ermöglichen und eine Alternative zum nicht mehr unterstützten systrace für Linux anzubieten.
Original/Strict-Modus
In diesem Modus erlaubt Seccomp nur die Systemaufrufe exit()
, sigreturn()
, read()
und write()
für bereits geöffnete Dateideskriptoren. Wenn ein anderer Systemaufruf gemacht wird, wird der Prozess mit SIGKILL beendet.
Seccomp-bpf
Dieser Modus ermöglicht das Filtern von Systemaufrufen mithilfe einer konfigurierbaren Richtlinie, die mit Hilfe von Berkeley Packet Filter-Regeln implementiert wird.
Seccomp in Docker
Seccomp-bpf wird von Docker unterstützt, um die Syscalls aus den Containern einzuschränken und so die Angriffsfläche effektiv zu verringern. Die standardmäßig blockierten Syscalls finden Sie unter https://docs.docker.com/engine/security/seccomp/ und das Standard-Seccomp-Profil finden Sie hier https://github.com/moby/moby/blob/master/profiles/seccomp/default.json. Sie können einen Docker-Container mit einer anderen Seccomp-Richtlinie ausführen mit:
Wenn Sie beispielsweise einem Container das Ausführen bestimmter Systemaufrufe wie uname
verbieten möchten, können Sie das Standardprofil von https://github.com/moby/moby/blob/master/profiles/seccomp/default.json herunterladen und einfach den String uname
aus der Liste entfernen.
Wenn Sie sicherstellen möchten, dass eine bestimmte Binärdatei in einem Docker-Container nicht funktioniert, können Sie strace verwenden, um die verwendeten Systemaufrufe der Binärdatei aufzulisten und sie dann zu verbieten.
Im folgenden Beispiel werden die Systemaufrufe von uname
entdeckt:
Wenn Sie Docker nur verwenden, um eine Anwendung zu starten, können Sie sie mit strace
profilieren und nur die benötigten Systemaufrufe zulassen.
Beispiel für eine Seccomp-Richtlinie
Um das Seccomp-Feature zu veranschaulichen, erstellen wir ein Seccomp-Profil, das den Systemaufruf "chmod" deaktiviert, wie unten dargestellt.
Im obigen Profil haben wir die Standardaktion auf "allow" gesetzt und eine Blacklist erstellt, um "chmod" zu deaktivieren. Um sicherer zu sein, können wir die Standardaktion auf "drop" setzen und eine Whitelist erstellen, um selektiv Systemaufrufe zu aktivieren. Die folgende Ausgabe zeigt den Aufruf von "chmod", der einen Fehler zurückgibt, weil er im Seccomp-Profil deaktiviert ist.
Der folgende Output zeigt das Ergebnis von "docker inspect", das das Profil anzeigt:
Deaktivieren Sie es in Docker
Starten Sie einen Container mit der Option: --security-opt seccomp=unconfined
Ab Kubernetes 1.19 ist seccomp standardmäßig für alle Pods aktiviert. Die Standard-Seccomp-Profil, das auf die Pods angewendet wird, ist das "RuntimeDefault" Profil, das vom Container-Runtime (z.B. Docker, containerd) bereitgestellt wird. Das "RuntimeDefault" Profil erlaubt die meisten Systemaufrufe, blockiert jedoch einige, die als gefährlich oder für Container im Allgemeinen nicht erforderlich angesehen werden.
Last updated