zhu difeng - Fotolia
5 Tipps, um Ihre Docker-Images noch sicherer zu machen
Mit Docker-Images holen Administratoren sich schnell Sicherheitslücken in ihre Umgebungen. In diesem Artikel stellen wir fünf bewährte Methoden vor, wie Sie das vermeiden können.
Virtualisierte Workloads werden immer beliebter und Cyber-Kriminelle haben sich darauf eingestellt. Containerisierte Anwendungen mögen zwar besser gesichert sein als je zuvor, DevOps-Experten müssen trotzdem proaktiv daran arbeiten, diesen Bedrohungen entgegenzuwirken, bevor sie gefährlich werden.
Docker ist und bleibt die am weitesten verbreitete Container-Laufzeitumgebung. Und Docker-Images sind vielfältig – aber keineswegs unangreifbar. Allein im Jahr 2019 enthielten die zehn beliebtesten Docker-Images mehr als 30 Schwachstellen – wobei Node-Images für ganze 580 Betriebssystemschwachstellen verantwortlich waren.
Um solche Risiken zu minimieren, zeigen wir in diesen Best Practices einige der wichtigsten Wege zur Absicherung einzelner Docker-Container und des gesamten Ökosystems.
1. Minimieren Sie Images
Bevor Sie sich für ein Image und ein Laufzeitbetriebssystem entscheiden, stellen Sie sicher, dass das bevorzugte Image die gewünschten Anforderungen erfüllt. Vertraute Technologien sind für ein Entwicklerteam optimal. Aber was, wenn Sie die Wahl zwischen verschiedenen Basis-Images haben?
In diesem Fall sollten Sie möglichst dem kleinsten Image den Vorzug geben – und am besten kein vollwertiges Image eines kompletten Betriebssystems wählen, da diese zahlreiche Bibliotheken, Abhängigkeiten und Tools enthalten. Die somit zusätzlich gewonnene Flexibilität ist zwar von Vorteil, vergrößert aber die Angriffsfläche eines Containers dramatisch.
Wenn eine Image-Suche wenig relevante Treffer für Ihr Projekt ergibt, ist es am besten, woanders zu suchen. Entwickler können Tools wie Buildah und Buildkit verwenden, um Images mit eigenen Abhängigkeiten oder Paketen zu erstellen. Buildah spart auch den Docker-Daemon-Prozess aus; dies kommt größeren Entwicklungsprojekten zugute und reduziert die Anforderungen an die Berechtigungen erheblich. Allerdings ist dieser Prozess aufgrund seiner Open-Socket-Kommunikation ein beliebtes Ziel von Angriffen.
Bei der großen Auswahl an Linux-Distributionen ist es einfach, eine passende zu finden, die nicht viel zusätzlichen Schnickschnack enthält. Alpine Linux Images sind beispielsweise nur 5 MB groß und weisen keine offensichtlichen Schwachstellen auf. Sie sind also eine gute Wahl, falls sie zu Ihren sonstigen Anforderungen passen.
2. Entscheiden Sie sich für mehrstufige Builds
Es ist oft optimal, verschiedene Images für die Test- und Produktionsphase zu nutzen. Test-Images brauchen keine Compiler, kein Build-System und kein Debugging. Diese Aufgaben sind bereits erledigt, und die Tools somit für Sie überflüssig.
Der Einsatz mehrstufiger Builds erleichtert Ihnen auf Dauer die Pflege von Docker-Dateien und die Replikation von Artefakten. FROM-Anweisungen können auf mehrere Basis-Images angewendet werden – das macht es einfach, wichtige Artefakte zu kopieren und zu entfernen. Eine sorgfältige Auswahl von Artefakten verringert die Anzahl der Schwachstellen in der gesamten Infrastruktur.
3. Angemessene Verwaltungsberechtigungen einrichten
Wie bei jedem verwalteten System sollten Sie die Konfiguration von Docker-Images nur vertrauenswürdigen Benutzern erlauben. Jedes Image erhält dafür seine eigenen dedizierten Gruppen und Benutzer. Darüber hinaus sollten Benutzer mit Zugriff auf Anwendungskonfigurationen nur die dafür erforderlichen Berechtigungen besitzen – und sonst keine. Die selben Benutzer sollten außerdem die zugehörigen Prozesse ausführen.
Node.js-Images werden zum Beispiel mit einem generischen Benutzer ausgeliefert. Auch Nutzer, die keinen Root-Zugriff haben, können den Docker-Daemon ausführen. Sie haben weniger Privilegien und können dem System somit auch weniger Schaden zufügen – sei es aus Versehen oder mit Absicht. Diese Konten sind auch weniger gefährlich, wenn sie potentiellen Angreifern in die Hände allen.
Der Rootless-Zugriff verwendet keine Binärdateien mit SETUID-Bits oder Dateifähigkeiten, wie es in der Dokumentation von Docker heißt. Beachten Sie, dass newuidmap und newgidmap vorhanden sein müssen. Bei der Verwendung des Rootless Daemons ist es sinnvoll, das Paket docker-ce-rootless-extras manuell über die Befehlszeilenschnittstelle (CLI; Command Line Interface) zu installieren.
4. Schützen Sie sensible Informationen
Datenlecks entstehen meist durch Cyberattacken, aber manchmal treten sie auch ohne äußere Einwirkung im Ökosystem auf. Durch schlechte Konfigurationen und den unvorsichtigen Gebrauch von Cache-Speichern, dringen Informationen während des Erstellungsprozesses von Images nach Außen.
Vermeiden Sie alle Versuche, sensible Dateien zu mounten. Aus diesem Grund ist auch die Verwendung der Docker-Secrets-Funktion eine gute Idee. Secrets sind Einheiten von Daten, zum Beispiel ein Passwort, ein privater SSH-Schlüssel oder ein SSL-Zertifikat – oder andere Daten, die eine Verschlüsselung in der Docker-Datei oder im Quellcode der Anwendung erfordern.
Containerlaufzeiten benötigen gelegentlich diese geschützten Informationen, um ordnungsgemäß zu laufen. Es ist jedoch möglich – und wird empfohlen – diese Daten an einem isolierten Ort zu speichern. Beachten Sie bitte, dass diese Funktion auf Swarm-Dienste beschränkt ist.
Zusätzlich bieten Secrets eine Abstraktionsschicht zwischen Containern und Anmeldedaten, die den Betrieb in mehreren Umgebungen ermöglicht. Secrets sind unter anderem mit Windows-, Nginx- und WordPress-Diensten nutzbar.
Schließlich helfen .dockerignore-Dateien, unerwünschte COPY-Anweisungen zu vermeiden. Dies verhindert, dass sensible Daten während des Build-Prozesses an unerwünschte Stellen gelangen.
5. Verhindern von Man-in-the-Middle-Angriffen
Docker-Images enthalten Daten und tauschen diese zwischen sich und den Containern aus. Jedes System mit Datentransport muss sich gegen Man-in-the-Middle-Angriffe (MITM) schützen, da diese Kommunikationswege beliebte Orte sind, an denen Angreifer ansetzen. Es gibt mehrere Möglichkeiten, dies zu verhindern.
Erstens sollten alle Images signiert und verifiziert werden, um den legitimen Betrieb zu bestätigen. Dies verhindert, dass betrügerische Zertifikate eingeschmuggelt werden und blockiert den Zugriff auf kritische Dienste. Images können nicht manipuliert werden oder aus kompromittierten Quellen stammen. Dienste wie Notary sind ideal für das Signieren aller Images, mit denen Sie arbeiten, da sie die Authentizität durch The Update Framework sicherstellen.
Zweitens ist die COPY-Operation ein großartiger Ersatz für ADD, wenn Sie mit unbekannten URLs konfrontiert werden. ADD öffnet die Tür für Manipulationen, weil es den Zugriff auf lokale Archive erlaubt. Dies führt zu Pfadüberschreitungen (Zugriff auf extern liegende Ressourcen) oder Zip Slip (weiträumiges Überschreiben von Dateien oder Remote-Befehlsausführung). COPY erlaubt hingegen nur die lokale Replikation von Dateien und Verzeichnissen vom Host-Rechner aus.