Seccomp in Docker

Sicherheit ist eines der Hauptanliegen bei der Nutzung von Containern, besonders in Produktionsumgebungen. Docker bietet zahlreiche Mechanismen, um die Sicherheit von Containern zu gewährleisten. Ein mächtiges Werkzeug in diesem Kontext ist Seccomp (Secure Computing Mode). In diesem Tutorial zeige ich dir, was Seccomp ist, wie du es mit Docker einsetzt und wie du maßgeschneiderte Seccomp-Profile erstellen kannst.

Was ist Seccomp?

Seccomp ist eine Sicherheitsfunktion im Linux-Kernel, die es ermöglicht, die Systemaufrufe (Syscalls), die ein Prozess ausführen darf, zu beschränken. Das Ziel von Seccomp ist es, den Angriffsvektor eines Containers zu minimieren, indem nur die unbedingt notwendigen Systemaufrufe zugelassen werden. Dadurch wird das Risiko verringert, dass ein Angreifer durch Ausnutzung von Schwachstellen im Betriebssystem tiefer in das System eindringen kann.

Docker verwendet standardmäßig ein Seccomp-Profil, um die Anzahl der erlaubten Syscalls zu begrenzen, was die Sicherheit von Containern deutlich erhöht.

Seccomp im Docker-Kontext

Jeder Prozess in einem Docker-Container benötigt Zugriff auf Systemressourcen wie Dateien, Speicher und Netzwerke. Diese Zugriffe erfolgen über Systemaufrufe (Syscalls). Wenn ein Container ausgeführt wird, führt Docker diesen mit einem standardmäßigen Seccomp-Profil aus, das ungefähr 44 unsichere Systemaufrufe blockiert.

Mit einem angepassten Profil können wir jedoch präzise festlegen, welche Syscalls zugelassen oder blockiert werden sollen.

Seccomp-Profil in Docker nutzen

Docker verwendet standardmäßig ein integriertes Seccomp-Profil, um Container abzusichern. Dieses Profil ist gut geeignet für die meisten Anwendungsfälle, kann aber bei speziellen Anforderungen angepasst werden. Um ein Container mit dem Standardprofil zu starten, brauchst du nichts weiter zu tun – Docker wendet das Profil automatisch an.

Hier ist ein Beispiel für das Starten eines Containers:

docker run -it ubuntu

Dies führt den Container mit dem standardmäßigen Seccomp-Profil aus.

Seccomp-Profil deaktivieren

In manchen speziellen Fällen, etwa für Tests oder bestimmte Anwendungen, musst du möglicherweise das Seccomp-Profil deaktivieren. Dies sollte jedoch nur mit Vorsicht geschehen, da die Sicherheitsvorkehrungen damit erheblich reduziert werden.

docker run --security-opt seccomp=unconfined -it ubuntu

Mit der Option seccomp=unconfined wird das Seccomp-Profil vollständig deaktiviert und alle Syscalls sind für den Container verfügbar.

Ein benutzerdefiniertes Seccomp-Profil erstellen

Das Standard-Seccomp-Profil von Docker kann auf die spezifischen Anforderungen deiner Anwendung angepasst werden. Hier ist ein schrittweises Vorgehen, wie du ein benutzerdefiniertes Profil erstellst.

1. Erstellen des Seccomp-Profils

Zunächst musst du das Standardprofil exportieren, um es als Ausgangspunkt für deine Änderungen zu verwenden. Dies kannst du mit folgendem Befehl tun:

docker run --rm docker/cli --seccomp-default > seccomp-default.json

Das Profil wird in einer JSON-Datei gespeichert. Du kannst es mit einem Texteditor öffnen und anpassen. Ein Seccomp-Profil besteht aus einer Liste von Syscalls, die entweder zulassen oder blockieren.

Ein Beispielausschnitt:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "archMap": [
        {
            "architecture": "SCMP_ARCH_X86_64",
            "subArchitectures": []
        }
    ],
    "syscalls": [
        {
            "names": ["getcwd"],
            "action": "SCMP_ACT_ALLOW"
        },
        {
            "names": ["clone"],
            "action": "SCMP_ACT_ERRNO"
        }
    ]
}
  • SCMP_ACT_ALLOW: Erlaubt den entsprechenden Syscall.
  • SCMP_ACT_ERRNO: Blockiert den Syscall und gibt einen Fehler zurück.

2. Anpassen des Profils

Um dein eigenes Profil zu erstellen, musst du nur die Syscalls, die du zulassen oder blockieren möchtest, entsprechend anpassen. Beispiel: Du kannst den Syscall openat erlauben, indem du ihn der Liste hinzufügst.

{
    "names": ["openat"],
    "action": "SCMP_ACT_ALLOW"
}

3. Container mit dem benutzerdefinierten Profil starten

Nachdem du das Profil bearbeitet hast, kannst du den Container mit diesem Profil starten. Dazu verwendest du den folgenden Befehl:

docker run --security-opt seccomp=seccomp-profile.json -it ubuntu

Hierbei gibt der Pfad seccomp-profile.json an, dass der Container mit deinem angepassten Seccomp-Profil gestartet wird.

Wichtige Überlegungen bei der Verwendung von Seccomp

  1. Sicherheitsauswirkungen: Ein falsch konfiguriertes Profil kann dazu führen, dass kritische Funktionen deiner Anwendung blockiert werden. Achte darauf, dass du nur die absolut notwendigen Syscalls zulässt.
  2. Testen: Bevor du dein Profil in einer Produktionsumgebung einsetzt, solltest du es in einer Testumgebung gründlich testen, um sicherzustellen, dass alle benötigten Funktionen deiner Anwendung weiterhin wie erwartet arbeiten.
  3. Sicherheitsopt-In: Die Nutzung von Seccomp ist keine Pflicht, aber ein empfehlenswertes Werkzeug zur Reduzierung der Angriffsfläche.

Fazit

Seccomp ist ein mächtiges Werkzeug, um die Sicherheit von Docker-Containern zu erhöhen. Durch die Beschränkung der verfügbaren Syscalls kannst du potenzielle Sicherheitslücken minimieren und deine Container besser absichern. Die Möglichkeit, ein benutzerdefiniertes Seccomp-Profil zu erstellen, gibt dir die volle Kontrolle darüber, welche Funktionen zugänglich sind, während nicht benötigte Funktionen blockiert werden.

Mit der richtigen Anwendung von Seccomp kannst du die Sicherheit deiner Docker-Container auf ein neues Level heben und gleichzeitig sicherstellen, dass deine Anwendung wie gewünscht funktioniert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert