5 Best Practices für Container-Sicherheit
19. Juli 2022
0 Min. LesezeitContainer-Sicherheit ist entscheidend, denn das Container-Image enthält alle Komponenten, die Ihre Anwendung später ausführen. Sind Schwachstellen im Image verborgen, steigen das Risiko und die möglichen Auswirkungen von Sicherheitsproblemen in der Produktionsumgebung. Deshalb ist es wichtig, auch Ihre Produktionsumgebung zu überwachen. Selbst wenn Sie Images ohne Schwachstellen oder erhöhte Berechtigungen erstellen, müssen Sie die Aktivitäten zur Laufzeit weiterhin im Blick behalten.
Grundsätzlich gibt es fünf zentrale Schritte, um ein sicheres Container-Image zu erstellen:
Verwenden Sie ein minimales Basis-Image aus einer vertrauenswürdigen Quelle
Verwalten Sie alle Ebenen zwischen Ihrem Basis-Image und Ihrem Code
1. Sichern Sie Ihren Code und seine Abhängigkeiten
Containerisierung ermöglicht es, Cloud-native Anwendungen schneller bereitzustellen. Das ist vermutlich einer der Gründe, warum Sie überhaupt Container erstellen. Container haben die Bedeutung von Anwendungscode erweitert, doch Code ist nach wie vor der Bereich, den Entwickler am unmittelbarsten kontrollieren. Open-Source-Abhängigkeiten können den Umfang proprietären Codes leicht übersteigen. Daher ist es wichtig, integrierte Tools für Software Composition Analysis (SCA) und Static Application Security Testing (SAST) einzusetzen, um die Analyse von Code und Abhängigkeiten zu automatisieren. Sie können Container auch direkt in Git-Commits und Repositorys scannen, um Probleme zu erkennen. Das passt möglicherweise besser zu Ihrem Entwicklungsprozess.
2. Verwenden Sie ein minimales Basis-Image aus einer vertrauenswürdigen Quelle
Eine geringe Größe ist nicht nur wichtig für die Portabilität und schnelle Downloads, sondern reduziert auch die Anzahl der Komponenten, die potenziell Schwachstellen enthalten können. Im Idealfall enthält jedes Container-Image Ihren Code und nur die Mindestanzahl zusätzlicher Pakete, die zum Ausführen einer Anwendung erforderlich sind. In der Praxis haben Sie jedoch wahrscheinlich viele Anwendungen und müssen einen gemeinsamen Nenner finden, um Container-Images verwaltbar zu halten.
Für die Auswahl eines Basis-Images stehen zahlreiche vertrauenswürdige Anbieter zur Verfügung, die Container-Basis-Images hosten. Docker Hub ist mit Abstand am beliebtesten: Dort sind mehr als 3,8 Millionen Images und über 7 Millionen Repositorys verfügbar; pro Monat werden etwa 11 Milliarden Images heruntergeladen. Zu den Images gehören Docker Official Images, eine von Docker kuratierte Sammlung von Docker-Open-Source- und „Drop-in“-Lösungs-Repositorys. Docker bietet außerdem hochwertige Images an, die direkt von Verified Publishers gepflegt werden. Die Richtlinien von Docker für diese Verified Publishers sind ein guter Ausgangspunkt, um eigene Best Practices für Container-Images festzulegen.
Auf Docker Hub finden Sie ganz einfach öffentlich verfügbare Images, die zu Ihrem Anwendungsfall passen. Achten Sie jedoch unbedingt auf deren Herkunft: Prüfen Sie, ob sie Teil des Programms Docker Official Images sind oder ob Sie Quelle und Inhalt mithilfe eines Tools wie Notary verifizieren können. So lassen sich digitale Signaturen prüfen und ein gewisses Maß an Qualitätssicherung erreichen.
3. Verwalten Sie alle Ebenen zwischen dem Basis-Image und Ihrem Code
Bei Basis-Images sind besondere Aspekte zu beachten: Wenn Sie darauf aufbauend Ihr eigenes Image erstellen, übernehmen Sie alle Bestandteile des Basis-Images. Selbst wenn Sie mit einem schlanken Image beginnen, müssen Sie wahrscheinlich zusätzlich zu Ihrem Code und den für den Betrieb erforderlichen Installationen Tools und Bibliotheken hinzufügen. All diese Bestandteile müssen auf Schwachstellen überwacht werden.
Die gute Nachricht: Sie können diese Zwischenschichten direkt kontrollieren. Wichtig ist jedoch, dass Sie bei Entwicklung, Tests und Bereitstellung in der Produktionsumgebung Prioritäten setzen. Möglicherweise benötigen Sie in jeder Phase unterschiedliche Tools. Sobald Images jedoch für die Produktion vorgesehen sind, sollten Sie alles entfernen, was nicht unbedingt erforderlich ist.
Wenn Sie mit einem minimalen Basis-Image beginnen und nur die erforderlichen Tools hinzufügen, können Sie diese später ganz einfach wieder entfernen: Nehmen Sie sie einfach aus dem Dockerfile und erstellen Sie das Image neu. Alternativ können Sie Multi-Stage-Builds verwenden, um alle Phasen in einem einzigen automatisierten Build-Prozess abzubilden. Möglicherweise entdecken Sie Schwachstellen in Tools und Support-Paketen, die auf einer Zwischenschicht installiert sind, aber gefahrlos ignoriert werden können, wenn diese Extras nicht in den Produktions-Images enthalten sind. Weitere Best Practices für Multi-Stage-Builds finden Sie in unserem Blogbeitrag.
4. Verwenden Sie Zugriffsverwaltung
Im Zusammenhang mit Containern bezeichnet Zugriff die Möglichkeit für einen bestimmten Benutzer, einen bestimmten Vorgang für eine Container-Ressource auszuführen. Typische Aktivitäten fallen unter die allgemeinen CRUD-Operationen: Erstellen, Lesen, Aktualisieren und Löschen. Wie die Zugriffsverwaltung konkret aussieht, hängt von der Container-Plattform ab. In Kubernetes befinden sich Benutzer beispielsweise außerhalb des Clusters. Administratoren müssen Identitäten daher außerhalb des Clusters verwalten, etwa mithilfe von TLS-Zertifikaten, OAuth2 oder anderen Authentifizierungsmethoden.
Für Secrets und den Netzwerkzugriff sollte das Prinzip der geringsten Berechtigungen gelten. Der Administratorzugriff sollte auf den Aufbau der Infrastruktur beschränkt sein. Damit ein Container nicht uneingeschränkt auf all Ihre Ressourcen zugreifen kann, sollten Sie den Containern bestimmte Rollen und Zuständigkeiten zuweisen und Tools einsetzen, um diese umzusetzen, durchzusetzen und zu überwachen.
5. Sichern Sie die Container-Infrastruktur
Neben dem Container-Image und dem laufenden Container muss auch der für den Betrieb von Containern erforderliche Infrastruktur-Stack verwaltet werden. Das beginnt bei einer Container-Registry wie Docker Hub und reicht bis zur Orchestrierung in der Produktionsumgebung mit Kubernetes.
Container-Registrys sollen die Zusammenarbeit fördern, indem sie einen sicheren Ort zum Speichern und Teilen von Containern bereitstellen. Gleichzeitig können sie Schwachstellen, Malware und offengelegte Secrets ins Spiel bringen. Häufig verfügen sie über integrierte Sicherheitsfunktionen. Beim Verbinden mit einer Registry sollte immer ein Sicherheitsprotokoll wie TLS verwendet werden. Kubernetes enthält ebenfalls Tools, mit denen sich Sicherheitskontrollen auf Cluster- und Netzwerkebene einrichten und durchsetzen lassen. Weitere Informationen finden Sie in unserem Artikel zur Sicherheit von Container-Registrys.
Container sollten immer auf einem sicheren System oder Cloud-Service ausgeführt werden. Bei einem Service sollten für den Zugriff auf die Registry rollenbasierte Zugriffskontrollen (RBAC) verwendet werden.
Noch ein wichtiger Punkt: Angreifer richten ihren Fokus immer früher auf die CI/CD-Pipeline. Vernachlässigen Sie daher nicht die Absicherung der frühen Entwicklungsphasen. Wenn Sie Anwendungen und Container erstellen, sollten Sie den Code scannen, bevor er in einer Anwendung verwendet und bevor diese bereitgestellt wird. Außerdem sollten Sie das Prinzip der geringsten Berechtigungen (POLP) anwenden und Sicherheitsprüfungen und -kontrollen in der Entwicklungspipeline automatisieren.
