So prüfen Sie die Docker Host-Sicherheit mit Docker Bench für die Sicherheit unter Ubuntu 16.04

Einführung

Die Verwendung von Docker zum Containerisieren Ihrer Anwendungen und Dienste bietet Ihnen einige sofort einsetzbare Sicherheitsvorteile. Eine Standardinstallation von Docker bietet jedoch noch Raum für einige sicherheitsrelevante Konfigurationsverbesserungen. Das https://www.cisecurity.org [Zentrum für Internetsicherheit], eine gemeinnützige Organisation, deren Ziel es ist, die Best Practices für die Internetsicherheit zu fördern, hat in einem Schritt a erstellt Checkliste zum Sichern von Docker. Anschließend veröffentlichte das Docker-Team ein Sicherheitsüberprüfungs-Tool - Docker Bench for Security -, um diese Checkliste auf einem Docker-Host zu durchlaufen und alle aufgetretenen Probleme zu markieren.

In diesem Tutorial werden wir Docker Bench for Security installieren und dann die Sicherheitslage einer Standard-Docker-Installation (aus dem offiziellen Docker-Repository) auf einem Ubuntu 16.04-Host überprüfen. Wir werden dann einige der Probleme beheben, vor denen wir gewarnt werden.

Unsere Fixes bestehen hauptsächlich aus den folgenden zwei Konfigurationsupdates:

  • Installieren von + auditd + und Einrichten von Überwachungsregeln für den Docker-Daemon und die zugehörigen Dateien

  • Aktualisieren der Docker-Konfigurationsdatei + daemon.json

In diesem Lernprogramm werden keine Details zum Erstellen sicherer Container erläutert. In diesem Lernprogramm werden nur Aktualisierungen der Docker-Hostsicherheit behandelt.

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie Folgendes:

  • Ein Ubuntu 16.04-Server mit einem sudo-fähigen Benutzer ohne Rootberechtigung. Wie Sie dies einrichten, erfahren Sie in unserem Initial Server Setup with Ubuntu 16.04 -Handbuch

  • Docker wird aus dem offiziellen Docker-Repository installiert (siehe How To Install and Use) Docker unter Ubuntu 16.04. Vergewissern Sie sich, dass Sie Ihrem Benutzer ohne Rootberechtigung Zugriff auf Docker gewähren, indem Sie ihn der Gruppe * docker * hinzufügen. Dies wird in Schritt 2 des Tutorials behandelt.

Schritt 1 - Installieren von Docker Bench Security

Starten Sie SSH als Nicht-Root-Benutzer auf dem Docker-Host.

Wir werden zuerst das Docker Bench for Security-Skript mit + git + auf den Server klonen und dann das Skript direkt aus dem geklonten Repository ausführen.

Navigieren Sie zu einem Verzeichnis, in das Ihr Benutzer schreiben kann. In diesem Beispiel wird das Skript in das Ausgangsverzeichnis des Benutzers heruntergeladen:

cd ~

Dann klonen Sie das Git-Repository + docker-bench-security +:

git clone https://github.com/docker/docker-bench-security.git

Dadurch werden alle Dateien aus dem Repository abgerufen und in ein lokales Verzeichnis kopiert. Verschieben Sie als Nächstes in dieses resultierende Verzeichnis:

cd docker-bench-security

Führen Sie zum Ausführen der Sicherheitsüberprüfung das Skript + docker-bench-security.sh + aus:

./docker-bench-security.sh
Output# ------------------------------------------------------------------------------
# Docker Bench for Security v1.3.4
#
# Docker, Inc. (c) 2015-
#
# Checks for dozens of common best-practices around deploying Docker containers in production.
# Inspired by the CIS Docker Community Edition Benchmark v1.1.0.
# ------------------------------------------------------------------------------

Initializing Tue Jun  5 18:59:11 UTC 2018


[INFO] 1 - Host Configuration
[WARN] 1.1  - Ensure a separate partition for containers has been created
[NOTE] 1.2  - Ensure the container host has been Hardened
[INFO] 1.3  - Ensure Docker is up to date
[INFO]      * Using 18.03.1, verify is it up to date as deemed necessary
. . .

