Schauen wir uns an, wie der Docker für die Produktionsumgebung gehärtet und gesichert wird.
Obwohl Docker hat es Softwareentwicklern und DevOps-Ingenieuren ermöglicht, Anwendungen schnell zu erstellen und bereitzustellen. Außerdem verfügt es über eine große Angriffsfläche für Cyber-Hacker zu nutzen.
Im Folgenden erfahren Sie, wie Sie einen Docker auf einer Linux-Plattform sichern.
- Konfigurationsfehler
- Remote-Codeausführung
- Pufferüberläufe
- Bildfälschung und so weiter.
Wir werden die folgenden Tools verwenden, wie z Notarserver von Docker Bilder zu signieren und Docker Bank Sicherheit um nach dem Host, der Daemon-Konfiguration usw. zu suchen.
Bevor wir mit dem Sichern fortfahren, wollen wir die Grundlagen berühren.
Was ist eine Containertechnologie?
Mithilfe der Containertechnologie können Entwickler oder DevOps-Ingenieure eine Anwendung so verpacken, dass sie mit Abhängigkeiten ausgeführt werden kann, die von anderen Prozessen isoliert sind.
Es gibt eine Reihe von Containertechnologien auf dem Markt, wie z Apache Mesos, lxc und Docker. Obwohl sie in die Kategorie der Containertechnologie fallen, funktionieren sie unterschiedlich.
Unterschied zwischen VM & VE
Ein Host für virtuelle Maschinen unterscheidet sich grundlegend von einem Host für virtuelle Umgebungen. Auf virtuellen Maschinen verfügt jede containerisierte Anwendung über einen eigenen Satz von Bibliotheken und Betriebssystemen, während Anwendungen standardmäßig auf einem Host einer virtuellen Umgebung wie lxc und Docker den Linux-Kernel gemeinsam nutzen.
Was ist Docker?
Docker ist eine Containertechnologie, mit der Millionen eine Webanwendung erstellen und von einem Test in einer Produktionsumgebung bereitstellen.
Docker-Engine
Die Docker Engine besteht aus drei Komponenten.
- Ein Server: Diese Komponente ist ein lang laufender Prozess oder Daemon, der für die Verwaltung von Images und Containern verantwortlich ist.
- REST-API: Diese Schnittstelle ermöglicht die Kommunikation zwischen dem Docker-Daemon und dem Docker-Client-Tool.
- Docker-Client-Tool: Das Docker-Client-Tool verwendet die REST-API-Komponente, um den Docker-Daemon über den Betrieb einer containerisierten Anwendung zu informieren.
Vertrauenswürdige Docker-Registrierung
Docker Trusted Registry ist eine Image-Speicherlösung von Docker für das Geschäft mit Unternehmensplattformen. Es unterscheidet sich von der Docker Hub. Während der Docker-Hub in der Cloud gehostet wird, ist die Docker Trusted Registry eine On-Premise-Speicherlösung für Docker Enterprise Edition.
Docker-Inhaltsvertrauen
Docker Content Trust bietet die Möglichkeit, Datensignaturen für Bilder zu verwenden, die an und von Remote-Docker-Registern wie Docker Hub gesendet und empfangen werden.
Linux-Namespaces
Linux-Namespaces sind eine Linux-Kernelfunktion, die eine containerisierte Anwendung oder einen Prozess, der auf einem Host einer virtuellen Umgebung ausgeführt wird, von anderen Prozessen isoliert.
Linux-Kontrollgruppen (Cgroups)
Linux Control Groups ist eine Linux-Kernelfunktion, mit der Sie Ressourcen wie CPU-Zeit, Netzwerkbandbreite, Systemspeicher usw. aktiven Prozessen auf einem Host zuweisen können.
Leistungen
Unter Linux gibt es eine Sicherheitsfunktion im Kernel-Subsystem, die festgelegt oder erzwungen werden kann, um den privilegierten Prozess zu begrenzen, den ein Benutzer mit UID 1 ausführt. Obwohl privilegierte Prozesse oder Benutzer diskretionäre Zugriffssteuerungsberechtigungen umgehen können, können sie diese nicht umgehen Fähigkeitsregeln.
Konzentrieren wir uns jetzt auf die Sicherheit.
Sichern des Docker-Hosts
In diesem Abschnitt erfahren Sie, wie Sie den Host sichern, auf dem sich Docker befindet.
Scanning Linux kernel
Bevor Sie ein Docker auf einer Linux-Plattform hosten, müssen Sie zuerst den Kernel überprüfen. Es gibt verschiedene Open-Source-Tools wie z Lynis und OpenVAS Sie können damit den Linux-Kernel scannen.
Kopieren oder klonen Sie das Lynis-Projekt von Github mit dem git clone
Befehl.
git clone https://github.com/CISOfy/lynis.git
Verwenden Sie als Nächstes den folgenden Befehl, um zum zu navigieren lynis
Verzeichnis und prüfen Sie das Linux-System.
cd lynis; ./lynis audit system
Harden Linux kernel
Nachdem Sie den Linux-Kernel auf systembasierte Schwachstellen überprüft haben, können Sie dem Kernel über eine weitere zusätzliche Schutzschicht hinzufügen Sicherheit. Es bietet Sicherheitsfunktionen wie die folgenden.
- Verhinderung der Nutzung von Pufferüberläufen
- / tmp Race Vulnerability Prevention
- / proc-Einschränkungen, bei denen keine Informationen über Prozessverantwortliche verloren gehen.
- Verhinderung der Ausführung von willkürlichem Code im Kernel und so weiter.
Zunächst können Sie herunterladen Patches kostenlos von grsecurity und wenden Sie es auf Ihren aktuellen Kernel an. Es sind jedoch keine kostenlosen Patches mehr zulässig.
Install Docker in a VM
Anstatt Docker direkt auf einem Linux-Host zu installieren, können Sie eine zusätzliche Schutzschicht hinzufügen, indem Sie es in einer virtuellen Maschine installieren. Selbst wenn ein Problem mit der Sicherheitsanfälligkeit des Host-Kernels vorliegt, wirkt sich dies nicht auf Docker-Container aus.
Protecting Root Privileges
Standardmäßig benötigt Docker Root-Rechte zum Erstellen und Verwalten von Containern. Das böswillige Skript kann diese Angriffsfläche nutzen, um zu einem Superuser auf einem Linux-Host zu eskalieren und schließlich auf vertrauliche Dateien / Ordner, Bilder, Zertifikate usw. zuzugreifen.
Um dies zu verhindern, können wir den folgenden Befehl verwenden. Wir können uns dafür entscheiden, Funktionen wie setgid
und setuid
um zu verhindern, dass andere Programme oder Prozesse ihre GID in eine andere ändern GID
Dies kann zu Eskalationsrechten führen. Sie können auch überprüfen hier für eine Liste der Linux-Funktionen Definition.
Der folgende Befehl führt den Apache-Webserver-Container aus und löscht den setgid
und setuid
Fähigkeiten über --cap-drop
um zu verhindern, dass der Apache-Container seine GID und UID in eine andere UID und GID ändert.
GID und UID beziehen sich in diesem Zusammenhang auf group ID
und user ID
beziehungsweise.
docker run -d --cap-drop SETGID --cap-drop SETUID apache
Docker User
Sie können nicht nur andere Programme oder Prozesse verhindern, sondern auch einen Benutzer zum Verwalten von Docker-Vorgängen wie z docker run
anstatt es über einen Superuser zu verwalten.
Sie können einen Docker-Benutzer folgendermaßen hinzufügen oder erstellen:
sudo groupadd docker
Der obige Befehl erstellt eine Gruppe mit dem Namen docker
Erstellen Sie als Nächstes einen Benutzer mit dem folgenden Befehl:
sudo useradd mike
Verwenden Sie abschließend den folgenden Befehl, um einen Benutzer hinzuzufügen mike
zur Gruppe docker
Docker-Operationen verwalten.
sudo usermod -aG docker mike
Managing Container with Cgroups
In einer Produktionsumgebung können Sie mehr als einen Container haben.
Wenn Sie nicht haben cgroups
Auf Ihrem Host installiert, können Sie ihn mit dem folgenden Befehl installieren und anschließend überprüfen hier (für Ubuntu) zur Konfiguration.
sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1
Wir können die Container begrenzten CPU-Ressourcen über das zuweisen --cpu-shares
und --cpuset-cpus
Das folgende Befehlsbeispiel zeigt prodnginx
Der Containerprozess wird nur auf dem ersten Kern über ausgeführt --cpuset-cpus
und ordnet 20 CPU über zu --cpu-shares
während die proxnginx
Der Containerprozess wird auf den ersten beiden CPU-Kernen ausgeführt und es werden auch 20 CPU zugewiesen.
docker run -d --name prodnginx --cpuset-cpus=0 --cpu-shares=20 nginx
docker run -d --name testnginx --cpuset-cpus=2 --cpu-shares=20 nginx
Geben Sie dann den Befehl ein docker stats
um die CPU-Auslastung durch die anzuzeigen prodnginx
und testnginx
Behälter
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
845bea7263fb prodnginx 57.69% 1.258MiB / 985.2MiB 0.13% 578B / 0B 1.33MB / 0B
189ba15e8258 testnginx 55.85% 1.25MiB / 985.2MiB 0.13% 578b / 0B 1.33MB / 0B
Es ist eine gute Idee, CPU-Freigaben für einen Docker-Host zu definieren, wenn mehr als ein Container darauf ausgeführt wird.
Managing Containers with Namespaces
Ein Namespace kann verhindern, dass Container als privilegierte Benutzer ausgeführt werden, wodurch Angriffe zur Eskalation von Berechtigungen vermieden werden können.
Wir können den Namespace im Docker aktivieren, indem wir Folgendes verwenden /etc/subuid
und /etc/subgid
Dateien wie unten gezeigt.
- Erstellen Sie einen Benutzer mit der
adduser
Befehl
sudo adduser dockremap
- Richten Sie eine Unter-ID für den Benutzer ein
dockremap
sudo sh -c 'echo dockremap:400000:65536 > /etc/subuid'
- Richten Sie dann die Subgid für den Benutzer ein
dockremap
sudo sh -c 'echo dockremap:400000:65536 > /etc/subgid'
- Öffnen Sie die
daemon.json
Datei und füllen Sie es mit dem folgenden Inhalt, um die zu verknüpfenuserns-remap
Attribut an den Benutzerdockremap
vi /etc/docker/daemon.json
{
"userns-remap": "dockremap"
}
- Presse
:wq
zu speichern und zu schließendaemon.json
Datei und starten Sie Docker schließlich neu, um Namespaces auf einem Docker-Host zu aktivieren
sudo /etc/init.d/docker restart
Securing the Docker Daemon
Es ist auch erforderlich, den Docker-Dämon zu konfigurieren, um eine sichere Kommunikation zwischen Docker-Client und Docker-Dämon über TLS sicherzustellen.
Verwenden Sie zum Öffnen den folgenden Befehl daemon.json
Datei und kopieren Sie den folgenden Inhalt und ersetzen Sie ihn (ersetzen Sie die IP durch Ihre tatsächliche), wie unten gezeigt
vi daemon.json
{
"debug": false,
"tls": true,
"tlscert": "/var/docker/server.pem",
"tlskey": "/var/docker/serverkey.pem",
"hosts": ["tcp://192.168.16.5:2376"]
}
Sichern von Docker-Komponenten
Schauen wir uns an, wie Sie Tools wie verwenden CodeNotar und Notarserver Bilder signieren, um Bildfälschungen zu vermeiden. Darüber hinaus müssen Bilder gescannt werden, um sicherzustellen, dass die Bilder nicht mit Sicherheitslücken gefüllt sind
Wir werden den Notarserver von Docker verwenden, um Bilder zu signieren und zu überprüfen und zu verwenden Ankermotor um Bilder auf Schwachstellen zu scannen.
Verify Images with Notary Server
Bevor wir den Notarserver zum Signieren von Bildern verwenden können, müssen wir Docker-Compose herunterladen und installieren. Wir werden verwenden Docker komponieren einen Notarserver einrichten.
- Führen Sie den folgenden Befehl aus, um die neueste Version von Docker Compose herunterzuladen
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- Wenden Sie ausführbare Berechtigungen auf das Docker-Compose an, wie unten gezeigt
sudo chmod 700 /usr/local/bin/docker-compose
- Mit dem folgenden Befehl können Sie testen, ob Sie Docker-Compose erfolgreich installiert haben
docker-compose --version
- Jetzt können wir den Notarserver über Docker-Compose installieren
git clone https://github.com/theupdateframework/notary.git
- Der obige Befehl klont oder kopiert den Notarserver von der Notariat
- Starten Sie den Notarserver und den Unterzeichner über die folgenden Befehle:
docker-compose build
docker-compose up -d
- Kopieren Sie dann die Konfiguration und testen Sie die Zertifikate mit dem folgenden Befehl in Ihr lokales Notarverzeichnis
mkdir -p ~/.notary && cp cmd/notary/config.json cmd/notary/root-ca.crt ~/.notary
- Führen Sie nun den folgenden Befehl aus, um den Notarserver mit dem Docker-Client zu verbinden
export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
- Generieren Sie ein Delegierungsschlüsselpaar über den folgenden Befehl
docker trust key generate mike --dir ~./docker/trust
- Jetzt erstellen wir einen neuen Zielschlüssel für den Fall, dass das Repository nicht vorhanden ist
docker trust signer add --key ~/.docker/trust/mike.pub mike mikedem0/whalesay
- Anschließend können Sie Ihr Docker-Image mit dem Befehl signieren
docker trust sign
. Sie müssen das Docker-Image vom Docker-Hub abrufen und mit dem Befehl erneut markierendocker pull
unddocker tag
beziehungsweise.
docker trust sign mikedem0/nginx:latest
Sie können Docker-Images auch auf Schwachstellen und Konfigurationsfehler scannen. Du kannst nachschauen hier um herauszufinden, wie Sie mit Anchor Engine nach Schwachstellen suchen und Docker Bench Sicherheit um nach Konfigurationsfehlern zu suchen.
Ich hoffe, dass Ihnen das oben Gesagte eine Vorstellung vom Sicherheits-Docker für die Produktionsumgebung gibt. Vielleicht möchten Sie auch diesen Udemy-Kurs über lesen Hacken und Sichern von Docker-Containern.