table of contents
UNSHARE(1) | Dienstprogramme für Benutzer | UNSHARE(1) |
BEZEICHNUNG¶
unshare - Programm in neuen Namensräumen ausführen
ÜBERSICHT¶
unshare [Optionen] [Programm [Argumente]]
BESCHREIBUNG¶
Der Befehl unshare erzeugt neue Namensräume (wie in den nachfolgend beschriebenen Befehlszeilenoptionen angegeben) und führt dann das angegebene Programm aus. Falls kein Programm angegeben ist, dann wird »${SHELL}« ausgeführt (Vorgabe: /bin/sh).
In der Voreinstellung ist ein neuer Namensraum nur so lange beständig, wie er Mitgliedprozesse hat. Ein neuer Namensraum kann beständig gemacht werden, selbst wenn es keine Mitgliedprozesse gibt, indem /proc/PID/ns/Typ-Dateien mit »bind« in einen Dateisystempfad eingebunden werden. Ein Namensraum, der auf diese Weise beständig gemacht wurde, kann anschließend mit nsenter(1) betreten werden, sogar, wenn das Programm beendet wird (außer PID-Namensräume, bei denen ein dauerhaft laufender Init-Prozess benötigt wird). Sobald ein beständiger Namensraum nicht länger benötigt wird, kann die Beständigkeit mit umount(8) aufgehoben werden, um die Bind-Einhängung aufzuheben. Weitere Einzelheiten finden Sie im Abschnitt BEISPIELE.
unshare verwendet seit Util-linux Version 2.36 die Dateien /proc/[PID]/ns/pid_for_children und /proc/[PID]/ns/time_for_children für dauerhafte PID- und ZEIT-Namensräume. Diese Änderung erfordert einen Linux-Kernel der Version 4.17 oder neuer.
Die folgenden Namensraumtypen können mit unshare erzeugt werden:
Einhänge-Namensraum
Seit Util-Linux Version 2.27 setzt unshare die Ausbreitung in einem neuen Einhängenamensraum auf private, um sicherzustellen, dass der neue Namensraum wirklich getrennt ist. Diese Funktionalität kann mit der Option --propagation unchanged deaktiviert werden. Beachten Sie, dass private die Vorgabe des Kernels ist.
UTS-Namensraum
IPC-Namensraum
Netzwerk-Namensraum
PID-Namensraum
Cgroup-Namensraum
Benutzer-Namensraum
Zeit-Namensraum
OPTIONEN¶
-i, --ipc[=Datei]
-m, --mount[=Datei]
-n, --net[=Datei]
-p, --pid[=Datei]
Siehe auch die Optionen --fork und --mount-proc.
-u, --uts[=Datei]
-U, --user[=Datei]
-C, --cgroup[=Datei]
-T, --time[=Datei]
-f, --fork
--keep-caps
--kill-child[=Signalname]
--mount-proc[=Einhängepunkt]
--mount-binfmt[=mountpoint]
--map-user=UID|Name
--map-users=innere_UID:äußere_UID:Anzahl|auto|all
Vor der Version 2.39 von util-linux erwartete diese Option ein durch Kommata getrenntes Argument der Form äußere_UID,innere_UID,Anzahl, aber dieses Format ist als veraltet anzusehen, um die Kompatibilität mit der in /proc/[PID]/uid_map und in der Einhängeoption X-mount.idmap verwendeten Anordnung zu gewährleisten.
--map-group=GID|Name
--map-groups=innere_GID:äußere_GID:Anzahl|auto|all
Vor der Version 2.39 von util-linux erwartete diese Option ein durch Kommata getrenntes Argument der Form äußere_GID,innere_GID,Anzahl, aber dieses Format ist als veraltet anzusehen, um die Kompatibilität mit der in /proc/[PID]/gid_map und in der Einhängeoption X-mount.idmap verwendeten Anordnung zu gewährleisten.
--map-auto
-r, --map-root-user
-c, --map-current-user
--propagation private|shared|slave|unchanged
--setgroups allow|deny
Um setgroups(2) aufrufen zu können, muss der aufrufende Prozess mindestens über CAP_SETGID verfügen. Seit Linux 3.19 gilt eine weitere Einschränkung: Der Kernel erteilt die Berechtigung, setgroups(2) aufzurufen, nur nachdem die GID-Abbildung (/proc/pid*/gid_map*) eingerichtet wurde. Die GID-Abbildung ist durch Root beschreibbar, wenn setgroups(2) aktiviert ist (d.h. allow, die Vorgabe) und die GID-Abbildung wird durch unprivilegierte Prozesse beschreibbar, wenn setgroups(2) permanent deaktiviert ist (mit deny).
-R, --root=Verzeichnis
-w, --wd=Verzeichnis
-S, --setuid UID
-G, --setgid GID
-l, --load-interp=string
--monotonic Versatz
--boottime Versatz
-h, --help
-V, --version
ANMERKUNGEN¶
Die proc- und sysfs-Dateisystemeinhängungen als Root in einem Benutzernamensraum müssen eingeschränkt werden, so dass ein weniger privilegierter Benutzer nicht mehr Zugriffe auf sensible Dateien haben kann, als ein höher privilegierter Benutzer unverfügbar gemacht hat. Kurz gesagt, die Regeln für proc und sysfs sind so ähnlich zu einer Bind-Einhängung wie möglich.
BEISPIELE¶
Der folgende Befehl erzeugt einen PID-Namensraum, wobei --fork verwendet wird, um sicherzustellen, dass der aufgerufene Befehl in einem Kind-Namensraum ausgeführt wird (welcher der erste Prozess im Namensraum ist), der die PID 1 hat. Die Option --mount-proc sorgt dafür, dass gleichzeitig auch ein neuer Einhängenamensraum erzeugt und ein neues proc(5)-Dateisystem eingehängt wird, das Informationen zum neuen PID-Namensraum enthält. Wenn der Befehl readlink(1) beendet wird, werden die neuen Namensräume automatisch zerstört.
# unshare --fork --pid --mount-proc readlink /proc/self 1
Mit den Rechten eines unprivilegierten Benutzers einen neuen Benutzernamensraum erstellen, in welchem die Anmeldedaten des Benutzers auf die Root-Kennungen innerhalb des Namensraums abgebildet werden:
$ id -u; id -g 1000 1000 $ unshare --user --map-root-user \
sh -c 'whoami; cat /proc/self/uid_map /proc/self/gid_map' root
0 1000 1
0 1000 1
Als unprivilegierter Benutzer einen Benutzer-Namensraum erstellen, in dem die ersten 65536 IDs alle abgebildet sind und die Anmeldedaten der Benutzer auf die Root-IDs innerhalb dieses Namensraums abgebildet sind. Die Abbildung wird durch die in subuid(5) und subgid(5) zugewiesenen Subordinaten-IDs bestimmt. Diese Abbildung durch Erstellung einer Datei mit der Benutzer-ID 1 und der Gruppen-ID 1 demonstrieren. Der Kürze halber werden nur die Abbildungen der Benutzer-IDs angezeigt:
$ id -u 1000 $ cat /etc/subuid 1000:100000:65536 $ unshare --user --map-auto --map-root-user # id -u 0 # cat /proc/self/uid_map
0 1000 1
1 100000 65535 # touch file; chown 1:1 file # ls -ln --time-style=+ file -rw-r--r-- 1 1 1 0 file # exit $ ls -ln --time-style=+ file -rw-r--r-- 1 100000 100000 0 file
Der erste der folgenden Befehle erzeugt einen neuen dauerhaften UTS-Namenraum und ändert den Rechnernamen so, wie er im Namensraum gesehen wird. Der Namensraum wird dann mit nsenter(1) betreten, um den geänderten Rechnernamen anzuzeigen; dieser Schritt demonstriert, dass der UTS-Namensraum weiter existiert, obwohl der Namensraum nach dem Beenden des unshare-Prozesses keine eigenen Mitgliedprozesse mehr hat. Der Namensraum wird dann durch Entfernen der Bind-Einhängung zerstört.
# touch /root/uts-ns # unshare --uts=/root/uts-ns hostname FOO # nsenter --uts=/root/uts-ns hostname FOO # umount /root/uts-ns
Die folgenden Befehle etablieren einen dauerhaften Einhängenamensraum, der von der »bind«-Einhängung /root/namespaces/mnt angegeben wird. Um sicherzustellen, dass die Erzeugung dieser Bind-Einhängung erfolgreich ist, wird das Elternverzeichnis (/root/namespaces) zu einer Bind-Einhängung, deren Ausbreitungstyp nicht shared ist.
# mount --bind /root/namespaces /root/namespaces # mount --make-private /root/namespaces # touch /root/namespaces/mnt # unshare --mount=/root/namespaces/mnt
Die folgenden Befehle demonstrieren die Verwendung der Option --kill-child beim Erzeugen eines PID-Namensraums, um sicherzustellen, dass beim Töten von unshare alle Prozesse innerhalb des PID-Namensraums getötet werden.
# set +m # Keine Meldungen zum Auftragsstatus ausgeben # unshare --pid --fork --mount-proc --kill-child -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' & [1] 53456 # PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a # ps h -o 'comm' $! # Zeigen, dass der Hintergrund-Job unshare(1) ist unshare # kill $! # unshare(1) töten # pidof sleep
Der Befehl pidof(1) gibt nichts aus, da die sleep-Prozesse getötet wurden. Genauer gesagt: Wenn der sleep-Prozess, der in dem Namensraum die Prozesskennung 1 hat (also der Init-Prozess dieses Namensraums) getötet wurde, dann werden daraufhin alle anderen Prozesse in diesem Namensraum getötet. Im Gegensatz dazu zeigt eine ähnliche Reihe von Befehlen, bei denen die Option --kill-child nicht verwendet wird, dass die Prozesse in diesem PID-Namensraum beim Beenden von unshare nicht getötet werden:
# unshare --pid --fork --mount-proc -- \
bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' & [1] 53479 # PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a # kill $! # pidof sleep 53482 53480
Der folgende Befehl demonstriert die Erzeugung eines Zeit-Namensraums, in dem die Bootzeit-Uhr auf einen Zeitpunkt gesetzt ist, der einige Jahre in der Vergangenheit liegt:
# uptime -p # Betriebszeit im ursprünglichen Zeit-Namensraum anzeigen up 21 hours, 30 minutes # unshare --time --fork --boottime 300000000 uptime -p up 9 years, 28 weeks, 1 day, 2 hours, 50 minutes
The following example execute a chroot into the directory /chroot/powerpc/jessie and install the interpreter /bin/qemu-ppc-static to execute the powerpc binaries.
$ unshare --map-root-user --fork --pid --load-interp=":qemu-ppc:M::\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x14:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff:/bin/qemu-ppc-static:OCF" --root=/chroot/powerpc/jessie /bin/bash -l
The load-interp parameter can be read as following
qemu-ppc
M
\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x1
\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff
/bin/qemu-ppc-static
OCF
AUTOREN¶
Mikhail Gusarov <dottedmag@dottedmag.net>, Karel Zak <kzak@redhat.com>
SIEHE AUCH¶
newuidmap(1), newgidmap(1), clone(2), unshare(2), namespaces(7), mount(8)
FEHLER MELDEN¶
Nutzen Sie zum Melden von Fehlern das Fehlererfassungssystem auf <https://github.com/util-linux/util-linux/issues>.
VERFÜGBARKEIT¶
Der Befehl unshare ist Teil des Pakets util-linux, welches aus dem Linux-Kernel-Archiv <https://www.kernel.org/pub/linux/utils/util-linux/> heruntergeladen werden kann.
2024-10-01 | util-linux 2.40.2 |