Das Skript durchläuft eine Vielzahl von Tests und gibt für jeden ein "+ INFO " -, " NOTE " -, " PASS " - oder " WARN +" - Ergebnis aus. Eine Standard-Docker-Installation unter Ubuntu 16.04 besteht viele dieser Tests, zeigt jedoch einige Warnungen in den Abschnitten 1, 2 und 4 an.

Im weiteren Verlauf dieses Tutorials werden wir diese Warnungen beheben, indem wir unsere Docker-Installation sichern.

Schritt 2 - Korrigieren der Host-Konfigurationswarnungen

Der erste Abschnitt des Audits testet die Konfiguration des Betriebssystems Ihres Hosts, einschließlich seiner Absicherung, Paketversionen und Überwachungskonfiguration. Sehen wir uns die Tests in diesem Abschnitt an:

  • 1.1 Sicherstellen, dass eine separate Partition für Container erstellt wurde *

Um eine ordnungsgemäße Isolation zu gewährleisten, ist es eine gute Idee, Docker-Container und alle + / var / lib / docker + auf ihrer eigenen Dateisystempartition zu belassen. Dies kann in einigen Cloud-Hosting-Situationen schwierig sein, in denen Sie möglicherweise nicht in der Lage sind, Laufwerke zu partitionieren. In diesen Fällen können Sie diesen Test bestehen, indem Sie das Datenverzeichnis von Docker auf ein externes, an das Netzwerk angeschlossenes Blockgerät verschieben.

Dieser Test ist nur eine Notiz, die Sie daran erinnert, Ihren Host zu härten. Das Absichern umfasst in der Regel das Einrichten einer Firewall, das Sperren verschiedener Dienste, das Einrichten der Überwachung und Protokollierung sowie das Implementieren anderer Sicherheitsmaßnahmen. Sie können damit beginnen, indem Sie 7 Sicherheitsmaßnahmen zum Schutz Ihrer Server lesen.

  • 1.3 Stellen Sie sicher, dass Docker auf dem neuesten Stand ist *

Dieser Test druckt Ihre Docker-Version aus. Sie können überprüfen, welche Version die aktuelle stabile Version ist, indem Sie den Docker CE-Versionshinweisen aufrufen. Wenn Sie nicht auf dem neuesten Stand sind und Docker mit "+ apt-get install y" installiert haben, können Sie das Docker-Paket mit "+ apt-get in" erneut aktualisieren:

sudo apt-get update
sudo apt-get upgrade
  • 1.4 Stellen Sie sicher, dass nur vertrauenswürdige Benutzer den Docker-Daemon steuern dürfen. *

Im vorausgesetztes Docker-Setup-Tutorial haben wir unseren Nicht-Root-Benutzer zum hinzugefügt * docker * group, um Zugriff auf den Docker-Daemon zu gewähren. Dieser Test gibt die Gruppenzeile * docker * aus der Datei + / etc / group aus:

Outputdocker:x:999:

Diese Zeile zeigt alle Benutzer der Gruppe * docker *. Überprüfen Sie die Zeile und stellen Sie sicher, dass nur die entsprechenden Benutzer berechtigt sind, den Docker-Dämon zu steuern. Im obigen Beispiel ist unser berechtigter Benutzer * sammy * hervorgehoben. Um Benutzer aus dieser Gruppe zu entfernen, können Sie "+ gpasswd +" verwenden:

gpasswd -d  docker
  • 1.5–1.13 Stellen Sie sicher, dass die Überwachung für verschiedene Docker-Dateien konfiguriert ist. *

Wir müssen + auditd + installieren und konfigurieren, um die Überwachung einiger Docker-Dateien, -Verzeichnisse und -Sockets zu ermöglichen. Auditd ist ein Linux-Subsystem für die Zugriffsüberwachung und -abrechnung, das wichtige Systemvorgänge auf Kernelebene protokolliert.

Installieren Sie + auditd mit` + apt-get`:

sudo apt-get install auditd

Dadurch wird der Dämon + auditd + installiert und gestartet. Wir konfigurieren jetzt "+ auditd +", um Docker-Dateien und -Verzeichnisse zu überwachen. Öffnen Sie in einem Texteditor die Überwachungsregeldatei:

