Was sind Container?
Container-Technologie – oft einfach als „Container“ bezeichnet – ist ein Mechanismus zum Verpacken einer Anwendung, sodass sie von anderen Prozessen isoliert ausgeführt werden kann. Container haben ihren Namen aus der Schifffahrt geerbt und stellen Software-Einheiten dar, die aus Code sowie Abhängigkeiten bestehen und eine schnelle, zuverlässige sowie immer gleichbleibende Anwendungsausführung unabhängig von der Datenverarbeitungsumgebung ermöglichen.
Neben einer kurzen Erläuterung der Funktionsweise von Containern erhalten Sie in diesem Beitrag Informationen dazu, warum Container-Technologie heute so beliebt ist und welchen Best Practices für die Sicherheit Sie folgen können, wenn Sie diesen Ansatz für die Software-Entwicklung wählen. Außerdem stellen wir Ihnen gängige Dienstanbieter im Bereich Container vor.
Wie funktionieren Container und was spricht für ihre Nutzung?
Entwickler stehen heute vor zahlreichen Herausforderungen, wenn die zugrunde liegende Software sowie die Netzwerktopologie oder Sicherheitsrichtlinien in verschiedenen Umgebungen (z. B. Staging- vs. Produktionsumgebungen, physische Rechenzentren vs. Private- oder Public-Cloud-Umgebungen) nicht identisch sind. Diese Uneinheitlichkeit kann beispielsweise das effektive Identifizieren von Schwachstellen erschweren und unnötige Hindernisse für die Anwendungsbereitstellung schaffen.
Container – die übrigens auch oft mit virtuellen Maschinen (VMs) verglichen werden – können Probleme wie diese minimieren. Das wird erreicht durch einen Entkopplungsprozess, der eine konsistente Anwendungsausführung in jeder vom Entwickler gewählten Umgebung ermöglicht. Wie bei VMs können Anwendungen mithilfe von Containern zusammen mit Bibliotheken und anderen Abhängigkeiten verpackt werden, sodass isolierte Umgebungen für die Software-Ausführung entstehen. Bei Containern setzt die Virtualisierung aber nicht am Hardware-Stack an, sondern findet auf Betriebssystemebene statt, und sie können direkt auf dem Betriebssystem-Kernel ausgeführt werden. Das macht sie zu einer deutlich schlankeren Lösung, mit der es sich leichter arbeiten lässt.
Mit Containern können Entwickler ihren Fokus auf die Anwendungslogik und Abhängigkeiten legen und außerdem schneller arbeiten, Software effizienter bereitstellen und in beispiellosem Ausmaß skalieren. Ein weiteres Plus ist, dass IT-Teams sich auf die Bereitstellung und Verwaltung konzentrieren können, ohne sich um Anwendungskonfigurationen und Versionierungsprobleme sorgen zu müssen.
Beliebte Container-Technologien
Es stehen zahlreiche Container-Dienstanbieter mit individuellen Eigenschaften zur Wahl – von bekannten Unternehmenslösungen bis hin zu kostenlosen Open-Source-Plattformen.
- Docker ist heute für viele Entwickler der Standard für die Entwicklung containerisierter Anwendungen. Im Grunde sind „Docker“ und „Container“ praktisch Synonyme. Die meisten großen IaaS-Angebote und serverlosen Open-Source-Frameworks stützen sich auf das Moby-Projekt von Docker.
- Kubernetes ist ein kostenloses Open-Source-System zur Container-Orchestrierung. Anders als die Docker-Plattform, die uns die Nutzung von Containern ermöglicht, ist Kubernetes eine Lösung zur Automatisierung der Prozesse rund um die Bereitstellung, Verwaltung, Aktualisierung und Skalierung von Containern.
- Die Red Hat OpenShift-Plattform bildet die Basis für lokale, hybride und Cloud-basierte Container-Bereitstellungen. Einfach ausgedrückt handelt es sich um ein Kubernetes-gesteuertes und Docker-gestütztes PaaS-Angebot, das Entwicklern beim Bereitstellen von Anwendungen hilft.
- Rancher ist eine von Rancher Labs entwickelte Open-Source-Lösung zur Vereinfachung der Kubernetes-Bereitstellung und Verwaltung mehrerer Cluster über verschiedene Infrastrukturen hinweg.
Die Vorteile der Containerisierung
Da sich Container-Technologie im Allgemeinen einfach verwalten und warten lässt, können Entwickler damit leichter Anwendungen im großen Maßstab bereitstellen.
Mehr Effizienz und Agilität
Wie bereits erwähnt sind Container deutlich ressourcenschonender als VM-Umgebungen, da die Virtualisierung auf Betriebssystemebene stattfindet und somit die Ausführung mehrerer Container auf einem einzigen Betriebssystem-Kernel möglich ist. Das bedeutet, dass sich Anwendungen schneller bereitstellen, patchen und skalieren lassen, sodass DevOps-Teams agil bleiben und Produktionszyklen beschleunigen können. Außerdem wird weitaus weniger Speicher belegt.
Konsistentere Umgebungen
Mit Containern können Entwickler konsistente Umgebungen erstellen, die sich einfacher von anderen Anwendungen isolieren lassen. Da Container auch Software-Abhängigkeiten wie Binärcode, die Laufzeiten von Programmiersprachen, Konfigurationsdateien oder andere Bibliotheken enthalten können, sorgen sie für Konsistenz unabhängig vom Bereitstellungsort der Anwendungen.
Eine konsistente Umgebung kommt der Produktivität von Entwicklern und IT-Teams zugute, die dann weniger Zeit für Aufgaben wie das Debugging oder Diagnosen bei Umgebungsproblemen aufwenden müssen und sich intensiver mit der Entwicklung der Funktionen befassen können, die Benutzer sich wünschen.
Bessere Portabilität
Container können überall und auf jedem Betriebssystem ausgeführt werden, einschließlich Linux, Mac und Windows. Auch die Ausführung auf virtuellen Maschinen, in Rechenzentren oder in der Public Cloud ist möglich. Für Entwickler ist das ideal, weil sie so ihre Software ganz flexibel dort ausführen können, wo sie es bevorzugen.
Die Herausforderungen der Containerisierung
Wie es bei Software meistens der Fall ist, können Container auch Herausforderungen und Risiken für den Entwicklungsprozess mit sich bringen.
Mangelnde Akzeptanz
Die Implementierung von Container-Technologie in Ihrem gesamten Unternehmen kann sich in erster Linie als Herausforderung erweisen. Für die Einführung und möglichst effektive Nutzung von Containern müssen Prozesse und Infrastruktur geändert werden und es kann schwierig sein, Entwickler mit ins Boot zu holen.
Die Gefahr größerer Angriffsflächen
Container werden im Vergleich zu VMs oft als weniger sicher erachtet, weil sie im Prinzip eine größere Angriffsfläche für böswillige Akteure schaffen. Eine Schwachstelle im Host-Kernel eines Containers könnte einem Angreifer beispielsweise das Tor zu anderen Containern öffnen, die den gleichen Kernel nutzen.
In den letzten Jahren haben jedoch viele Container-Plattformen Software zur Steigerung der Docker- und Container-Sicherheit entwickelt. Mit diesen Lösungen werden die erwarteten Verhaltensweisen, Prozesse, Netzwerkaktivitäten und Speichervorgänge von Containern in Profilen erfasst, um sicherzustellen, dass ungewöhnliches oder gefährliches Verhalten identifiziert wird.
Unangemessene Nutzung durch Entwickler
Container sind agil, portabel und relativ einfach bereitzustellen und zu verwenden. Dennoch besteht die Möglichkeit, dass Entwickler Fehler machen. Die Nutzung mehrschichtiger Images kann beispielsweise die Angriffsfläche eines Unternehmens vergrößern und den Schutz erschweren.
Best Practices für die Container-Sicherheit
Container können zwar äußerst nützlich sein, doch wie viele digitale Lösungen erfordern sie eine sorgfältige Bereitstellung und Pflege, um Risiken zu minimieren. Durch die Implementierung (und Automatisierung) von Prozessen können Unternehmen Zeit sparen und dafür sorgen, dass sie flexible, agile und sichere Software bereitstellen.
Nehmen wir Docker als Beispiel, um zu veranschaulichen, wie die nachfolgenden Best Practices zur Absicherung von Containern beitragen können.
Nur vertrauenswürdige Images verwenden
Zum Erstellen von Docker-Containern müssen Entwickler ihr eigenes Dockerfile zusammenstellen – entweder von Grund auf neu oder ausgehend von einem Basis-Image. Beide Optionen können Probleme in Zusammenhang mit der Image-Integrität, -Herkunft und -Sicherheit nach sich ziehen.
Zum Schutz Ihrer Container ist es unerlässlich, nur offizielle Images aus öffentlichen Repositorys wie Docker Hub sowie signierte Images von vertrauenswürdigen Entwicklern herunterzuladen. Docker Content Trust nutzt öffentliche und private Schlüssel zum Überprüfen der Image-Integrität und der Identität des Herausgebers.
Entwicklungsteam schulen
Indem sie ihre Entwicklungsteams über diese Best Practices informieren, können Unternehmen sicherstellen, dass nur vertrauenswürdige Images verwendet werden. Eine der effektivsten Möglichkeiten, dies zu erreichen, besteht in der Implementierung einer Docker Trusted Registry zum Erstellen einer internen Bibliothek mit Images, die veröffentlicht und wiederverwendet werden können.
Auf sichere Container-Versionierung achten
Bei Einführung neuer Versionen der Docker-Container-Technologie kann es vorkommen, dass Entwickler unwissentlich Sicherheitslücken verursachen. Außerdem können auch kürzlich gepatchte Versionen seriöser Container-Images einen Build unsicher machen.
Damit dies nicht passiert, sollten Sie Ihre Dockerfiles mit dem verwendeten Image oder der Container-Version kennzeichnen, mit der sie erstellt wurden.
Auf Schwachstellen prüfen
Mit Docker Hub wird zwar in gewisser Weise bestätigt, dass es sich um offizielle Images handelt, es ist aber dennoch wichtig, alle heruntergeladenen Images auf Schwachstellen zu prüfen – insbesondere weil in vielen Images trotzdem Bugs gefunden wurden.
Unternehmen können Tools wie Docker Security Scanning oder OpenSCAP zum Aufdecken von Bugs einsetzen und sollten zudem Sicherheitslücken-Scans in die Richtlinie ihres Container-Verwaltungssystems aufnehmen.
Netzwerkverkehr beobachten
Die Sicherheit sollte bei Container-Bereitstellungen immer im Vordergrund stehen. Daher ist es unerlässlich, den Netzwerkverkehr zu überwachen. In manchen Container-Frameworks lässt das Host-Betriebssystem beispielsweise den Netzwerkverkehr zwischen Containern uneingeschränkt zu, was den unerlaubten Zugriff auf ein Drittanbieter- oder Schadprogramm ermöglichen kann. Außerdem besteht dadurch die Gefahr, dass ein Angreifer vertrauliche Daten mitliest.
Zur Wahrung der Sicherheit Ihrer Container sollten Sie die Kommunikation zwischen Containern mit dem Flag —icc=false im Docker-Daemon deaktivieren.
Container-Ausbrüche vermeiden
Der Docker-Daemon wird als Root-Benutzer ausgeführt, sodass ein Benutzer mit Root-Zugriff innerhalb eines Containers das Host-Betriebssystem kompromittieren könnte. Da Container alle den gleichen Host-Betriebssystem-Kernel nutzen, könnte dies den Zugriff auf mehrere Produktions-Container ermöglichen.
Sorgen Sie nach Möglichkeit dafür, dass Container nicht als Root-Benutzer ausgeführt werden, und implementieren Sie ein Zugriffsmodell nach dem Prinzip der geringsten Rechte, um die Risiken zu minimieren.
Sicherheitskontrollen automatisieren
Entwickler können Sicherheitskontrollen für alle ihre Umgebungen und Cloud-Container-Technologien automatisieren, sodass die zum Entwickeln verwendeten Docker-Instanzen beschleunigt werden und eine sicherere Basis für die Erstellung von Docker-Containern geschaffen wird.
Sicherheit durch Authentifizierung steigern
Die Authentifizierung ist zum Starten eines Docker-Containers unerlässlich, insbesondere in Anbetracht des Umstands, dass Unternehmensumgebungen Tausende von Containern enthalten können. Authentifizierungsebenen wie OAuth2 und OpenID Connect können in Kombination mit Kubernetes zum Ausgeben eines ID-Tokens verwendet werden, mit dem die Identität von Benutzern überprüft und der sichere Zugriff auf bestimmte Container ermöglicht wird.
Erste Schritte mit Containern
Wir bei Okta haben uns eingehend mit Container-Technologie beschäftigt, einschließlich Docker und Kubernetes. In den folgenden Ressourcen können Sie mehr über das Arbeiten mit Containern erfahren:
- Container Security: A Developer Guide (Container-Sicherheit: Ein Leitfaden für Entwickler, Blog)
- An Insider Look: How Okta Builds and Runs Scalable Infrastructure (Einblick für Insider: So entwickelt und betreibt Okta die skalierbare Infrastruktur, Whitepaper)
- 8 Ways to Secure Your Microservices Architecture (8 Möglichkeiten zur Absicherung Ihrer Microservices-Architektur, Whitepaper)
- Deploy a .NET Container with Azure DevOps (Bereitstellung eines -NET-Containers in Azure DevOps, Blog)