Einführung in die Container-Sicherheit mit Docker

CompTIABeginner
Jetzt üben

Einführung

Willkommen zu diesem praktischen Lab über die Grundlagen der Container-Sicherheit mit Docker. Docker ist eine leistungsstarke Plattform für die Entwicklung, Bereitstellung und Ausführung von Anwendungen in Containern. Während Container Prozessisolation bieten, ist ihre Absicherung entscheidend für den Schutz Ihrer Anwendungen und des Host-Systems.

In diesem Lab werden Sie die Grundlagen der Docker-Container-Sicherheit untersuchen. Zuerst überprüfen Sie, ob Docker in der LabEx-Umgebung korrekt konfiguriert ist. Dann führen Sie einen einfachen Nginx-Webserver-Container aus, inspizieren seine laufenden Prozesse und untersuchen seinen Ressourcenverbrauch. Abschließend lernen Sie, wie Sie grundlegende Sicherheitskontrollen anwenden, indem Sie Ressourcenlimits für einen Container festlegen.

Am Ende dieses Labs werden Sie ein praktisches Verständnis der ersten Schritte zur Absicherung einer Docker-Umgebung haben.

Docker-Installation und -Einrichtung überprüfen

In diesem Schritt überprüfen Sie, ob Docker in der LabEx-Umgebung bereits installiert ist und ob Sie die erforderlichen Berechtigungen zur Nutzung haben.

Die LabEx-virtuelle Maschine wird mit vorinstalliertem Docker geliefert. Überprüfen wir zunächst die Docker-Version, um sicherzustellen, dass es verfügbar ist.

docker --version

Sie sollten eine Ausgabe ähnlich dieser sehen, die bestätigt, dass Docker korrekt installiert ist:

Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

Überprüfen wir nun, ob der Docker-Daemon läuft:

sudo systemctl status docker

Dieser Befehl zeigt Ihnen den Status des Docker-Dienstes an. Sie sollten sehen, dass er aktiv und lauffähig ist.

Um Docker-Befehle ohne sudo ausführen zu können, muss Ihr Benutzer der Gruppe docker angehören. In der LabEx-Umgebung ist Ihr Benutzer bereits mit den entsprechenden Berechtigungen konfiguriert. Lassen Sie uns dies überprüfen:

groups $USER

Sie sollten docker in der Ausgabe sehen, was bestätigt, dass Ihr Benutzer die erforderlichen Berechtigungen hat:

labex : labex sudo docker ssl-cert

Da Ihr Benutzer bereits in der Docker-Gruppe ist, können Sie Docker-Befehle direkt ausführen, ohne sudo zu benötigen.

Testen wir, ob Docker ordnungsgemäß funktioniert, indem wir einen einfachen Befehl ausführen:

docker info

Dieser Befehl zeigt systemweite Informationen über Docker an und bestätigt, dass Sie erfolgreich mit dem Docker-Daemon kommunizieren können.

Einen grundlegenden Webserver-Container ausführen

In diesem Schritt führen Sie Ihren ersten Container aus. Wir verwenden das offizielle nginx-Image, das einen leichtgewichtigen und leistungsstarken Webserver bereitstellt.

Um einen Container auszuführen, verwenden Sie den Befehl docker run. Wir werden einige gängige Flags verwenden:

  • -d: Führt den Container im Detached-Modus aus (im Hintergrund).
  • -p 8080:80: Ordnet Port 8080 auf dem Host Port 80 im Container zu. Dies ermöglicht Ihnen den Zugriff auf den Nginx-Server über localhost:8080.
  • --name webserver: Weist Ihrem Container einen einprägsamen Namen zu.
  • nginx: Der Name des zu verwendenden Images.

Führen Sie den folgenden Befehl aus, um den Nginx-Container zu starten:

docker run -d -p 8080:80 --name webserver nginx

Docker prüft zunächst, ob das nginx-Image lokal verfügbar ist. Wenn nicht, wird es automatisch von Docker Hub heruntergeladen und dann der Container gestartet. Sie können mit dem Befehl docker ps sehen, dass der Container läuft.

docker ps

Die Ausgabe zeigt Ihren webserver-Container, seine ID, das Image, auf dem er basiert, und die Portzuordnung.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   webserver

Testen wir nun, ob der Webserver funktioniert. Verwenden Sie curl, um eine Anfrage an den Server auf dem zugeordneten Port zu senden.

curl localhost:8080

Sie sollten die HTML-Ausgabe der standardmäßigen Nginx-Begrüßungsseite sehen, was bestätigt, dass Ihr Container läuft und zugänglich ist.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. For further configuration, refer to the
      <a href="http://nginx.org/">nginx.org</a> documentation.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Container-Prozesse und Ressourcennutzung untersuchen

In diesem Schritt lernen Sie, wie Sie die in einem Container laufenden Prozesse inspizieren und dessen Ressourcenverbrauch überwachen. Dies ist eine grundlegende Fähigkeit für die Fehlersuche und das Verständnis des Verhaltens Ihrer containerisierten Anwendung.