sudo nano /etc/audit/audit.rules

Sie sollten den folgenden Text sehen:

/etc/audit/audit.rules

# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.

# First rule - delete all
-D

# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 320

# Feel free to add below this line. See auditctl man page

Fügen Sie das folgende Snippet am Ende der Datei ein, speichern Sie es und beenden Sie den Editor:

/etc/audit/audit.rules

-w /usr/bin/docker -p wa
-w /var/lib/docker -p wa
-w /etc/docker -p wa
-w /lib/systemd/system/docker.service -p wa
-w /lib/systemd/system/docker.socket -p wa
-w /etc/default/docker -p wa
-w /etc/docker/daemon.json -p wa
-w /usr/bin/docker-containerd -p wa
-w /usr/bin/docker-runc -p wa

Diese Regeln weisen auditd an, die angegebene Datei oder das angegebene Verzeichnis zu überwachen ("+ -w ") und alle Schreibvorgänge oder Attributänderungen (" -p wa +") in diesen Dateien zu protokollieren.

Starten Sie + auditd + neu, damit die Änderungen wirksam werden:

sudo systemctl restart auditd

Zu diesem Zeitpunkt haben Sie "+ auditd +" erfolgreich so konfiguriert, dass Docker-Dateien und -Verzeichnisse auf verdächtige Änderungen überprüft werden. Sie können das Docker Bench for Security-Skript erneut ausführen, um zu bestätigen, dass die Tests in Abschnitt 1 jetzt bestanden wurden.

Weitere Informationen zu + auditd + finden Sie in unserem Tutorial https://www.digitalocean.com/community/tutorials/how-to-use-the-linux-auditing-system-on-centos-7[How To Verwenden Sie das Linux-Auditing-System unter CentOS 7. Obwohl für CentOS geschrieben, gelten die Abschnitte zur Konfiguration und Verwendung des Auditing-Systems gleichermaßen für Ubuntu.

Nachdem wir unsere Hostkonfiguration überprüft haben, fahren wir mit Abschnitt 2 der Docker-Sicherheitsüberprüfung fort, der Docker-Dämonkonfiguration.

Schritt 3 - Korrigieren der Docker Daemon-Konfigurationswarnungen

Dieser Abschnitt des Audits befasst sich mit der Konfiguration des Docker-Daemons. Diese Warnungen können alle behoben werden, indem für den Dämon eine Konfigurationsdatei mit dem Namen "+ daemon.json +" erstellt wird, der einige sicherheitsrelevante Konfigurationsparameter hinzugefügt werden. Wir werden zuerst diese Konfigurationsdatei erstellen und speichern und dann nacheinander die Tests und die entsprechenden Zeilen in der Konfiguration überprüfen.

Öffnen Sie zunächst die Konfigurationsdatei in Ihrem bevorzugten Editor:

sudo nano /etc/docker/daemon.json

Dadurch erhalten Sie eine leere Textdatei. Fügen Sie Folgendes ein:

/etc/docker/daemon.json

{
   "icc": false,
   "userns-remap": "default",
   "log-driver": "syslog",
   "disable-legacy-registry": true,
   "live-restore": true,
   "userland-proxy": false,
   "no-new-privileges": true
}

Speichern und schließen Sie die Datei und starten Sie den Docker-Daemon neu, damit er diese neue Konfiguration aufnimmt:

sudo systemctl restart docker

Sie können jetzt das Audit wiederholen, um zu bestätigen, dass alle Warnungen in Abschnitt 2 behoben wurden.

Die Konfigurationsvariablen, die wir in diese Datei eingefügt haben, sind in derselben Reihenfolge angeordnet wie die Überwachungswarnungen. Lass uns durch jeden von ihnen gehen:

  • 2.1 Sicherstellen, dass der Netzwerkverkehr zwischen Containern auf der Standardbrücke beschränkt ist *

