Was ist Docker-Container-Sicherheit?
Docker ist eine großartige Sache und kann Ihnen viel Zeit und Mühe sparen.
Lernen Sie, wie Sie Docker so sicher wie möglich einsetzen und potenzielle Bedrohungen frühzeitig erkennen können, um die Sicherheit von Docker-Containern zu gewährleisten.
Wir haben bereits erläutert, wie Sie die beliebte Container-Orchestrierungslösung Kubernetes absichern können. Dieses Mal steigen wir tiefer ein: In diesem Artikel erfahren Sie, wie Sie die bekannte Containerisierungsplattform Docker effektiv schützen. Wenn Sie noch nach Unterschieden zwischen diesen beiden Technologien suchen, empfehlen wir Ihnen, den Artikel „Kubernetes vs Docker“ von Ubuntu zu lesen.
Möchten Sie alle modernen Aspekte der Docker-Container-Sicherheit eingehend verstehen? Lesen Sie diesen Artikel aufmerksam durch und bookmark ihn, um später darauf zurückzukommen. Wir aktualisieren diese Seite regelmäßig.
Docker hat die Welt der Container schnell erobert und sich innerhalb weniger Jahre von einem Add-on zu einem System für das Starten, Orchestrieren, Clustering, Konfigurieren, Bereitstellen und Erstellen von Containern mit Software entwickelt, wodurch das Thema Docker-Containersicherheit sehr relevant geworden ist. Docker verfügt auch über eine einfache Schnittstelle zur Steuerung von Ressourcenbeschränkungen. Docker basiert auf Linux-Namespaces, die es ermöglichen, Systemressourcen wie Netzwerk, Prozesse, Mountpunkte und Benutzer zu isolieren und zu virtualisieren.
Dadurch können wir jeden Prozess vollständig isoliert starten, sowohl vom System selbst als auch von anderen Containern, in unserer einzigartigen Softwareumgebung mit eigenem Netzwerk, Prozessbaum, Dateisystem und Netzwerk. Zunächst lohnt es sich, zu verstehen, was Container sind: Es handelt sich um robuste Objekte, die Belastungen während der Lagerung, Verladung und des Transports standhalten und den Inhalt im Inneren schützen.
Vielleicht kommt Ihnen auch das Bild eines Hafens in den Sinn, in dem Tausende von Containern in Reihen übereinander gestapelt sind. Die meisten Güter werden in solchen Containern transportiert, da sie nicht nur langlebig, sondern auch standardisiert, leicht zu lagern und zu transportieren sind, während die meisten an der Lieferung Beteiligten keine Ahnung haben, was sich darin befindet, da dies für die Lieferung keine Rolle spielt.
Das Prinzip von Software-Containern ist ähnlich, da es sich um unveränderliche, isolierte Images mit Software handelt, deren Funktionalität meist über eine API verfügbar ist. Es ist eine moderne Lösung für den zuverlässigen Betrieb von Software in nahezu jeder Umgebung. Die Docker-basierte Container-Virtualisierung ist äußerst beliebt, da sie die schnelle Bereitstellung von Softwareentwicklungs- und Testtools oder ganzer Projekte aus vielen Komponenten ermöglicht.
Und alles wäre in Ordnung, wenn es nicht eine ganze Reihe spezifischer Bedrohungen gäbe. Dazu gehören die Möglichkeit, aus dem Container in das Host-System zu entkommen, das Herunterfahren der Instanz infolge eines Denial-of-Service-Angriffs, Fälle, in denen Schwachstellen des Betriebssystemkerns ausgenutzt werden, sowie das Einfügen vorab kompromittierter Referenzimages in das Repository und ähnliche Angriffe.
Was ist ein Docker-Container?
Docker ist eine Software zur Automatisierung der Bereitstellung und Verwaltung von Anwendungen in containerisierten Umgebungen. Die Software ermöglicht es Ihnen, jede Anwendung mit ihrer gesamten Umgebung und allen Abhängigkeiten in einen speziellen Container zu verpacken.
Somit enthält jeder von uns erstellte Container bereits alles, was für die Funktion der Anwendung erforderlich ist – Bibliotheken, Systemtools, Code und die Laufzeitumgebung. Mit Docker können DevOps-Administratoren und Entwickler ihre Anwendungen schnell in jeder Umgebung bereitstellen, skalieren und ausführen, während sie sicherstellen, dass der von ihnen geschriebene Code reibungslos funktioniert.
Docker verfügt über viele Funktionen, die auch herkömmliche Virtualisierungssysteme bieten, wie z. B. Unabhängigkeit – ein Container kann mit einem zuvor eingerichteten Docker-Dienst auf jedes Betriebssystem verschoben und mit einem Befehl gestartet werden – sowie Selbstständigkeit, da der Container überall, unabhängig vom Startort, alle ihm zugewiesenen Funktionen ausführt, ohne zusätzliche Konfiguration oder Dienste.
Im Gegensatz zur traditionellen Virtualisierung, bei der wir das Image in der Regel selbst erstellen, arbeitet Docker mit Images aus Repositories. Es gibt öffentliche und private Repositories mit offiziellen und inoffiziellen Images. In der Dokumentation werden sie als docker registry bezeichnet, und das beliebteste und am häufigsten verwendete Repository ist heute Docker Hub.
Vergleich von Docker und VM
Ein Docker-Image ist eine sequenzielle Reihe von Software-Schichten. Jede Schicht ist das Ergebnis eines Befehls im Dockerfile. Das Image ist also die Vorlage, auf deren Grundlage wir den Container starten. Alles, was auf der Grundlage dieses Images gestartet wird, ist der Container selbst. Dadurch verfügt Docker über eine sehr nützliche Funktion, die es ermöglicht, mehrere identische Kopien dieses Images aus einem vorbereiteten Image, also Containern, auszuführen.
Die Sicherheit von Docker-Containern hat leider, wie jede andere Software, ihre eigenen Schwachstellen und Mängel, die von Hackern ausgenutzt werden können: falsch konfigurierte Root-Konten, die Container gefährden, legale Images mit vorbereiteten Hintertüren, funktionierende PoC-Exploits sowie ein sehr aktueller kritischer Fehler, für den noch kein Patch verfügbar ist.
Häufige Docker-Sicherheitsprobleme
1. Sicherheit des Host-Systems. Eines der einfachsten und gleichzeitig wichtigsten Sicherheitsprobleme für Docker ist die Sicherheit des Host-Systems, insbesondere des Betriebssystem-Kernels. Tatsächlich helfen Isolation und andere Container-Sicherheitsmechanismen, die wir nutzen könnten, in einem bereits kompromittierten System wahrscheinlich nicht. Wenn das Host-Betriebssystem nicht ordnungsgemäß gesichert ist, kann auch der Container in Docker nicht gesichert werden. Dementsprechend sollten Best Practices zur Sicherheit des Host-Betriebssystems befolgt werden.
Es wäre sinnvoll, mehrere Überprüfungen auf das Vorhandensein von Schwachstellen durchzuführen. Dies liegt daran, dass Docker so konzipiert ist, dass alle laufenden Container den Host-Kern verwenden. Daher muss der Host eine gepatchte, aktualisierte Linux-Distribution ohne bekannte Schwachstellen oder Anzeichen einer Malware-Infektion sein.
Ein klassisches Beispiel für einen solchen Fall ist das Entkommen aus einem Docker-Container. In der offiziellen Dokumentation wird dieser Fehler als Container Breakout bezeichnet und beschreibt eine Situation, in der ein im Container ausgeführtes Programm die Isolationsmechanismen überwindet und Root-Rechte oder Zugriff auf wichtige Informationen auf dem Host erhält. Zur Implementierung des Schutzes vor solchen Situationen wird die Regel zur Reduzierung der Rechte des Containers angewendet, die ihm standardmäßig zugewiesen sind. Wenn also der Docker-Daemon unter Root läuft, erstellen wir dafür einen Benutzernamespace mit minimalen Rechten.
2. Erschöpfung der Ressourcen oder DDoS pro Container. Im Vergleich zu virtuellen Maschinen sind Container leichter. Selbst auf altem und schwachem Hardware können viele Container ausgeführt werden. Fehler in der Konfiguration von Daemons, dem Netzwerkstack, architektonische Mängel können jedoch zu einer Denial-of-Service-Situation führen.
Beispielsweise kann ein bestimmter Container oder ein ganzer Pool von Containern alle CPU-Ressourcen des Hosts verbrauchen und dessen Leistung beeinträchtigen. Eine ähnliche Situation kann bei Netzwerkschnittstellen auftreten, wenn die Anzahl der generierten Pakete die normale Netzwerkbandbreite überschreitet. Der Ausweg ist hier jedoch ganz einfach: Sie müssen lediglich die Ressourcenbeschränkungen für den Container richtig konfigurieren.
3. Ein Ausstieg außerhalb des Docker-Containers. Diese Situation ist in Docker-Containern weit verbreitet, die eine große Menge an Software von Drittanbietern enthalten. Da deren Inhalt schwer zu untersuchen ist und nur wenige sich dafür interessieren, kann er bösartigen Code enthalten, der in der Lage ist, alle implementierten Einschränkungen und Sicherheitsrichtlinien zu umgehen.
Auf diese Weise werden Daten mit eingeschränktem Zugriff kompromittiert. Um dieses Docker-Sicherheitsproblem zu beheben, kann man einen ernsthaften Ansatz verfolgen, um die Berechtigungen für jeden einzelnen Container zu beschränken, auch auf Kosten eines benutzerdefinierten Namespace.
4. Die Authentizität von Docker-Images. Seien Sie vorsichtig bei der Verwendung von Docker-Images, die im Web verfügbar sind. Sie können bösartigen versteckten Code enthalten. Überprüfen Sie sie immer auf ihren Inhalt.
Es ist zu beachten, dass die Kapselungsmethode in diesem Fall wirkungslos ist. Selbst selbst erstellte Images können nach dem Erstellen durch Software von Drittanbietern verändert werden. Überprüfen Sie daher immer die endgültige Version.
So sorgen Sie für die Sicherheit von Docker-Containern
Transport Layer Security. Beschränken Sie die Verbindungen zum Docker-Daemon für Benutzer mit Zugriff auf die TLS-Konten des Clients. Legen Sie fest, welche Befehle für welchen Benutzer erlaubt sind, und erstellen Sie das entsprechende Autorisierungs-Plugin für Docker. Verweisen Sie beim Starten des Docker-Daemons auf das erstellte Plugin.
Geheimnisse in Docker. Vertrauliche Informationen sollten als Geheimnisse gespeichert werden, die mit dem Befehl docker service create erstellt wurden. Wenn Sie die Option „icc”: false zur Konfigurationsdatei in /etc/docker/daemon.json hinzufügen, wird die Kommunikation zwischen Containern deaktiviert, um unnötige Informationslecks zu vermeiden.
Daemon-Parameter. Der Docker-Daemon startet mit einer Reihe von Standardoptionen.
- live-restore- Container ohne Daemons, um die Verfügbarkeit nach dem Herunterfahren oder Neustart zu maximieren. Diese Option erleichtert die Installation von Updates und Patches, indem sie Ausfallzeiten minimiert.
- userland-proxy = falseWenn Hairpin-NATs verfügbar sind oder verwendet werden, werden benutzerdefinierte Proxys überflüssig und erhöhen nur das Angriffsziel.
- seccomp-profile/path/to/profile Mit dieser Option können Sie ein benutzerdefiniertes seccomp-Profil hinzufügen.
- no-new-privileges- Verhindern Sie, dass Container zusätzliche Berechtigungen über suid oder sguid erhalten.
Konfigurationsdatei und Container. Stellen Sie sicher, dass für den Container ein Benutzer erstellt wurde und dass der Container unter diesem Benutzer und nicht unter root ausgeführt wird. Falls ein Fernzugriff erforderlich ist, sichern Sie diesen mit Zertifikaten ab; andernfalls erlauben Sie keinen Fernzugriff auf den Daemon.
Isolieren eines benutzerdefinierten Namespace. Es ist besonders wichtig, sicherzustellen, dass der benutzerdefinierte Namespace in Docker isoliert ist, da er standardmäßig mit dem Host-Namespace geteilt wird. In einigen Fällen kann eine solche Funktion dazu genutzt werden, Berechtigungen zu erweitern oder sogar den Container zu verlassen. Sie können Ihren benutzerdefinierten Namespace isolieren, indem Sie die Konfigurationsdatei wie oben im Abschnitt „Docker-Konfigurationsdatei“ beschrieben bearbeiten. Die Isolierung wird erneut betont, um die Bedeutung dieser Maßnahme hervorzuheben.
Netzwerkschnittstellen. Standardmäßig hört Docker auf alle Netzwerkschnittstellen. Da in den meisten Fällen der Datenverkehr nur auf einer Schnittstelle erwartet wird, wird der Angriffsbereich unnötig vergrößert. Auf diese Weise können Sie beim Starten eines Containers die Ports des Containers an bestimmte Host-Schnittstellen binden.
Socket. Führen Sie niemals Docker-Sockets innerhalb eines Containers aus, da dies die Ausführung von Docker-Befehlen im Container ermöglicht und somit die Interaktion mit und die Verwaltung des Host-Betriebssystems ermöglicht.
Docker Trust. Mit diesem Werkzeug können Sie Schlüssel generieren, um die kryptografische Integrität von Images zu überprüfen. Diese Schlüssel können verwendet werden, um Images mit privaten Schlüsseln zu signieren, die mit öffentlichen Schlüsseln auf dem Notary Server überprüft werden.
Präventive Überprüfungen. Healthcheck ist ein leistungsstarkes Tool zur Überprüfung der Integrität eines Containers und kann im Dockerfile konfiguriert werden. Alternativ können Sie ImmuniWeb Discovery verwenden, ein universelles Tool zur Überprüfung der Angriffsfläche des Informationssystems Ihrer Organisation. Diese Überprüfungen sollten regelmäßig durchgeführt werden, um sicherzustellen, dass der Container korrekt funktioniert und die Sicherheit von Docker-Containern gewährleistet ist.
Scannen nach Schwachstellen. Docker Enterprise verfügt über einen integrierten Schwachstellenscanner, der die Option bietet, die CVE-Datenbank herunterzuladen und offline auszuführen, um Images zu scannen. Das kontinuierliche Scannen von Images erhöht die Sicherheit von Docker-Containern, wenn Sie rechtzeitig auf das Auftreten von Schwachstellen reagieren.
Richtlinie. Die Auswahl einer spezifischen Richtlinie basierend auf Ihren Anforderungen oder sogar die Verwendung mehrerer Richtlinien ist eine gute Gelegenheit, so viele Schwachstellen wie möglich zu finden. Allerdings sind nicht alle Schwachstellen gleich und gelten für Anwendungen, Container oder Umgebungen, daher müssen Sie nicht nur deren Schweregrad, sondern auch die Faktoren betrachten, aus denen dieser Schweregrad berechnet wird.
Dazu gehören Angriffsvektor, Angriffs-Schweregrad, Auswirkungen auf die Vertraulichkeit, Auswirkungen auf die Integrität und so weiter. Diese Faktoren bilden dann mithilfe des CVSS-Calcators die endgültige Schweregrad-Bewertung. Die Metrikwerte lauten: none, low, medium, high und critical. Weitere Informationen hierzu finden Sie auf der NIST-Website.
Einige Sicherheitslücken in Docker-Containern lassen sich leicht beheben, aber nicht immer. Bei Problemen mit Basisimages oder integrierten Paketen liegt die Verantwortung bei den Softwareentwicklern. Dennoch müssen Sie die Ausnutzung bestehender und zukünftiger Schwachstellen verhindern oder zumindest mindern.
Zusammenfassung
Docker ist als Grundlage für die Virtualisierung von Hardwareanwendungen ein unverzichtbares Werkzeug für jeden modernen Entwickler. Diese Technologie verfügt über umfangreiche Funktionen und Möglichkeiten zur Prozesssteuerung. Mit Docker können Sie nicht nur Container bereitstellen, sondern auch deren Instanzen schnell skalieren, mit Multi-Container-Docker-Compose-Anwendungen arbeiten und mehrere Docker-Hosts zu einem einzigen Docker-Swarm-Cluster zusammenfassen.
Docker zeichnet sich durch eine relativ einfache Syntax aus, sodass es sowohl für erfahrene IT-Fachleute als auch für Anfänger recht einfach zu erlernen ist. Die Software ist mit allen Versionen der Betriebssysteme Linux und Windows kompatibel, sodass der Anwendungsbereich von Docker praktisch unbegrenzt ist. Allerdings kann jede Komponente eine Schwachstelle darstellen: die im Docker-Container installierten Pakete, die verwendeten Bibliotheken und sogar das Basisimage.
Wenn es um Sicherheitsprobleme von Docker-Containern geht, ist es immer ratsam, bereits im Voraus darauf zu achten und Schwachstellen zu vermeiden, bevor sie zu einem echten Problem werden. Diese Tools sind benutzerfreundlich, sodass jeder Entwickler sie in seinen täglichen Arbeitsablauf integrieren oder in seine Build- und Deployment-Pipeline einbinden kann.
Weitere Ressourcen
- Erfahren Sie mehr über KI-gestütztes Angriffsflächenmanagement mit ImmuniWeb® Discovery.
- Erfahren Sie mehr über KI-gestützte Penetrationstests für Anwendungen mit ImmuniWeb.
- Erfahren Sie mehr über die Möglichkeiten des ImmuniWeb Partner Programms.
- Folgen Sie uns auf LinkedIn, X, Telegram und WhatsApp