Ein IPC (Inter-Process Communication) Namespace ist eine Funktion des Linux-Kernels, die eine Isolation von System V IPC-Objekten wie Nachrichtenwarteschlangen, gemeinsam genutzten Speichersegmenten und Semaphoren bietet. Diese Isolation stellt sicher, dass Prozesse in verschiedenen IPC-Namespace nicht direkt auf die IPC-Objekte des jeweils anderen zugreifen oder diese ändern können, was eine zusätzliche Sicherheitsebene und Privatsphäre zwischen Prozessgruppen bietet.
So funktioniert es:
Wenn ein neuer IPC-Namespace erstellt wird, beginnt er mit einem vollständig isolierten Satz von System V IPC-Objekten. Das bedeutet, dass Prozesse, die im neuen IPC-Namespace ausgeführt werden, standardmäßig nicht auf die IPC-Objekte in anderen Namespaces oder im Host-System zugreifen oder diese stören können.
IPC-Objekte, die innerhalb eines Namespace erstellt werden, sind sichtbar und nur für Prozesse innerhalb dieses Namespace zugänglich. Jedes IPC-Objekt wird durch einen eindeutigen Schlüssel innerhalb seines Namespace identifiziert. Obwohl der Schlüssel in verschiedenen Namespaces identisch sein kann, sind die Objekte selbst isoliert und können nicht über Namespaces hinweg zugegriffen werden.
Prozesse können zwischen Namespaces mit dem setns() Systemaufruf wechseln oder neue Namespaces mit den Systemaufrufen unshare() oder clone() unter Verwendung des CLONE_NEWIPC-Flags erstellen. Wenn ein Prozess in einen neuen Namespace wechselt oder einen erstellt, beginnt er, die mit diesem Namespace verbundenen IPC-Objekte zu verwenden.
Labor:
Erstellen Sie verschiedene Namespaces
CLI
sudounshare-i [--mount-proc] /bin/bash
Durch das Einhängen einer neuen Instanz des /proc-Dateisystems, wenn Sie den Parameter --mount-proc verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine genaue und isolierte Sicht auf die prozessspezifischen Informationen dieses Namespaces hat.
Fehler: bash: fork: Kann Speicher nicht zuweisen
Wenn unshare ohne die Option -f ausgeführt wird, tritt ein Fehler auf, der auf die Art und Weise zurückzuführen ist, wie Linux neue PID (Prozess-ID) Namespaces behandelt. Die wichtigsten Details und die Lösung sind unten aufgeführt:
Problemerklärung:
Der Linux-Kernel erlaubt es einem Prozess, neue Namespaces mit dem Systemaufruf unshare zu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namespace initiiert (als "unshare"-Prozess bezeichnet), tritt jedoch nicht in den neuen Namespace ein; nur seine Kindprozesse tun dies.
Das Ausführen von %unshare -p /bin/bash% startet /bin/bash im selben Prozess wie unshare. Folglich befinden sich /bin/bash und seine Kindprozesse im ursprünglichen PID-Namespace.
Der erste Kindprozess von /bin/bash im neuen Namespace wird zu PID 1. Wenn dieser Prozess beendet wird, wird die Bereinigung des Namespaces ausgelöst, wenn keine anderen Prozesse vorhanden sind, da PID 1 die besondere Rolle hat, verwaiste Prozesse zu übernehmen. Der Linux-Kernel deaktiviert dann die PID-Zuweisung in diesem Namespace.
Folge:
Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des PIDNS_HASH_ADDING-Flags. Dies führt dazu, dass die Funktion alloc_pid fehlschlägt, wenn versucht wird, eine neue PID zuzuweisen, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
Lösung:
Das Problem kann gelöst werden, indem die Option -f mit unshare verwendet wird. Diese Option bewirkt, dass unshare einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
Das Ausführen von %unshare -fp /bin/bash% stellt sicher, dass der unshare-Befehl selbst PID 1 im neuen Namespace wird. /bin/bash und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Durch die Sicherstellung, dass unshare mit dem -f-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass /bin/bash und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
sudofind/proc-maxdepth3-typel-nameipc-execreadlink{} \; 2>/dev/null|sort-u# Find the processes with an specific namespacesudofind/proc-maxdepth3-typel-nameipc-execls-l{} \; 2>/dev/null|grep<ns-number>
Betreten Sie einen IPC-Namespace
nsenter-iTARGET_PID--pid/bin/bash
Auch können Sie nur in einen anderen Prozess-Namespace eintreten, wenn Sie root sind. Und Sie könnennichtin einen anderen Namespace eintretenohne einen Deskriptor, der darauf verweist (wie /proc/self/ns/net).
IPC-Objekt erstellen
# Containersudounshare-i/bin/bashipcmk-M100Sharedmemoryid:0ipcs-m------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x2fba90210root6441000# From the hostipcs-m# Nothing is seen