Ein Hauptmerkmal von Containern ist die Prozessisolation. Aus Sicht des Hosts können Sie sehen, was in einem Container läuft, ohne sich hinein-execen zu müssen. Der Befehl docker top ermöglicht es Ihnen, die Hauptprozesse eines Containers anzuzeigen.

Führen Sie den folgenden Befehl aus, um die Prozesse in Ihrem webserver-Container anzuzeigen:

docker top webserver

Die Ausgabe zeigt den Nginx-Masterprozess, der als Root läuft, und seine Worker-Prozesse, die als systemd+ (ein Systembenutzer zur Verbesserung der Sicherheit) laufen. Beachten Sie, dass es mehrere Worker-Prozesse gibt, was für Nginx typisch ist, um gleichzeitige Anfragen effizient zu bearbeiten.

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4098                4078                0                   14:34               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4161                4098                0                   14:34               ?                   00:00:00            nginx: worker process
systemd+            4162                4098                0                   14:34               ?                   00:00:00            nginx: worker process

Als Nächstes betrachten wir die Ressourcennutzung des Containers. Der Befehl docker stats liefert einen Live-Stream von CPU, Speicher, Netzwerk und Festplatten-I/O eines Containers. Um für dieses Lab eine statische Momentaufnahme zu erhalten, verwenden wir das Flag --no-stream.

docker stats --no-stream webserver

Dieser Befehl zeigt eine Tabelle mit den aktuellen Ressourcenmetriken für den webserver-Container an.

CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
bda2386621a1   webserver   0.00%     3.125MiB / 3.505GiB   0.09%     6.31kB / 1.27kB   0B / 12.3kB   3

Aus dieser Ausgabe können Sie ersehen, dass der Container sehr wenig CPU (0,00 %) und etwa 3,1 MiB Speicher von den verfügbaren 3,5 GiB Systemspeicher (0,09 %) verwendet und 3 laufende Prozesse hat (der Nginx-Master und 2 Worker-Prozesse). Diese Informationen sind entscheidend für die Identifizierung von Leistungsengpässen oder potenziellen Speicherlecks in Ihren Anwendungen.

Container-Sicherheitseigenschaften wie Ressourcengrenzen prüfen

In diesem Schritt werden Sie eine der grundlegendsten, aber kritischsten Sicherheitsfunktionen von Containern untersuchen: Ressourcengrenzen. Standardmäßig kann ein Container so viel CPU und Arbeitsspeicher des Hosts nutzen, wie er möchte. Das Festlegen von Grenzen verhindert, dass ein einzelner Container alle verfügbaren Ressourcen verbraucht und andere Container oder den Host selbst beeinträchtigt.

Zuerst inspizieren wir die Konfiguration des zuvor erstellten webserver-Containers. Der Befehl docker inspect liefert eine detaillierte JSON-Ausgabe mit allen Einstellungen des Containers.

docker inspect webserver

Die Ausgabe ist sehr lang. Sie können das Flag --format verwenden, um bestimmte Felder zu extrahieren. Lassen Sie uns prüfen, ob ein Speicherlimit gesetzt ist.

docker inspect --format='{{.HostConfig.Memory}}' webserver

Die Ausgabe wird 0 sein, was bedeutet, dass kein Speicherlimit vorhanden ist.

0

Lassen Sie uns nun einen neuen Container mit einem Speicherlimit erstellen. Zuerst müssen Sie den vorhandenen Container stoppen und entfernen, da wir die Portzuordnung wiederverwenden werden.

docker stop webserver
docker rm webserver

Führen Sie als Nächstes einen neuen Nginx-Container aus, aber fügen Sie diesmal das Flag --memory="100m" hinzu, um seine Speichernutzung auf 100 Megabyte zu begrenzen. Wir geben ihm auch einen neuen Namen.

docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx

Untersuchen Sie nun das Speicherlimit dieses neuen Containers.

docker inspect --format='{{.HostConfig.Memory}}' webserver-limited

Diesmal wird die Ausgabe das Speicherlimit in Bytes sein (100 × 1024 × 1024).

104857600

Sie haben erfolgreich eine Ressourceneinschränkung auf einen Container angewendet, was ein grundlegender Schritt in der Container-Sicherheit und im Ressourcenmanagement ist.

Zusammenfassung

In diesem Lab haben Sie praktische Erfahrungen mit den grundlegenden Aspekten von Docker und Container-Sicherheit gesammelt.

Sie haben erfolgreich:

  • Die Docker-Installation überprüft und die entsprechenden Zugriffsberechtigungen in der LabEx-Umgebung konfiguriert.
  • Einen grundlegenden Nginx-Webserver als Docker-Container ausgeführt.
  • Ports zugeordnet, um von Host auf die containerisierte Anwendung zuzugreifen.
  • Die in einem Container laufenden Prozesse mit docker top inspiziert.
  • Die Live-Ressourcennutzung mit docker stats überwacht.
  • Gelernt, wie man Ressourcengrenzen, wie z. B. Speicher, für einen Container festlegt, um die Systemstabilität und Sicherheit zu verbessern.

Diese Fähigkeiten sind die Bausteine für die Verwaltung und Sicherung komplexerer Multi-Container-Anwendungen in einer Produktionsumgebung.