Docker ermöglicht es Softwareentwicklern und DevOps-Ingenieuren, Anwendungen schnell für die Produktion zu verpacken. Docker-Container arbeiten weitgehend unabhängig von ihrem Host, sind aber nicht immun gegen Sicherheitsbedrohungen. So überprüfen Sie Ihre Docker Engine-Installation, um maximale Sicherheit für Ihren Host und Ihre Workloads zu gewährleisten.
Die Architektur von Docker verstehen
Der erste Schritt zur Bewertung von Docker-Risiken besteht darin, zu verstehen, wie die Technologie tatsächlich funktioniert. Docker basiert auf drei verschiedenen Komponenten:
- Docker Engine-Daemon – Der Hintergrunddienst, der Operationen hinter den Kulissen mit Containern und Bildern verwaltet.
- REST-API – Docker Engine stellt eine REST-API bereit, die Befehle an den Docker-Daemon sendet. Die API wird normalerweise über einen REST-Socket bereitgestellt, kann aber auch über HTTP verfügbar gemacht werden.
- Docker-Befehlszeilenclient – Die Docker-CLI wird ausgeführt, wenn Sie
docker
verwenden in einem Endgerät. Es sendet Befehle an den Docker-Daemon. Befehle werden verarbeitet, um die auszuführende Aktion zu bestimmen.
Ein Angreifer, der eine dieser Komponenten kompromittiert, könnte sich Zugriff auf Ihre Umgebung verschaffen. Durch die richtige Konfiguration können Sie Ihre Workloads schützen und erhöhen Sicherheit im Vergleich zur Ausführung von Anwendungen direkt auf dem Host.
Die Angriffsfläche
Der Docker-Daemon bietet die größte Angriffsfläche. Wenn Sie die Kontrolle über den Daemon erlangen, erhalten Sie Zugriff auf den Host und alle Ihre Container. Der Daemon läuft normalerweise als root
, sodass eine erfolgreiche Infiltrierung uneingeschränkten Zugriff auf Ihren physischen Computer gewähren kann.
Sie sollten sicherstellen, dass der Docker-Daemon-Socket (/var/run/docker.sock
) ist für niemanden außer root
zugänglich Benutzer. Da der Daemon auf den Host zugreifen kann, gibt der Zugriff auf den Socket effektiv die Kontrolle über Ihre Maschine ab.
Der Daemon von Docker unterstützt einen TCP-Socket, der die Fernsteuerung über das Netzwerk ermöglicht. Wenn Sie diese Funktion aktivieren, wird eine unverschlüsselte Kommunikation ohne Authentifizierung angeboten.
Vermeiden Sie die Verwendung von TCP-Verbindungen, es sei denn, Sie befinden sich in einer Netzwerkumgebung, die Sie speziell als sicher konfiguriert haben. Sie sollten TLS einrichten und sicherstellen, dass nur autorisierte Clients eine Verbindung herstellen dürfen.
Bei einigen Docker-Images müssen Sie möglicherweise den Docker-Socket in den Container einbinden. Dies wird häufig von Docker-Verwaltungstools verwendet, die eine Schnittstelle zu Containern bereitstellen, die auf Ihrem Host ausgeführt werden. Wenn Sie den Sockel auf diese Weise montieren, kann alles im Container die Kontrolle über Ihr System erlangen. Container sollten niemals einen Docker-Socket erhalten, es sei denn, Sie sind sicher, dass die Arbeitslast einen erfordert.
Rootless-Modus
Docker unterstützt jetzt einen Rootless-Modus, mit dem Sie Docker ohne root
ausführen können Zugriff. Dies trägt zur Verbesserung der Sicherheit bei, ist jedoch mit zusätzlicher Komplexität bei der Einrichtung verbunden.
Bei Verwendung des Rootless-Modus werden Docker und Ihre Container in einem Benutzernamensraum ausgeführt. Die meisten Docker-Funktionen funktionieren, obwohl es einige Einschränkungen gibt.
Nicht jeder Speichertreiber ist verfügbar, Overlay-Netzwerke werden nicht unterstützt und Container-Netzwerke sind vollständig benannt. Das bedeutet, dass Sie vom Host aus nicht direkt auf Container-IPs zugreifen können, ohne zuerst den dedizierten Netzwerk-Namespace einzugeben.
Die Verwendung des Rootless-Modus kann in Hochsicherheitsumgebungen hilfreich sein, in denen die Integrität des Hosts von größter Bedeutung ist. Es trägt dazu bei, die Auswirkungen eines erfolgreichen Angriffs zu verringern, indem die Möglichkeiten zur Manipulation des gesamten Systems eingeschränkt werden.
REST-API-Sicherheit
Auf die Docker-REST-API wird normalerweise über einen UNIX-Socket zugegriffen. Berechtigungsprüfungen werden mit Standard-UNIX-Mechanismen durchgeführt.
Sie können die API über einen TCP-Socket verfügbar machen und so den Zugriff über HTTP ermöglichen. Dies erhöht das Risiko einer Kompromittierung. Sie sollten sicherstellen, dass Ihre Netzwerkzugriffskontrollen so eingestellt sind, dass Datenverkehr nur von genehmigten Hosts stammen kann.
Sie sollten Ihre Firewall-Richtlinien überprüfen, damit Sie kein Gerät übersehen, das mit der Docker-API interagieren könnte. Denken Sie daran, Verbindungen auf localhost
zu beschränken ist nicht ausreichend – dies würde immer noch den Zugriff aus Docker-Containern erlauben, die auf Ihrem Computer ausgeführt werden, was möglicherweise eine unbeabsichtigte Rechteausweitung ermöglicht.
Einschränken der Kommunikation zwischen Containern
Docker ermöglicht es allen Containern, über den Standard docker0
miteinander zu kommunizieren überbrücktes Netzwerk. Ein kompromittierter Container könnte in diesem Netzwerk herumschnüffeln, um mehr über seine Umgebung zu erfahren. Es könnte das Bridge-Netzwerk als Ausgangspunkt nutzen, um eine breitere Infiltration Ihrer Workloads zu beginnen.
Das Deaktivieren der Kommunikation zwischen Containern verbessert Ihren Sicherheitsstatus, indem die Containerisolation verbessert wird. Sie müssen Container mithilfe von --link=ContainerName
explizit miteinander verknüpfen Flag oder Ihr eigenes Docker-Netzwerk.
Führen Sie den Docker-Daemon mit --icc=false
aus -Flag, um die Kommunikation über docker0
zu deaktivieren Brücke.
Conainer-Fähigkeiten einschränken
Linux-Kernel-Fähigkeiten definieren die Aktionen, die Benutzern mit root
zur Verfügung stehen Zugriff. Fähigkeiten helfen, Prozesse zu sperren, die als root
ausgeführt werden , wie Docker-Container. Jeder Prozess sollte mit den erforderlichen Mindestfunktionen ausgestattet werden.
Docker führt automatisch Container mit einer begrenzten Auswahl an Funktionen aus. Selbst diese Liste ist für eine einfache Arbeitslast wie einen Webserver oft zu lang. Sie können es weiter einschränken, indem Sie Ihre eigene Liste von Fähigkeiten angeben, die einem Container zur Verfügung stehen.
docker run --cap-drop all --cap-add SYSLOG example-image:latest
Der obige Befehl führt einen Container nur mit dem SYSLOG
aus Fähigkeit. Der --cap-drop
Flag ignoriert die Standardfähigkeitsliste. Fähigkeiten werden dann mit --cap-add
wieder hinzugefügt , Erstellen einer Whitelist.
Es lohnt sich, Ihren Container anhand der Kernel-Fähigkeitsliste zu bewerten. Löschen Sie ungenutzte Funktionen aus Containern, die in der Produktion ausgeführt werden. Dies trägt dazu bei, den Schaden zu begrenzen, den ein kompromittierter Container verursachen kann.
Integrierte Kernelfunktionen aktivieren
Ignorieren Sie nicht die in Ihren Kernel integrierten Sicherheitsfunktionen. Docker funktioniert mit bestehenden Technologien wie AppArmor und SELinux.
Einige Distributionen wie RedHat Linux verfügen über vordefinierte SELinux-Systemrichtlinien, die die Sicherheit von Docker erhöhen. Sie können die SELinux-Unterstützung manuell hinzufügen, indem Sie den Docker-Daemon mit --selinux-enabled
ausführen Flagge. Dadurch wird eine Docker-Richtlinie aktiviert, um SELinux-Labels auf Ihren Containern festzulegen. SELinux bietet eine bessere Isolierung von Containerprozessen von Hostprozessen und verbessert so Ihre Sicherheitslage.
Die Grundlagen
Es ist leicht, sich auf die komplizierten Aspekte der Docker-Sicherheit zu konzentrieren:Rootless-Modus, Daemon-Zugriff und Container-Kommunikation. Vergessen Sie jedoch nicht die Grundlagen – die Standardsicherheitspraktiken gelten weiterhin.
Halten Sie Docker Engine immer auf dem neuesten Stand, damit Sie über die neuesten Fehlerbehebungen verfügen. Sie sollten auch sicherstellen, dass der Kernel Ihres Hosts vollständig gepatcht ist. Da Container denselben Kernel wie Ihr Host verwenden, könnten alle Schwachstellen von Ihren containerisierten Anwendungen ausgenutzt werden.
Es hat sich bewährt, Docker auf einer bestimmten physischen Maschine oder VM auszuführen. Führen Sie keine anderen Dienste direkt auf dem Host aus. Sie können sie stattdessen als Container ausführen, wodurch die Auswirkungen einer erfolgreichen Hostkompromittierung verringert werden.
Bei korrekter Konfiguration erhöht Docker die Sicherheit, indem Anwendungen isoliert werden. Wenn Sie sich die Zeit nehmen, Ihre Position einzuschätzen, können Sie potenzielle Risiken erkennen und verstehen, wie Angriffe beginnen könnten. Container-Privilegien zu sperren, den Docker-Daemon zu schützen und Ihren Host auf dem neuesten Stand zu halten, wird Ihnen helfen, Ihre Container zu härten.