kernel: Namespaces unterstützen

15

Ich frage mich, was genau die Funktion "Namespaces-Unterstützung" im Linux-Kernel bedeutet. Ich verwende Kernel 3.11.1 (der aktuell neueste stabile Kernel).

Wenn ich mich entscheide, es zu deaktivieren, merke ich dann eine Änderung an meinem System?

Und falls jemand beschließt, Namespaces zu verwenden, reicht es dann, nur NAMESPACES=Yim Kernel zu kompilieren , oder benötigt er auch Userspace-Tools?

Martin Vegter
quelle
5
Namespaces werden hier ziemlich gut erklärt: lwn.net/Articles/531114 (keine Antwort, da ich Ihre Fragen nicht wirklich beantworte - ich weise Sie auf einen Stapel Text)
derobert

Antworten:

21

Kurz gesagt, Namespaces bieten die Möglichkeit, ein virtuelles Linux-System in einem größeren Linux-System zu erstellen. Dies unterscheidet sich von der Ausführung einer virtuellen Maschine, die als nicht privilegierter Prozess ausgeführt wird: Die virtuelle Maschine wird als einzelner Prozess auf dem Host angezeigt, wohingegen Prozesse, die in einem Namespace ausgeführt werden, weiterhin auf dem Hostsystem ausgeführt werden.

Ein virtuelles System, das in einem größeren System ausgeführt wird, wird als Container bezeichnet . Die Idee eines Containers ist, dass Prozesse, die im Container ausgeführt werden, glauben, dass sie die einzigen Prozesse im System sind. Insbesondere hat der Root-Benutzer innerhalb des Containers keine Root-Rechte außerhalb des Containers (beachten Sie, dass dies nur in ausreichend aktuellen Versionen des Kernels zutrifft).

Namespaces virtualisieren jeweils ein Feature. Einige Beispiele für Typen von Namespaces sind:

  • User Namespaces - Hiermit können sich Prozesse so verhalten, als würden sie als unterschiedliche Benutzer innerhalb und außerhalb des Namespaces ausgeführt. Insbesondere haben Prozesse, die als UID 0 im Namespace ausgeführt werden, Superuser-Berechtigungen nur in Bezug auf Prozesse, die im selben Namespace ausgeführt werden.
    Seit Linux-Kernel 3.8 können nichtprivilegierte Benutzer Benutzernamensräume erstellen. Auf diese Weise kann ein normaler Benutzer Funktionen nutzen, die für Root reserviert sind (z. B. das Ändern von Routingtabellen oder das Festlegen von Funktionen).
  • PID-Namespaces - Prozesse in einem PID-Namespace können keine Prozesse außerhalb dieses Namespaces beenden oder verfolgen.
  • Namespaces mounten - Dies ermöglicht es Prozessen, eine eigene Ansicht des Dateisystems zu haben. Diese Ansicht kann eine Teilansicht sein, in der einige Teile des Dateisystems ausgeblendet und Teile neu zusammengestellt werden können, sodass Verzeichnisbäume an verschiedenen Stellen angezeigt werden. Mount-Namespaces verallgemeinern die traditionelle Unix-Feature- Chroot , mit der Prozesse auf einen bestimmten Unterbaum beschränkt werden können.
  • Netzwerk-Namespaces - ermöglichen die Trennung von Netzwerkressourcen (Netzwerkgeräten) und verbessern so die Isolierung von Prozessen.

Namespaces verlassen sich auf den Kernel, um die Isolierung zwischen Namespaces zu gewährleisten. Es ist ziemlich kompliziert, dies zu korrigieren, so dass immer noch Sicherheitslücken herumliegen können. Das Risiko von Sicherheitslücken ist der Hauptgrund dafür, dass die Funktion nicht aktiviert wird. Ein weiterer Grund, dies nicht zu aktivieren, ist, wenn Sie einen kleinen Kernel für ein eingebettetes Gerät erstellen. In einem Allzweck-Kernel, den Sie auf einem typischen Server oder einer typischen Arbeitsstation installieren möchten, sollten Namespaces wie bei allen anderen ausgereiften Kernel-Funktionen aktiviert sein.

Es gibt noch wenige Anwendungen, die Namespaces verwenden. Hier sind ein paar:

Weitere Informationen finden Sie in der LWN-Artikelserie von Michael Kerrisk .

Gilles 'SO - hör auf böse zu sein'
quelle
6

Der Linux-Kernel-Namespace ist ein Konzept, mit dem eine Gruppe von Prozessen in Bezug auf den Zugriff auf eine Systemressource von anderen isoliert werden kann. Beispielsweise können zwei verschiedene PID-Namespaces Prozesse mit identischen PIDs, aber völlig unterschiedlichem Prozessabbild enthalten. Sie werden häufig bei der Virtualisierung auf Betriebssystemebene verwendet, bei der ein einzelner Kernel gleichzeitig verschiedene Betriebssysteme ausführt. Alle müssen Linux-basiert sein (da sie offensichtlich den Kernel gemeinsam nutzen), können jedoch unterschiedliche Distributionen und Versionen aufweisen. Siehe zum Beispiel LXC .

Möglicherweise bemerken Sie das Deaktivieren beispielsweise auf systemd-basierten Systemen, da systemd Namespaces für seine Containerfunktion verwenden kann . Daher hängt vieles davon ab, welche Distribution Sie verwenden und was Sie mit dem System vorhaben.

Wie bei fast jedem Kernel-Feature benötigen Sie auf jeden Fall eine Art User-Space-Programm - auch wenn Sie über spezielle Dateien mit dem Kernel gesprochen haben (ich bin mir nicht sicher, ob Sie das können), ist es in der Regel viel besser, sich auf spezielle Tools zu verlassen, da diese bieten vor freundliche API.

peterph
quelle
1

Ein Beispiel für die Verwendung von Namespaces in SELinux-fähigen Systemen (MLS oder Strict). Der Namespace wird normalerweise verwendet, um einzelne Verzeichnisse /tmpund / oder /homeVerzeichnisse für jeden Benutzer zu erstellen . Diese Verzeichnisse sind nur sichtbar für: den Benutzer, Benutzer mit derselben Bezeichnung, den Kernel und Benutzer mit privilegiertem Zugriff. Das /tmpVerzeichnis mit dem Namespace ed wird von SELinux-MLS so gekennzeichnet, dass es mit dem SELinux-MLS-Label des Benutzers übereinstimmt. In diesem Szenario ist das /tmpvom Benutzer angezeigte Verzeichnis möglicherweise an einer anderen Stelle als /tmp( /var/user-tmp) angehängt . Der Benutzer sieht jedoch nur /tmpmit den Dateien, die aufgrund der Aktivität des Benutzers erstellt werden. Der Benutzer sieht niemals Dateien /tmp, die das Produkt anderer Benutzer sind.

guestUserX
quelle