Informationen zur Docker-Sicherheit Probleme mit der Docker-TLS-verschlüsselten Kommunikation

Informationen zur Docker-Sicherheit Probleme mit der Docker-TLS-verschlüsselten Kommunikation

1. Sicherheitsprobleme mit Docker

Dockers eigene Schwachstellen

Als Anwendung weist Docker selbst Codefehler in seiner Implementierung auf. CVE erfasst offiziell mehr als 20 Schwachstellen in historischen Versionen von Docker. Zu den gängigen Angriffsmethoden von Hackern zählen Codeausführung, Rechteausweitung, Informationslecks und die Umgehung von Rechte. Derzeit werden Docker-Versionen sehr schnell aktualisiert. Daher wird Docker-Benutzern empfohlen, Docker auf die neueste Version zu aktualisieren.

Docker-Quellcodeproblem

Docker bietet einen Docker-Hub, der es Benutzern ermöglicht, von ihnen erstellte Bilder hochzuladen, sodass andere Benutzer sie herunterladen und schnell eine Umgebung erstellen können. Es bringt aber auch einige Sicherheitsprobleme mit sich.
Beispielsweise die folgenden drei Methoden:
(1) Hacker laden schädliche Bilder hoch. Wenn Hacker Trojaner, Backdoors und andere Schadsoftware in die von ihnen erstellten Bilder einpflanzen, ist die Umgebung von Anfang an unsicher und in Zukunft wird es keinerlei Sicherheit mehr geben.

(2) Images verwenden anfällige Software. Unter den Images, die auf Docker Hub zum Download zur Verfügung stehen, ist auf 75 % anfällige Software installiert. Daher müssen Sie nach dem Herunterladen des Images die Versionsinformationen der darin enthaltenen Software überprüfen, um festzustellen, ob die entsprechende Version Schwachstellen aufweist, und diese rechtzeitig aktualisieren und patchen.

(3) Man-in-the-Middle-Angriff: Bei der Übertragung kann es zu Bildmanipulationen kommen. Um dieses Problem zu verhindern, verfügt die neue Version von Docker über einen entsprechenden Prüfmechanismus.

2. Mängel der Docker-Architektur und Sicherheitsmechanismen

Durch die Architektur und Mechanismen von Docker selbst können Probleme entstehen, wie etwa ein Angriffsszenario, bei dem ein Hacker die Kontrolle über einige Container auf dem Hostcomputer übernommen hat oder Zugriff auf eine Möglichkeit zum Erstellen von Containern in einer öffentlichen Cloud erlangt hat und dann den Hostcomputer oder andere Container angreift.

LAN-Angriffe zwischen Containern

Die Container auf dem Host können ein lokales Netzwerk bilden, sodass Angriffe wie ARP-Spoofing, Sniffing und Broadcast Storms gegen das lokale Netzwerk eingesetzt werden können. Daher erfordert die Bereitstellung mehrerer Container auf einem Host eine angemessene Netzwerkkonfiguration und das Festlegen von iptable-Regeln.

DDoS-Angriffe erschöpfen die Ressourcen

Der Sicherheitsmechanismus von cgroups soll solche Angriffe verhindern. Dieses Problem kann vermieden werden, indem einem einzelnen Container nicht zu viele Ressourcen zugewiesen werden.

Anfälliger Systemaufruf

Ein wichtiger Unterschied zwischen Docker und einer virtuellen Maschine besteht darin, dass Docker und Hostmaschine denselben Betriebssystemkernel gemeinsam nutzen. Sobald der Host-Kernel eine Schwachstelle aufweist, die zu einer Rechteausweitung oder Privilegienerweiterung führen kann, kann ein Angreifer, selbst wenn Docker als normaler Benutzer ausgeführt wird, bei einem Eindringen in den Container immer noch die Kernel-Schwachstelle ausnutzen, um auf den Host-Computer zu springen und weitere Dinge zu tun.

Gemeinsame Root-Benutzerberechtigungen

Wenn Sie den Container mit Root-Benutzerberechtigungen ausführen, verfügt der Root-Benutzer im Container auch über Root-Berechtigungen auf dem Hostcomputer.

