
Ich möchte einen Server verwenden, um mehrere Docker-Container zu hosten. Ich möchte einem anderen Benutzer die Möglichkeit geben, neue Docker-Container zu verwalten, möchte ihm jedoch keinen Zugriff auf alle anderen Container gewähren, die ich gestartet habe, da diese möglicherweise vertrauliche Daten enthalten.
Gibt es eine Möglichkeit, eine sichere Konfiguration zu erstellen, für die keine virtuelle Maschine erstellt werden muss?
Antwort1
Ursprüngliche Frage: Wie kann der Benutzer seine eigenen neuen Container erstellen, ohne auf die anderen Container zuzugreifen?
(Dies war ursprünglich meine Antwort, aber vielleicht habe ich die Frage falsch verstanden oder die Frage war nicht so klar. Ich habe die ursprüngliche Lösung trotzdem hier behalten)
Docker bietet diese Funktion nicht selbst, es gibt jedoch mehrere Möglichkeiten, dies zu tun.
Die Idee ist, dass für die Ausführung von Docker-Befehlen der Benutzer entweder Mitglied der Sudo- oder Docker-Gruppe sein muss. Wenn Sie also möchten, dass der Benutzer nur einen neuen Container startet, können Sie nur einige Docker-Befehle für diesen Benutzer auf die Whitelist setzen, anstatt ihn zur Sudo- oder Docker-Gruppe hinzuzufügen, die vollen Zugriff auf alle Docker-Befehle bietet.
Wenn Sie beispielsweise dem Benutzer Tom erlauben möchten, den folgenden Container auszuführen:
sudo docker container run --it --name ubuntu-tom ubuntu:latest bash
Sie können die folgende Zeile zu Ihrer sudoers-Datei hinzufügen, indem Sie ausführensudo sichtbar:
tom ALL=NOPASSWD: /usr/bin/docker container run --it --name ubuntu-tom ubuntu:latest bash
Dadurch kann der Benutzer Tom diesen bestimmten Docker-Befehl als Root ausführen, ohne dass ein Kennwort erforderlich ist. Alle anderen Docker-Befehle stehen dem Benutzer Tom weiterhin nicht zur Verfügung.
Eine weitere Alternative besteht darin, eine eingeschränkte Shell einzurichten, aber ich werde hier nicht ins Detail gehen.
Aktualisierte Frage: Wie kann der Benutzer auf die Verwaltung neuer Container beschränkt werden?
Mir ist keine mögliche Lösung bekannt, die nur Docker verwendet.
Es hört sich an, als ob Sie einen Orchestrator wie Kubernetes oder ECS benötigen.
Auf diese Weise besitzt der Orchestrator den Docker-Daemon und Sie können die vom Orchestrator bereitgestellte Berechtigungsebene nutzen. DiesArtikelist ein hervorragendes Beispiel für die Einschränkung des Benutzerzugriffs auf einen Namespace.
Antwort2
dockerd
Die Ausführung auf Benutzerbasis und die Verwendung von Dateiberechtigungen zur Trennung des Benutzerzugriffs sollte relativ unkompliziert sein .
Habe gerade ein Tutorial gefunden, in dem man Systemd-Vorlagen verwendet, um dieses Setup zu erhalten: https://www.jujens.eu/posts/de/2018/Feb/25/multiple-docker/
Antwort3
Warum implementieren Sie nicht Portainer? Es hat viele Funktionen wie Benutzersteuerung, GUI-Menü und vieles mehr, Sie müssen auch keinen Benutzer auf dem Server erstellen
Antwort4
Die Docker-API verfügt intern nicht über diese Funktion. Behandeln Sie den direkten Zugriff darauf als Funktion auf Systemadministratorebene, da Benutzer dadurch Root-Zugriff auf den Server erhalten. Um dies zu implementieren, müssen Sie daher entweder Ihren eigenen indirekten Zugriff auf die API bereitstellen oder ein anderes Tool verwenden, das diese Funktionalität zusätzlich zu Docker bereitstellt.
Sie können ein Skript bereitstellen, auf das über sudo zugegriffen wird und das alle Sicherheitsprüfungen der Befehle vor deren Ausführung durchführt. Die einfachste Möglichkeit, dies umzusetzen, besteht darin, jedem erstellten Objekt (Container, Datenträger, Netzwerk usw.) ein Label hinzuzufügen und dann in allen Abfragen nur Objekte zurückzugeben, die diesem Filter entsprechen, und die Ausführung von Befehlen auf Objekte mit diesen Labels zu beschränken. Das Schreiben ist nicht trivial, daher habe ich nur Leute gesehen, die sich für spätere Optionen entschieden haben. Wenn jedoch die Anzahl der ausgeführten Befehle und Container sehr begrenzt ist, ist dies möglicherweise eine ausreichend gute Lösung für Sie.
Diese Funktionalität wird durch Kubernetes-Namespaces bereitgestellt und läuft auf Docker. Dies ist sehr aufwändig zu implementieren, daher gehen die meisten Leute nur dann in diese Richtung, wenn sie viel mehr der von Kubernetes bereitgestellten Funktionalität benötigen.
Es gibt verschiedene Tools von Drittanbietern, einige davon kommerziell, die den Benutzerzugriff verwalten. Portainer und Rancher sind zwei beliebte, aber ich habe mit diesen keine persönlichen Erfahrungen.
Docker bietet ein Enterprise-Angebot mit diesem Inhalt namens UCP. Sie können Benutzern Docker-API/CLI-Zugriff gewähren, der UCP zur RBAC-Prüfung durchläuft, bevor die Anforderung an die zugrunde liegende Docker-Engine gesendet wird.