Diese Warnung wird durch "" icc ": false +" in der Konfigurationsdatei angesprochen. Diese Konfiguration erstellt Container, die nur dann miteinander kommunizieren können, wenn sie explizit mit " - link = " in der Docker-Befehlszeile oder mit dem Parameter " links: +" in den Docker Compose-Konfigurationsdateien verknüpft sind. Ein Vorteil davon ist, dass ein Angreifer, der einen Container kompromittiert, Schwierigkeiten hat, andere Container auf demselben Host zu finden und anzugreifen.

  • 2.8 Unterstützung für Benutzernamensräume aktivieren *

Linux-Namespaces bieten eine zusätzliche Isolation für Prozesse, die in Ihren Containern ausgeführt werden. Durch die erneute Zuordnung von Benutzernamensräumen können Prozesse als * root * in einem Container ausgeführt werden, während sie einem weniger privilegierten Benutzer auf dem Host zugeordnet werden. Wir aktivieren die Neuzuordnung des Benutzernamensraums mit der Zeile "" userns-remap ":" default "" in der Konfigurationsdatei.

Wir setzen den Parameter auf "+ default ", was bedeutet, dass Docker einen * dockremap * -Benutzer erstellt, dem Containerbenutzer neu zugeordnet werden. Sie können überprüfen, ob der Benutzer * dockremap * mit dem Befehl ` id +` erstellt wurde:

sudo id dockremap

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Outputuid=112(dockremap) gid=116(dockremap) groups=116(dockremap)

Wenn die Neuzuordnung von Containerbenutzern zu einem anderen Hostbenutzer für Ihren Anwendungsfall sinnvoller ist, geben Sie den Benutzer oder die Kombination "+ Benutzer: Gruppe " anstelle von " Standard +" in der Konfigurationsdatei an.

  • 2.11 Stellen Sie sicher, dass die Autorisierung für Docker-Client-Befehle aktiviert ist. *

Wenn Sie den Netzwerkzugriff auf den Docker-Socket zulassen müssen, sollten Sie Konsultieren Sie die offizielle Docker-Dokumentation, um herauszufinden, wie Sie die erforderlichen Zertifikate und Schlüssel einrichten so sicher.

Auf diesen Vorgang wird hier nicht eingegangen, da die Besonderheiten zu stark von den individuellen Gegebenheiten abhängen. Die Prüfung wird diesen Test weiterhin als "+ WARN +" kennzeichnen, obwohl der Zugriff auf den Standard-Docker-Socket nur für lokale Benutzer durch die Mitgliedschaft in der Gruppe "* docker *" geschützt ist, sodass dies ignoriert werden kann.

  • 2.12 Sicherstellen, dass die zentrale und Remote-Protokollierung konfiguriert ist *

In der Docker-Daemon-Konfigurationsdatei haben wir die Standard-Syslog-Protokollierung mit der Zeile "" log-driver ":" syslog "" aktiviert. Anschließend sollten Sie Syslog so konfigurieren, dass Protokolle an einen zentralen Syslog-Server weitergeleitet werden. Dadurch werden die Logs vom Docker-Host und von allen Angreifern, die sie ändern oder löschen könnten, abgemeldet.

Wenn Sie nur Docker-Protokolle weiterleiten und das Syslog nicht versenden möchten, können Sie den Remote-Syslog-Server in der Docker-Konfigurationsdatei angeben, indem Sie den folgenden Parameter an die Datei anhängen:

/etc/docker/daemon.json

   `"log-opts": { "syslog-address": "udp://:" }`

Stellen Sie sicher, dass Sie die IP-Adresse durch Ihre eigene Syslog-Serveradresse ersetzen.

Alternativ können Sie einen Protokolltreiber wie "+ splunk " oder " fluentd +" angeben, um Docker-Dämonprotokolle mit anderen Protokollaggregationsdiensten zu versenden. Weitere Informationen zu Docker-Protokolltreibern und ihrer Konfiguration finden Sie in der offiziellen Dokumentation zu Docker-Protokolltreibern unter https://docs.docker.com/config/containers/logging/configure/[.

  • 2.13 Sicherstellen, dass Vorgänge in der alten Registrierung (v1) deaktiviert sind *

