Best Practices für die Containersicherheit: Sichern von Docker
Wenn es um die Containerisierung geht, hat sich Docker zur am weitesten verbreiteten Technologie entwickelt. Da Unternehmen und Anwender in der Branche den Einsatz von Containern in Betracht ziehen, um Kosten zu senken, Dienste zu skalieren und die Implementierung zahlreicher Anwendungen zu beschleunigen, ist die Sicherheit von Docker ein wichtiger Aspekt, der nicht übersehen werden sollte. Docker wird allgemein als sicherer als herkömmliche Bereitstellungen gelobt, und obwohl das stimmt, müssen wir uns immer noch potenzieller Sicherheitslücken bewusst sein, um die Ausnutzung eines so leistungsstarken Tools zu verhindern.
In diesem Tutorial gehen wir einige der wichtigsten Sicherheitsmaßnahmen für Docker auf einem Linux-System durch. Dabei handelt es sich um Best Practices, die von Systemadministratoren eingehalten werden sollten, um sicherzustellen, dass ihre containerisierten Anwendungen in Docker vor potenziellen Exploits und böswilligen Benutzern geschützt sind.
In diesem Tutorial lernen Sie:
- Die 5 besten Best Practices zum Sichern von Docker unter Linux
Best Practices für die Docker-Sicherheit
Im Folgenden zählen wir fünf der wichtigsten Empfehlungen auf, um Ihre Docker-Umgebung und ihre containerisierten Anwendungen sicher zu halten.
Docker ist der größte Name in der Containerisierung, obwohl es eine Reihe anderer Tools gibt, die diese Aufgabe ebenfalls erledigen können. Viele Linux-Administratoren beginnen mit Docker, um Anwendungen zu erstellen, die in einen Container gepackt und einfach auf jedem System bereitgestellt werden können. Dies ist auch eine großartige Möglichkeit für Entwickler, ihre Arbeit zu teilen, da jeder mit Docker die Anwendung ausführen kann.
1. Vermeiden Sie die Verwendung von Root-Berechtigungen
Linux-Benutzer sollten bereits jetzt versuchen, die Verwendung von Administratorrechten so gering wie möglich zu halten. Dies ist bereits eine goldene Regel von Linux-Systemen, bei denen das root-Konto ausschließlich für wichtige Aufgaben und Befehle verwendet werden sollte, die von normalen Benutzerkonten nicht realisiert werden können.
Die gleiche Regel gilt für Docker-Container. Entwickler weisen einer Docker-Anwendung manchmal faul oder willkürlich mehr Berechtigungen als nötig zu, anstatt sich die Zeit zu nehmen, genau zu entscheiden, welche Berechtigungen erforderlich sind, und sie entsprechend zu delegieren. Ein solches Versehen kann schwerwiegende Folgen haben, wenn es einem Benutzer gelingt, die Kontrolle über eine Anwendung zu erlangen und ihm effektiv freie Hand über die Umgebung zu geben.
Wir können diese Falle umgehen, indem wir sicherstellen, dass wir Container nicht als root ausführen (überprüfen Sie USER in der Dockerfile, um dies sicherzustellen) und die Ausführung von Containern mit Optionen wie --id 0 oder --privileged vermeiden. Wir können es in den meisten Situationen auch vermeiden, Docker selbst als Root auszuführen, obwohl dies keine so wichtige Vorsichtsmaßnahme ist wie die oben genannten Punkte.
2. Aktualisieren Sie regelmäßig – mit Vorsicht
Updates für Docker-Images sind in der Regel eine gute Sache. Sie führen neue Funktionen, Sicherheitspatches usw. ein. Daher wird generell empfohlen, regelmäßig Updates abzurufen und alle Ihre Docker-Images auf dem neuesten Stand zu halten. In sensiblen Umgebungen, in denen die Betriebszeit äußerst wichtig ist, können jedoch zusätzliche Maßnahmen ergriffen werden, um diese Änderungen vor der Einführung in die Produktion vorzustufen.
Obwohl Updates im Allgemeinen eine gute Sache sind, können sie auch Breaking Changes oder instabile Funktionen einführen, für die die Probleme noch nicht behoben wurden. In einer Umgebung, in der viele Docker-Container verwendet werden und die besondere Aufmerksamkeit auf die Sicherstellung der Betriebszeit legt, können wir Technologien wie Kubernetes nutzen, die es uns ermöglichen, udpdates schrittweise einzuführen und Anwendungen auf Fehler zu überwachen, falls wir die Updates abbrechen und ein Rollback durchführen müssen.
Siehe auch: Kubernetes vs. Docker, was ist der Unterschied?
3. Verwenden Sie offizielle Bilder
Entscheiden Sie sich nach Möglichkeit für die Verwendung offizieller Images, die auf Docker Hub zum Download bereitgestellt werden. Diese Images erhalten regelmäßige Updates und werden von Entwicklern in der Docker-Community betrieben, sind daher in der Regel zuverlässiger und langlebiger als Images, die von verschiedenen Benutzern auf anderen Websites gepflegt werden.
Für gängige Anwendungen wie NGINX oder Ubuntu sind beispielsweise offizielle Images auf Docker Hub verfügbar. Die Verwendung ist sehr einfach, da diese Funktion bereits standardmäßig in Docker integriert ist:
Pull an official nginx image from Docker Hub:
docker pull nginx:latest
Derselbe Befehl, der oben gezeigt wurde, kann auch zum Aktualisieren des Bildes verwendet werden.
4. Begrenzen Sie die Container-Funktionen
Diese Empfehlung geht Hand in Hand mit unserer ersten, die darin besteht, die Verwendung von Root-Berechtigungen zu vermeiden. Aus dem gleichen Grund sollten wir auch die Fähigkeiten unserer Docker-Container auf jede erdenkliche Weise einschränken. Container sollten in der Regel nur mit den minimalen Berechtigungen ausgeführt werden, die sie zum ordnungsgemäßen Ausführen ihrer Aufgabe benötigen. Da Docker-Anwendungen in der Regel eine sehr spezifische Rolle haben, können wir sehr genau festlegen, welche Fähigkeiten wir zuweisen.
Eine Möglichkeit, Fähigkeiten einzuschränken, ist die Verwendung des Flags --internal. Dadurch wird verhindert, dass ein Docker-Container auf etwas außerhalb des internen Netzwerks zugreift, was oft keine notwendige Berechtigung ist, die wir delegieren müssen. Docker-Container können also weiterhin miteinander kommunizieren (wenn sie richtig konfiguriert sind), aber nicht mit dem externen Netzwerk des Hostsystems. Für Docker-Anwendungen, die für den Zugriff über einen Proxy konfiguriert wurden, ist das Flag --internal etwas, das immer verwendet werden kann.
Die Option --cap-drop=ALL reduziert die Linux-Fähigkeiten auf das absolute Minimum, das viele Anwendungen nicht benötigen. Wir können diese Option mit anderen wie --cap-add=NET_BIND_SERVICE kombinieren, um einen Dienst an einen bestimmten Port zu binden, ohne Root-Berechtigungen zu benötigen.
5. Sicherheitsaudits mit Docker Bench Security
Die Entwickler von Docker wissen, dass es sich um eine komplexe Anwendung mit vielen Facetten handelt, die es abzusichern gilt. Es ist zu viel verlangt, von jedem Linux-Administrator zu erwarten, dass er sich ausreichend mit Docker vertraut macht, um jede einzelne Einstellung auf mögliche Sicherheitslücken zu überprüfen.
Aus diesem Grund gibt es Docker Bench Security, das vom offiziellen Docker GitHub stammt und ein Sicherheitsaudit für Ihr Docker-Setup durchführt. Es führt im Wesentlichen eine Reihe von Bash-Skripten aus, die eine Vielzahl von Überprüfungen der Sicherheit Ihrer Umgebung durchführen, und meldet dann mit gefundenen Bedrohungen und Maßnahmen, die ergriffen werden können, um Ihr Setup zu härten.
Es ist so einfach wie das Klonen des Repositorys und das anschließende Ausführen des Skripts:
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
sudo sh docker-bench-security.sh
Abschließende Gedanken
In diesem Tutorial haben wir eine Liste der fünf wichtigsten Best Practices für die Sicherung von Docker auf einem Linux-System vorgestellt. Obwohl es sich bei Docker um eine relativ neue Technologie handelt, stellen wir fest, dass viele der Best Practices denen ähneln, die auf herkömmlichen Linux-Systemen angewendet werden, z. B. die Einschränkung von Funktionen, Sicherheitsüberwachungstools, die Installation von Updates und die Verwendung vertrauenswürdiger Software. Die Verwendung von Docker an und für sich zusammen mit diesen wichtigsten Empfehlungen trägt dazu bei, Ihre Anwendungen sicher zu halten, indem die Angriffsfläche stärker minimiert wird, als es eine herkömmliche Bereitstellung jemals könnte.