3. Der Unterschied zwischen Docker-Container und virtueller Maschine

Isolation und Teilen

Die virtuelle Maschine fügt eine Hypervisor-Schicht hinzu, um virtuelle Hardware wie Netzwerkkarten, Speicher und CPU zu virtualisieren, und erstellt dann darauf virtuelle Maschinen. Jede virtuelle Maschine hat ihren eigenen Systemkernel. Docker-Container isolieren Dateisysteme, Prozesse, Geräte, Netzwerke und andere Ressourcen und steuern dann Berechtigungen, CPU-Ressourcen usw., sodass Container sich nicht gegenseitig beeinflussen und den Hostcomputer nicht beeinträchtigen können. Der Container teilt den Kernel, das Dateisystem, die Hardware und andere Ressourcen mit dem Host.

Leistung und Verlust

Im Vergleich zu virtuellen Maschinen verbrauchen Container weniger Ressourcen. Auf derselben Hostmaschine können mehr Container erstellt werden als virtuelle Maschinen. Allerdings ist die Sicherheit virtueller Maschinen etwas besser als die von Containern. Um von der virtuellen Maschine aus in die Hostmaschine oder andere virtuelle Maschinen einzudringen, müssen Sie zuerst in die Hypervisor-Schicht eindringen, was äußerst schwierig ist. Der Docker-Container teilt den Kernel, das Dateisystem und andere Ressourcen mit dem Hostcomputer und hat wahrscheinlicher Auswirkungen auf andere Container und den Hostcomputer.

Grundlegende Docker-Sicherheitsstandards

Im Folgenden werden die Docker-Sicherheitsgrundstandards aus sechs Aspekten zusammengefasst: Kernel, Host, Netzwerk, Image, Container und andere.

Kernel-Ebene

(1) Aktualisieren Sie den Kernel rechtzeitig.
(2) User NameSpace (Root-Berechtigungen im Container befinden sich außerhalb des Containers in einem nicht hochprivilegierten Zustand).
(3) Cgroups (Kontingente und Metriken für Ressourcen).
(4) SELiux/AppArmor/GRSEC (Steuerung der Dateizugriffsberechtigungen).
(5) Kompetenzverteilung.
(6) Seccomp (begrenzte Systemaufrufe).
(7) Es ist verboten, den Container-Namensraum mit dem Host-Prozess-Namensraum zu teilen.

Hostebene

(1) Erstellen Sie unabhängige Partitionen für Container.
(2) Führen Sie nur notwendige Dienste aus.
(3) Es ist verboten, sensible Verzeichnisse auf dem Host dem Container zuzuordnen.
(4) Überprüfen Sie den Docker-Daemon sowie die zugehörigen Dateien und Verzeichnisse.
(5) Legen Sie eine geeignete Standardanzahl von Datei-Deskriptoren fest.

(Dateideskriptor: Der Kernel verwendet Dateideskriptoren, um auf Dateien zuzugreifen. Dateideskriptoren sind nicht negative Ganzzahlen. Beim Öffnen einer vorhandenen Datei oder beim Erstellen einer neuen Datei gibt der Kernel einen Dateideskriptor zurück. Das Lesen und Schreiben von Dateien erfordert auch die Verwendung von Dateideskriptoren, um die zu lesenden und zu schreibenden Dateien anzugeben.)

(6) Die Zugriffsberechtigungen für Docker-bezogene Dateien mit Root-Benutzerberechtigungen sollten 644 oder niedriger sein.
(7) Überprüfen Sie regelmäßig die Containerliste jedes Hosts und bereinigen Sie unnötige Container.

Netzwerkebene

(1) Legen Sie über iptables Regeln fest, um Netzwerkverkehr zwischen Containern zu verbieten oder zuzulassen.
(2) Erlauben Sie Docker, iptables zu ändern.
(3) Es ist verboten, Docker an eine andere IP/einen anderen Port oder einen anderen Unix-Socket zu binden.
(4) Das Zuordnen privilegierter Ports zu Containern ist verboten.
(5) Am Container werden nur die benötigten Anschlüsse geöffnet.
(6) Es ist verboten, den Host-Netzwerkmodus auf Containern zu verwenden.
(7) Wenn der Hostcomputer über mehrere Netzwerkkarten verfügt, binden Sie den eingehenden Datenverkehr des Containers an eine bestimmte Host-Netzwerkkarte.

