Im vorherigen Artikel „UID und GID in Docker-Containern verstehen“ stellte der Autor die Beziehung zwischen Benutzern in Docker-Containern und Benutzern auf dem Hostcomputer vor und kam zu dem Schluss, dass Docker Hostbenutzer und Benutzer in Containern standardmäßig nicht isoliert. Wenn Sie bereits mit der Benutzer-Namespace-Technologie von Linux vertraut sind (siehe „Linux-Namespace: Benutzer“), werden Sie sich natürlich fragen: Warum verwendet Docker nicht den Linux-Benutzer-Namespace, um eine Benutzerisolierung zu erreichen? Tatsächlich hat Docker bereits entsprechende Funktionen implementiert, diese sind jedoch nicht standardmäßig aktiviert. In diesem Artikel beschreibe ich, wie Docker konfiguriert wird, um Benutzer in Containern zu isolieren. Grundlegendes zum Linux-Benutzer-Namespace Der Linux-Benutzer-Namespace bietet sicherheitsrelevante Isolation (einschließlich UID und GID) für laufende Prozesse und beschränkt deren Zugriff auf Systemressourcen, ohne dass die Prozesse sich dieser Beschränkungen bewusst sind. Eine Einführung in den Linux-Benutzer-Namespace finden Sie in meinem Artikel „Linux-Namespace: Benutzer“. Der beste Weg, um Angriffe zur Rechteausweitung bei Containern zu verhindern, besteht darin, Containeranwendungen mit normalen Benutzerberechtigungen auszuführen. Benutzer-Namespace-Benutzerzuordnung Bevor ich den Docker-Daemon zur Aktivierung des Benutzer-Namespaces konfiguriere, muss ich einige Konzepte zu untergeordneten Benutzern/Gruppen und zur Neuzuordnung verstehen. Die Zuordnung untergeordneter Benutzer und Gruppen wird durch zwei Konfigurationsdateien gesteuert: /etc/subuid und /etc/subgid. Sehen Sie sich deren Standardinhalte an: Bevor ich den Docker-Daemon so konfiguriere, dass der Benutzer-Namespace aktiviert wird, muss ich einige Konzepte zu untergeordneten Benutzern/Gruppen und zur Zuordnung (Neuzuordnung) verstehen: Für Subuid bedeutet diese Zeile: Der Benutzer Nick hat im aktuellen Benutzernamensraum 65536 untergeordnete Benutzer mit Benutzer-IDs im Bereich von 100000 bis 165535. In einem untergeordneten Benutzernamensraum werden diese untergeordneten Benutzer Benutzern mit IDs im Bereich von 0 bis 65535 zugeordnet. subgid hat dieselbe Bedeutung wie subuid. Beispielsweise ist der Benutzer Nick nur ein Benutzer mit normalen Berechtigungen auf dem Hostcomputer. Wir können eine seiner untergeordneten IDs (z. B. 100000) dem Benutzernamensraum zuweisen, zu dem der Container gehört, und die ID 100000 der UID 0 in diesem Benutzernamensraum zuordnen. Selbst wenn der Prozess im Container zu diesem Zeitpunkt Root-Berechtigungen hat, befindet er sich nur im Benutzernamensraum, in dem sich der Container befindet. Sobald er sich auf dem Hostcomputer befindet, verfügen Sie höchstens über die Berechtigungen eines Nick-Benutzers. Wenn die Docker-Unterstützung für Benutzernamensräume aktiviert ist (Docker-Funktion „userns-remap“), können wir verschiedene Benutzer angeben, die dem Container zugeordnet werden sollen. Beispielsweise erstellen wir einen Benutzer „dockeruser“ und legen seine Subuid und Subgid manuell fest: Spitzname:100000:65536 Docker-Benutzer: 165536: 65536 Und weisen Sie es dem Docker-Daemon zu: { "userns-remap": "Dockeruser" } Bitte beachten Sie die Informationen zur Subuid-Einstellung. Die untergeordneten IDs, die wir für Dockeruser und Nick-Benutzer festlegen, überschneiden sich nicht. Tatsächlich können sich die untergeordneten ID-Einstellungen eines Benutzers nicht überschneiden. Oder wir halten es einfach und überlassen Docker die ganze Arbeit. Geben Sie dazu einfach den Parameter users-rempa des Docker-Daemons als „default“ an: { "userns-remap": "Standard" } An diesem Punkt führt Docker automatisch andere Konfigurationen durch. Konfigurieren Sie den Docker-Daemon, um die Benutzerisolierung zu aktivieren Hier wähle ich einen einfachen Ansatz und lasse Docker einen Standardbenutzer für den Benutzernamensraum erstellen. Wir müssen zuerst die Datei /etc/docker/daemon.json erstellen: $ sudo touch /etc/docker/daemon.json Bearbeiten Sie dann den Inhalt wie folgt (wenn die Datei bereits vorhanden ist, fügen Sie einfach die folgenden Konfigurationselemente hinzu) und starten Sie den Docker-Dienst neu: { "userns-remap": "Standard" } $ sudo systemctl starte docker.service neu Lassen Sie uns einige Punkte zur Benutzerisolierung überprüfen. Überprüfen Sie zunächst, ob Docker einen Benutzer mit dem Namen Dockremap erstellt hat: Überprüfen Sie dann, ob die mit Dockremap verbundenen Elemente des neuen Benutzers zu den Dateien /etc/subuid und /etc/subgid hinzugefügt wurden: Als nächstes haben wir festgestellt, dass unter dem Verzeichnis /var/lib/docker ein neues Verzeichnis erstellt wurde: 165536.165536. Überprüfen Sie die Berechtigungen des Verzeichnisses: 165536 ist eine vom Benutzer dockremap zugeordnete UID. Sehen Sie sich den Inhalt des Verzeichnisses 165536.165536 an: Es stimmt grundsätzlich mit dem Inhalt im Verzeichnis /var/lib/docker überein und zeigt an, dass nach Aktivierung der Benutzerisolierung dateibezogener Inhalt im neu erstellten Verzeichnis 165536.165536 abgelegt wird. Durch die oben genannten Prüfungen können wir bestätigen, dass der Docker-Daemon die Benutzerisolationsfunktion aktiviert hat. UID im Host und UID im Container Nachdem wir die Benutzerisolierung im Docker-Daemon aktiviert haben, schauen wir uns die Änderungen an der UID im Host und der UID im Container an. $ docker run -d --name sleepme ubuntu schlaf unendlich uid 165536 ist eine untergeordnete ID des Benutzers dockremap und hat keine besonderen Berechtigungen auf dem Hostcomputer. Der Benutzer im Container ist jedoch root, daher sieht das Ergebnis perfekt aus: Der neu erstellte Container erstellt einen Benutzernamensraum Bevor der Docker-Daemon die Benutzerisolierung aktiviert, befinden sich der neu erstellte Containerprozess und der Prozess auf dem Host im selben Benutzernamensraum. Das heißt, Docker erstellt keinen neuen Benutzernamensraum für den Container: In der obigen Abbildung befinden sich der Containerprozess sleep und der Prozess auf dem Host im selben Benutzernamensraum (die Benutzerisolationsfunktion ist nicht aktiviert). Nachdem wir die Benutzerisolierung im Docker-Daemon aktiviert haben, sehen wir uns den Benutzernamensraum des Prozesses im Container an: Die 4404 in der Abbildung oben ist die PID des Ruheprozesses im Container, den wir gerade gestartet haben. Wie Sie sehen, erstellt Docker einen neuen Benutzernamensraum für den Container. In diesem Benutzernamensraum ist der Benutzer „root“ im Container ein Gott und hat die höchste Macht! Zugriff auf Dateien im Datenvolumen Wir können auf die Dateien im Datenvolumen zugreifen, um nachzuweisen, welche Berechtigungen der Root-Benutzer im Container hat. Erstellen Sie vier Dateien, die jeweils den Benutzern root, 165536 und nick gehören. Nur der Root-Benutzer kann die Root-Datei lesen und schreiben. Der Benutzer Nick hat Lese- und Schreibberechtigungen für die Nick-Datei. UID 165536 hat Lese- und Schreibberechtigungen für die Datei 165536file. Jeder Benutzer kann die Testdatei lesen und schreiben: Als Nächstes mounten Sie diese Dateien als Datenträger in den Container und überprüfen die Berechtigungen für den Zugriff auf diese Dateien vom Container aus: $ docker run -it --name test -w=/testv -v $(pwd)/testv:/testv ubuntu Der Root-Benutzer im Container kann nur auf 165536file und Testfile zugreifen, was bedeutet, dass dieser Benutzer auf dem Hostcomputer nur sehr eingeschränkte Berechtigungen hat. Deaktivieren des Benutzernamensraums im Container Sobald der Parameter „userns-remap“ für den Docker-Daemon festgelegt ist, wird in allen Containern standardmäßig die Benutzerisolierung aktiviert (standardmäßig wird ein neuer Benutzer-Namespace erstellt). In einigen Fällen müssen wir möglicherweise zu dem Szenario zurückkehren, in dem die Benutzerisolierung nicht aktiviert ist. In diesem Fall können wir die Benutzerisolierung für einen einzelnen Container mit dem Parameter --userns=host deaktivieren. Der Parameter --userns=host wird hauptsächlich für die folgenden drei Befehle verwendet: Docker-Container erstellen Docker-Container ausführen Docker-Container-Exec Führen Sie beispielsweise den folgenden Befehl aus: $ docker run -d --userns=host --name sleepme ubuntu sleep infinity Prozessinformationen anzeigen: Der effektive Benutzer des Prozesses wird wieder root und es wird kein neuer Benutzer-Namespace für den Prozess erstellt: Bekannte Probleme Der Benutzernamespace ist eine relativ fortgeschrittene Funktion. Derzeit ist die Unterstützung von Docker dafür nicht perfekt. Im Folgenden sind einige bekannte Inkompatibilitäten mit vorhandenen Funktionen aufgeführt:
Zusammenfassen Docker unterstützt Benutzernamensräume und die Konfigurationsmethode ist außerdem sehr einfach. Nach der Aktivierung des Benutzernamensraums profitieren wir zwar von einer verbesserten Sicherheit, gleichzeitig können jedoch aufgrund verschiedener Einschränkungen bei einzelnen anderen Funktionen Probleme auftreten. Jetzt müssen wir eine Entscheidung treffen, uns von Einheitsentscheidungen verabschieden und dafür sorgen, dass in den richtigen Szenarien die richtigen Funktionen zum Einsatz kommen. siehe: Verstehen, wie uid und gid in Docker-Containern funktionieren Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Lösung für den Fehler beim Starten von MySQL aufgrund unzureichenden Speicherplatzes in Ubuntu
>>: Javascript zum Erzielen eines Trommeleffekts
Einführung in Flex Layout Flex bedeutet auf Engli...
Amtliche Dokumentation: Daher sollte MySQL wie fo...
1. Was ist Als Auszeichnungssprache hat CSS eine ...
Wenn Sie nach der Kompilierung und Installation v...
Code kopieren Der Code lautet wie folgt: <!DOC...
Aufgrund der zunehmenden Anzahl von Schaltflächen...
Derzeit habe ich ein Projekt erstellt, die Schnitt...
more ist eines unserer am häufigsten verwendeten ...
Die vier Eigenschaftswerte von Position sind: 1.V...
will-change teilt dem Browser mit, welche Änderun...
veranschaulichen Bei einer Eigeninstallation des ...
Testprojekt: react-demo Klonen Sie Ihr React-Demo...
Verwendung von „haben“ Mit der Having-Klausel kön...
Beim Erstellen einer Website habe ich festgestellt...
Es gibt zwei Arten von geplanten Tasks im Linux-S...