Erstellen Sie einen PID-Namespace
Der richtige Befehl ist hier unshare
. Beachten Sie, dass die dazu erforderlichen Optionen nur von verfügbar sind util-linux 2.23
. Die Idee ist, einen neuen PID-Namespace für das von Ihnen ausgeführte Programm zu erstellen, sodass auch alle untergeordneten Programme in diesem Namespace erstellt werden. Sie können einen Befehl in einem neuen PID-Namespace ausführen, indem Sie Folgendes ausführen:
sudo unshare -fp some_command
Um eine Shell auszuführen, lassen Sie einfach den Befehl aus. Dadurch wird ein Prozess erstellt, der zusammen mit einem seiner untergeordneten Elemente wie gewohnt eine PID im übergeordneten Namespace (Systemnamespace) hat. Innerhalb des neuen Namespaces hat es jedoch eine PID von 1
zusammen mit einigen der besonderen Merkmale des init
Prozesses. Aus Sicht der Überwachung ist das vielleicht relevanteste Merkmal, dass ein verwaister Nachkomme eines Unternehmens diesem Prozess und nicht dem eigentlichen init
Prozess zugeordnet wird.
Für die meisten Überwachungsfälle kann es ausreichen, dies einfach zu tun. Wie bereits erwähnt, weisen alle Prozesse im Namespace PIDs im übergeordneten Namespace auf, sodass reguläre Befehle zum Überwachen ihrer Aktivität verwendet werden können. Wir können auch versichern, dass ein verwaister Prozess im Namespace nicht aus den Prozessbaumverzweigungen unter der PID des Programms der obersten Ebene herausfällt, sodass er weiterhin leicht verfolgt werden kann.
Mit einem Mount-Namespace kombinieren
Was wir jedoch nicht tun können, ist, den Prozess in Bezug auf die PID zu überwachen, von der es denkt , dass sie die PID hat. Um dies zu tun und insbesondere den ps
Befehl im neuen Namespace verwenden zu können, müssen Sie ein separates procfs
Dateisystem für den Namespace bereitstellen. Dies führt wiederum zu einem anderen Problem, da der einzige Ort, ps
für den dies akzeptiert wird, procfs
ist /proc
. Eine Lösung wäre, ein chroot
Gefängnis zu errichten und das neue procfs
dort anzubringen . Dies ist jedoch ein umständlicher Ansatz, da wir mindestens alle Binärdateien, die wir verwenden möchten, zusammen mit den Bibliotheken, von denen sie abhängen, in das neue Stammverzeichnis kopieren (oder fest verknüpfen) müssen.
Die Lösung besteht darin, auch einen neuen Mount-Namespace zu verwenden . Darin können wir das Neue procfs
auf eine Weise einbinden, die das wahre Stammverzeichnis /proc
verwendet, im PID-Namespace verwendbar ist und nichts anderes beeinträchtigt. Um diesen Vorgang sehr einfach zu gestalten, unshare
gibt der Befehl die --mount-proc
Option:
sudo unshare -fp --mount-proc some_command
ps
Wenn Sie jetzt in den kombinierten Namespaces ausgeführt werden, werden nur die Prozesse mit dem PID-Namespace und der Prozess der obersten Ebene mit einer PID von angezeigt 1
.
Was ist nsenter
?
nsenter
Kann, wie der Name schon sagt, zur Eingabe eines Namensraums verwendet werden, mit dem bereits ein Namensraum erstellt wurde unshare
. Dies ist nützlich, wenn Informationen nur aus dem Namespace eines ansonsten nicht verwandten Skripts abgerufen werden sollen. Am einfachsten ist es, auf die PID eines Programms zuzugreifen, das im Namespace ausgeführt wird. Um klar zu sein, muss dies die PID des Zielprogramms innerhalb des Namespaces sein, von dem aus nsenter
es ausgeführt wird (da Namespaces verschachtelt sein können, kann es sein, dass ein einzelner Prozess viele PIDs hat). Gehen Sie wie folgt vor, um eine Shell im Ziel-PID / Mount-Namespace auszuführen:
sudo nsenter -t $PID -m -p
Wenn dieser Namespace wie oben eingerichtet ist, ps
werden nur Prozesse in diesem Namespace aufgelistet.