‫Gut. Wir wissen, dass wir nicht als root im Container laufen sollen.
‫Außerhalb des Containers hat die Wurzel im Container
‫übrigens keinen direkten Zugriff auf irgendetwas auf dem Host,
‫richtig. Nur weil Sie in
‫einem Container verwurzelt sind, sind Sie immer noch dort eingesperrt.
‫Wenn Sie jedoch die
‫nächste Stufe erreichen möchten, bei der der Benutzer, wenn er sogar über Root im Container
‫verfügt, zum Host ausbrechen möchte, da es einen
‫Kern mit einer Sicherheitsanfälligkeit gibt, über die
‫wir bereits gesprochen haben, z. B. Dirty Cow oder eine andere Sicherheitsanfälligkeit
‫in Docker oder so.
‫Der nächste Schritt, den Sie hier ausführen, ist das Aktivieren von
‫Benutzernamensräumen, die standardmäßig nicht aktiviert sind.
‫Ich habe hier einen Link, der zu einem Blog-Artikel
‫führt, der alles darüber erzählt.
‫Grundsätzlich handelt es sich um eine Einstellung pro Host, die Sie in der Docker-Konfiguration
‫festgelegt haben. Der Docker JSON.
‫Es teilt Docker mit, dass jederzeit ein neuer Container erstellt
‫wird, um diesen Container
‫als Benutzer ohne Rootberechtigung auf dem Host auszuführen.
‫Es gibt also im Grunde
‫genommen ein paar Programme, containerd und runC, die andere Programme sind, die
‫Docker verwendet, um Ihren Container zu starten.
‫Standardmäßig werden diese als root ausgeführt.
‫Eine Funktion von Docker ist die Aktivierung von
‫Benutzernamensräumen. Dies bedeutet, dass
‫Docker diese Container erstellt und sie nicht als
‫Unterprozess erzeugt, der wie Docker als Root ausgeführt wird.
‫Es wird sie als Benutzer mit einer hohen Nummer hervorbringen.
‫Eine Art, nicht unbedingt ein zufälliger Benutzer, sondern
‫ein High-Level-Benutzer.
‫Das heißt, wenn dieser Container jemals
‫Sicherheitslücken aufweist, durch die der Benutzer dem
‫Container entkommen kann, befindet sich immer noch nur ein Benutzer
‫auf dem Host. Weil sie als der
‫Benutzer fungieren, den der Prozess verwendet, der diesen Container
‫ausführt. Das runC im Wesentlichen.
‫Das runC-Programm startet diesen Container und wird
‫als Benutzer mit hoher Nummer und nicht
‫als Root ausgeführt. Dieser Benutzer hat wirklich
‫keine Berechtigungen außerhalb dieses Containers. Diese Funktion ist
‫also eine Einstellung pro Host, keine Einstellung pro
‫Container, und nicht alles funktioniert unter Benutzernamensräumen.
‫Sie müssen nur versuchen, zu üben.
‫Sie müssen es auf einigen Servern aktivieren, Ihre Anwendungen auf
‫diesem Server testen und prüfen, ob sie funktionieren.
‫Andernfalls müssen Sie Ihre
‫Architektur segmentieren. Wann immer ich
‫Benutzer-Namespaces in einem Cluster implementiere, haben wir in der Regel bestimmte
‫Worker-Knoten, für die Benutzer-Namespaces aktiviert sind.
‫Dort laufen die Programme, die das unterstützen, die
‫damit arbeiten.
‫Alles andere muss auf regulären Docker-Servern
‫anderswo laufen. So segmentieren wir es.
‫Wir unterteilen in zwei Klassen von Servern.
‫Sie wissen, dass ich, wenn Sie eine
‫DMZ ausführen, alle Benutzernamensräume, alle Server und
‫anschließend die ausgeführten Container in
‫der DMZ aktivieren würde es müsste geben, müsste
‫benutzernamensräume unterstützen.
‫Sie können sich keine Anwendungen ansehen und herausfinden, ob
‫sie Benutzernamensräume unterstützen.
‫Es ist ein... Benutzernamensräume sind nicht unbedingt
‫eine Docker-spezifische Funktion. Dies bedeutet im Wesentlichen, dass
‫Ihr Container in einem Namespace ausgeführt wird und
‫die Anwendung, die diesen Container ausführt, nun auch ein wenig
‫gesperrt ist.
‫Nicht alles kann das unterstützen. Du musst
‫nur üben oder vielleicht ein bisschen recherchieren, um
‫zu sehen, ob andere Leute es geschafft
‫haben, es dort unterzubringen. Wissen Sie, für alltägliche Dinge wie
‫MySQL und ähnliches. Aber für Ihre eigenen
‫Programme, die Sie entwickeln, müssen Sie sie natürlich nur testen, um
‫zu sehen, ob sie funktionieren. Ich würde sagen,
‫die meisten Programme und gebräuchlichen Sprachen, die ich
‫verwende, funktionieren einwandfrei in Benutzernamensräumen. Das eigentliche Problem
‫mit Benutzernamensräumen besteht darin, dass eine Anwendung, die auf
‫Volumes schreiben oder Bereitstellungen binden muss,
‫möglicherweise Uploads von Benutzerdateien hat und diese
‫für viele verschiedene Container freigibt. Das ist der Punkt, an dem Benutzernamensräume nicht unmöglich sind.
‫Es wird nur etwas knifflig, da die Dateien, die jetzt
‫auf dem Host auf die Festplatte geschrieben werden, jetzt als
‫ein anderer Benutzer geschrieben werden.
‫Da dieser Prozess auf dem Host, der den Container
‫verwaltet, ein anderer Benutzer ist.
‫Sie sehen also unterschiedliche Benutzer-IDs in diesen Dateien und müssen
‫sich nur darum kümmern.
‫Zu diesem Zeitpunkt gibt es Standard-Linux-Berechtigungen, und Sie
‫müssen diese Probleme nur auf verschiedene Arten und
‫Weisen automatisieren und lösen.
‫Zu diesem Zeitpunkt ist es nicht einmal wirklich ein Docker-Problem.
‫Es ist nur ein Berechtigungsproblem auf dem Host.