Bildebene

(1) Erstellen Sie einen lokalen Image-Repository-Server.
(2) Die im Image enthaltene Software entspricht der aktuellsten Version.
(3) Verwenden Sie vertrauenswürdige Bilddateien und laden Sie diese über sichere Kanäle herunter.
(4) Erstellen Sie das Image neu, anstatt den Container und das Image zu patchen.
(5) Verwalten Sie Bild-Tags ordnungsgemäß und entfernen Sie nicht mehr verwendete Bilder rechtzeitig.
(6) Verwenden Sie Spiegelscannen.
(7) Bildsignatur verwenden.

Behälterebene

(1) Minimieren Sie den Container und den Mindestsatz an Betriebssystem-Images.
(2) Der Container läuft als einzelner Hauptprozess.
(3) Dem privilegierten Tag ist die Nutzung privilegierter Container untersagt.
(4) Es ist verboten, einen SSH-Dienst auf dem Container auszuführen.
(5) Mounten Sie das Stammverzeichnissystem des Containers im schreibgeschützten Modus.
(6) Definieren Sie eindeutig den zum Container gehörenden Laufwerksbuchstaben.
(7) Durch die Einstellung „on-failure“ können Sie die Anzahl der Neustartversuche des Containers begrenzen. Wiederholte Neustarts des Containers können leicht zu Datenverlust führen.
(8) Begrenzen Sie den im Container verfügbaren Prozessbaum, um Fork Bombs zu vermeiden.

Andere Einstellungen

(1) Führen Sie regelmäßig Sicherheitsüberprüfungen des Hostsystems und der Container durch.
(2) Führen Sie Container mit minimalen Ressourcen und minimalen Berechtigungen aus.
(3) Vermeiden Sie die Bereitstellung einer großen Anzahl von Containern auf demselben Host und beschränken Sie sich auf eine überschaubare Anzahl.
(4) Überwachen Sie die Nutzung, Leistung und andere Indikatoren von Docker-Containern.
(5) Fügen Sie Funktionen zur Bedrohungserkennung und Reaktion auf Vorfälle in Echtzeit hinzu.
(6) Nutzung zentraler und Remote-Protokollerfassungsdienste

Docker-TLS-verschlüsselte Kommunikation

Um zu verhindern, dass während der Docker-Kommunikation Link-Hijacking, Session-Hijacking und andere Probleme zu Man-in-the-Middle-Angriffen führen, sollten beide Enden des c/s verschlüsselt kommunizieren.

Erstellen Sie einen Ordner und ändern Sie den Hostnamen (für die spätere Verwendung).

[root@server1 ~]# mkdir /tls

[root@server1 ~]# cd /tls

[root@server1 tls]# hostnamectl set-hostname master

[root@server1 tls]# bash

[root@master tls]

Kundenergänzungen:

[root@client ~]# vim /etc/hosts 

Erstellen Sie einen CA-Schlüssel und legen Sie das Schlüsselkennwort fest

[root@master tls]# openssl genrsa -aes256 -out ca-key.pem 4096

Generieren eines privaten RSA-Schlüssels, 4096 Bit langes Modul

...........................................++

...................................................................................................................................................................................++

e ist 65537 (0x10001)

Geben Sie die Passphrase für ca-key.pem ein:

Überprüfen – Geben Sie die Passphrase für ca-key.pem ein:

Erstellen eines CA-Zertifikats