Diese Warnung wird durch die Zeile +" disable-legacy-registry ": true + in der Daemon-Konfigurationsdatei behoben. Dadurch wird ein unsicheres Legacy-Image-Registrierungsprotokoll deaktiviert. Da die Unterstützung für dieses Protokoll bereits vom Docker-Daemon entfernt wurde, wird dieses Flag derzeit nicht mehr unterstützt.

  • 2.14 Sicherstellen, dass die Live-Wiederherstellung aktiviert ist *

Durch Angabe von "+" live-restore ": true +" in der Daemon-Konfiguration können Container weiter ausgeführt werden, wenn der Docker-Daemon dies nicht tut. Dies verbessert die Container-Verfügbarkeit während Updates des Host-Systems und anderer Stabilitätsprobleme.

  • 2.15 Sicherstellen, dass Userland Proxy deaktiviert ist *

Die Zeile +" userland-proxy ": false + behebt diese Warnung. Dadurch wird der Userland-Prozess "+ docker-proxy " deaktiviert, der standardmäßig die Weiterleitung von Host-Ports an Container behandelt und durch " iptables +" - Regeln ersetzt. Wenn Haarnadel-NAT verfügbar ist, wird der Userland-Proxy nicht benötigt und sollte deaktiviert werden, um die Angriffsfläche Ihres Hosts zu verringern.

  • 2.18 Sicherstellen, dass Container keine neuen Berechtigungen erhalten *

Die Zeile +" no-new-privileges ": true + in der Daemon-Konfiguration verhindert die Eskalation von Berechtigungen innerhalb von Containern. Dies stellt sicher, dass Container keine neuen Berechtigungen mit den Binärdateien "+ setuid " oder " setgid +" erlangen können.

Nachdem wir die Docker-Daemon-Konfiguration aktualisiert haben, beheben wir die verbleibende Warnung in Abschnitt 4 des Audits.

Schritt 4 - Content Trust aktivieren

Der letzte Test, der von unserer Prüfung als "4,5" gekennzeichnet wurde, lautet "Sicherstellen, dass die Vertrauenswürdigkeit von Inhalten für Docker aktiviert ist". Content Trust ist ein System zum Signieren von Docker-Bildern und zum Überprüfen ihrer Signaturen, bevor sie ausgeführt werden. Wir können Content Trust mit der Umgebungsvariablen ` DOCKER_CONTENT_TRUST +` aktivieren.

Geben Sie Folgendes in die Shell ein, um diese Variable für Ihre aktuelle Shell-Sitzung festzulegen:

export DOCKER_CONTENT_TRUST=1

Das Ausführen des Audits nach diesem "+ export " - Befehl sollte anzeigen, dass die Inhaltsvertrauensstellung aktiviert wurde, und diese Warnung löschen. Um es automatisch für alle Benutzer und alle Sitzungen zu aktivieren, fügen Sie die Variable " DOCKER_CONTENT_TRUST " zur Datei " / etc / environment +" hinzu. Hierbei handelt es sich um eine Datei zum Zuweisen systemweiter Umgebungsvariablen:

echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment

Weitere Informationen zur Vertrauenswürdigkeit von Docker-Inhalten finden Sie in der offiziellen Dokumentation zur Vertrauenswürdigkeit von Docker-Inhalten unter https://docs.docker.com/engine/security/trust/content_trust/.

An dieser Stelle haben wir uns mit allen Warnungen befasst, die im Docker Bench for Security-Skript angezeigt werden. Wir haben jetzt einen sichereren Docker-Host, auf dem Container ausgeführt werden können.

Fazit

In diesem Tutorial haben wir das Docker Bench for Security-Skript installiert, die Sicherheit unserer Docker-Installation überprüft und Warnungen behoben, indem wir "+ auditd +" und die Konfigurationsdatei des Docker-Dämons installiert und konfiguriert haben.

Nach Abschluss dieses Lernprogramms sollte das Ausführen des Überwachungsskripts nur noch wenige Fehler oder Warnungen verursachen. Sie sollten auch verstehen und gute Gründe haben, die weiterhin vorhandenen zu ignorieren.

Weitere Informationen zu den Docker-Sicherheitskonfigurationsoptionen finden Sie in der Docker documentation und in den Links zu bestimmten Unterabschnitten der Dokumentation, die in diesem Lernprogramm enthalten sind.