Warum verwendet Docker beim Starten eines neuen Containers standardmäßig dieselben Benutzer- und Cgroup-Namespaces?

Warum verwendet Docker beim Starten eines neuen Containers standardmäßig dieselben Benutzer- und Cgroup-Namespaces?

Warum verwendet Docker beim Starten eines neuen Containers standardmäßig dieselben Benutzer- und Cgroup-Namespaces?

Ich verstehe nicht, warum Docker keinen neuen Benutzer-Namespace einrichtet, sodass dieser rootim Container nicht derselbe ist wie rootauf dem Host.

Insbesondere da alles andere (außer cgroup) in Namespaces gespeichert ist, macht es wirklich keinen Sinn, den Container nicht standardmäßig vollständig zu isolieren.

Kann jemand erklären, warum Benutzernamensräume von Docker nicht standardmäßig aktiviert werden?

Host-Namespaces:

parallels@debian-gnu-linux-vm:~$ ls -la /proc/self/ns
total 0
dr-x--x--x 2 parallels parallels 0 Jan 30 17:29 .
dr-xr-xr-x 9 parallels parallels 0 Jan 30 17:29 ..
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 net -> net:[4026531957]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 pid -> pid:[4026531836]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 user -> user:[4026531837]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 uts -> uts:[4026531838]

Container-Namespaces:

docker run -ti --rm debian:latest
root@210189a7a164:/# ls -la /proc/self/ns
total 0
dr-x--x--x 2 root root 0 Jan 30 16:30 .
dr-xr-xr-x 9 root root 0 Jan 30 16:30 ..
lrwxrwxrwx 1 root root 0 Jan 30 16:30 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 ipc -> 'ipc:[4026532287]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 mnt -> 'mnt:[4026532285]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 net -> 'net:[4026532290]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 pid -> 'pid:[4026532288]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 uts -> 'uts:[4026532286]'

Die userund cgroupNamespaces sind für Host und Container identisch.

Antwort1

Was die Einzelheiten der Entscheidung von Docker angeht, Userns nicht standardmäßig zu aktivieren, müssen Sie wahrscheinlich Docker fragen, aber ich kann eine mögliche Begründung anbieten.

Die allgemeine Designphilosophie von Docker scheint darin bestanden zu haben, die Verwendung von Containern zu ermöglichen und gleichzeitig Störungen und Komplikationen im Entwicklungsworkflow zu minimieren.

Das Aktivieren von Benutzernamensräumen kann beim Mounten von Volumes vom zugrunde liegenden Host zu Problemen mit Datei-/Verzeichnisberechtigungen führen, da die im Container verwendete UID/GID möglicherweise keine Rechte für gemountete Verzeichnisse hat.

Dies kann natürlich durch eine sorgfältige Verwaltung dieser Berechtigungen behoben werden, es stellt jedoch eine Störung dar.

Benutzernamensräume sind als Option verfügbar, sodass einzelne Organisationen und Benutzer diese weiterhin aktivieren können. Sie müssen sie lediglich einrichten.

Es ist erwähnenswert, dass Docker auch daran arbeitet, "rootless" Docker-Unterstützung zu ermöglichen und dies ist jetzt als experimentelle Option verfügbar (weitere DetailsHier) und dies würde das Gesamtproblem lösen, indem sichergestellt wird, dass kein Container (oder der Daemon selbst) als Root ausgeführt wird.

Antwort2

Es ist im Grunde der klassische Kompromiss zwischen Benutzerfreundlichkeit und Sicherheit. Ich habe es für meinen Entwickler-Desktop konfiguriert, nachdemCVE-2019-5736wurde berichtet, dass es durch Benutzernamensräume gemildert wurde, und einige Monate später wurde es deaktiviert. Es macht es sehr schwierig, mit Host-Volumes zu arbeiten. Das ist keine große Sache für eine bereitgestellte Cloud-native Anwendung, aber ein großes Problem, wenn Sie Docker für DevOps-Zwecke wie CI-Builds oder Sysadmin-Tools oder für Legacy-Apps verwenden, die von vielen Host-Dateien abhängen.

Das Problem wurde dadurch verschärft, dass ich der Einzige war, der dieses Problem hatte. Das wäre natürlich nicht der Fall, wenn Benutzernamensräume wie von Ihnen vorgeschlagen die Standardeinstellung wären. Allerdings war die Funktion erst ab Docker 1.10 verfügbar und eine Änderung der Standardeinstellung wäre zu störend für bestehende Benutzer gewesen.

verwandte Informationen