[root@master tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=liuwei" -out ca.pem

Geben Sie die Passphrase für ca-key.pem ein: ###Geben Sie das Passwort ein

Erstellen eines privaten Serverschlüssels

[root@master tls]# openssl genrsa -out server-key.pem 4096

Generieren eines privaten RSA-Schlüssels, 4096 Bit langes Modul

................................++

................................++

e ist 65537 (0x10001)

Signatur privater Schlüssel

[root@master tls]# openssl req -subj "/CN=lw" -sha256 -new -key server-key.pem -out server.csr

Verwenden Sie zum Signieren ein CA-Zertifikat und ein privates Schlüsselzertifikat. Geben Sie 123456 ein.

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

Unterschrift ok

Betreff=/CN=lw

Abrufen des privaten CA-Schlüssels

Geben Sie die Passphrase für ca-key.pem ein: 

Clientschlüssel generieren

[root@master tls]# openssl genrsa -out key.pem 4096 

Signatur-Client

[root@master tls]# openssl req -subj "/CN=client" -new -key key.pem -out client.csr

Erstellen einer Konfigurationsdatei

echo extendedKeyUsage=clientAuth > extfile.cnf

Signaturzertifikat, geben Sie 123456 ein, erforderlich (Signaturclient, CA-Zertifikat, CA-Schlüssel)

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

Unterschrift ok

Betreff=/CN=Kunde

Abrufen des privaten CA-Schlüssels

Geben Sie die Passphrase für ca-key.pem ein: 

Ändern Sie die Docker-Konfigurationsdatei und starten Sie den Dienst neu

ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2388 -H unix:///var/run/docker.sock 

Starten Sie Docker neu

[root@master tls]# systemctl daemon-reload

[root@master tls]# systemctl Neustart Docker

Kopieren Sie die drei Dateien /tls/ca.pem /tls/cert.pem /tls/key.pem auf den Client.

[root@master tls]# scp ca.pem [email protected]:/etc/docker 

[root@master tls]# scp cert.pem [email protected]:/etc/docker 

[root@master tls]# scp key.pem [email protected]:/etc/docker 

Bei der TLS-Verifizierung müssen Sie die vom privaten Schlüssel festgelegte ID verwenden, daher müssen die oben genannten Hostnamen in lw geändert werden.

Lokale Authentifizierung

[root@lw tls]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://lw:2388 Version 

Laden Sie das NGINX-Image herunter

[root@lw tls]# Docker zieht nginx

Bereitstellen der Clientumgebung und Überprüfen von TLS

Geben Sie das Verzeichnis /etc/docker ein

Überprüfen Sie die Docker-Version auf der Clientseite

[root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://lw:2388 Version 

Bereitstellungsumgebung, TLS überprüfen

Sehen Sie sich die Clientbilder an

[root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://lw:2388 Bilder 

Dies ist das Ende dieses Artikels über Docker-Sicherheit und Docker-TLS-verschlüsselte Kommunikation. Weitere Informationen zur Docker-TLS-verschlüsselten Kommunikation finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detailliertes Beispiel für eine Remote-Verbindung zu Docker mithilfe einer TLS-verschlüsselten Kommunikation
  • Implementierung der One-Click-TLS-Verschlüsselung für die Docker-Remote-API

<<:  Detaillierte Erklärung des Unterschieds zwischen Uniapp und Vue

>>:  Schnelle Lösung zum Vergessen des MySQL8-Passworts

Artikel empfehlen

XHTML-Tags haben ein schließendes Tag

<br />Ursprünglicher Link: http://www.dudo.o...

Detaillierte Erklärung der Fallstricke beim Mischen von npm und cnpm

Inhaltsverzeichnis Ursache Grund Einführung in NP...

SQL-Implementierung von LeetCode (184. Das höchste Gehalt der Abteilung)

[LeetCode] 184. Abteilung Höchstes Gehalt Die Mit...

Detaillierte Erklärung der Linux-CPU-Last und CPU-Auslastung

CPU-Last und CPU-Auslastung Beides kann bis zu ei...

Das Konzept von MTR in MySQL

MTR steht für Mini-Transaktion. Wie der Name scho...

Detaillierte Erklärung der jQuery-Kettenaufrufe

Inhaltsverzeichnis Kettenanrufe Ein kleiner Koffe...

So überprüfen Sie die PCIe-Version und -Geschwindigkeit unter Linux

PCIE verfügt über vier verschiedene Spezifikation...

Detaillierte Erklärung, wie eine SQL-Anweisung in MySQL ausgeführt wird

Überblick Ich habe vor Kurzem begonnen, mir Wisse...