linux-kernel-advanced kernel namespaces isolation container docker advanced

Linux Namespaces: Process Isolation (Artikel 377)

Tiefgehende Analyse der Linux-Namespaces. Erfahren Sie alles über die Isolation von Dateisystemen, Netzwerken und Prozess-IDs als Grundlage für moderne Container-Technologien.

# Linux Namespaces: Die unsichtbaren Wände des Systems

TL;DR / Management Summary Während Cgroups (Artikel 374) die Ressourcen begrenzen, isolieren Namespaces die Sicht auf das System. Ein Prozess in einem Namespace glaubt, er sei allein auf dem Server: Er sieht nur seine eigenen Prozess-IDs (PID), seine eigenen Netzwerk-Interfaces und sein eigenes Root-Dateisystem. Namespaces sind das Fundament von Docker, Podman und LXC. Wer sie beherrscht, kann Prozesse so tief einsperren, dass sie den restlichen Host nicht einmal “sehen” können.


# 1. Einführung & Architektur

Die Trennung der Realitäten.

Ein Namespace ist eine Kernel-Abstraktion, die es erlaubt, globale Systemressourcen in logische Einheiten zu unterteilen.

# Die 7 Säulen der Isolation (Mermaid)

graph TD
    A[Linux Kernel] --> B[mnt: Mount Points]
    A --> C[pid: Process IDs]
    A --> D[net: Network Stack]
    A --> E[uts: Hostname / Domain]
    A --> F[ipc: Message Queues]
    A --> G[user: UID / GID Mapping]
    A --> H[cgroup: Hierarchy View]
    subgraph "Container Reality"
        B --- I[Isolated Instance]
        C --- I
        D --- I
    end

# 2. Die wichtigsten Namespaces im Detail

Wo wird isoliert?

# 1. Mount (mnt)

Isoliert die Liste der Mount-Punkte. Ein Prozess kann Dateien mounten/unmounten, ohne dass der Host es sieht. Basis für chroot.

# 2. Network (net)

Der Prozess bekommt eine eigene Loopback-Schnittstelle, eigene IPs und Routing-Tabellen.

# Erstellt einen neuen Netzwerk-Namespace
ip netns add test-ns

# 3. User (user)

Erlaubt es, dass ein Prozess im Container root (UID 0) ist, auf dem Host aber als normaler User (UID 1000) läuft. (Basis für Rootless-Container).


# 3. Manuelle Interaktion

In den Namespace eintauchen.

Nutzen Sie die Werkzeuge unshare (erstellt neuen Namespace) und nsenter (wechselt in bestehenden).

# Beispiel: Eine isolierte Shell starten

# Startet Bash mit eigenem Hostnamen und neuem Mount-Layout
sudo unshare --uts --mount /bin/bash
hostname my-sandbox

Ändern Sie den Hostnamen in dieser Shell – er wird sich auf dem Hauptsystem nicht ändern!

# In einen Docker-Container “einbrechen” (via Kernel)

Anstatt docker exec können Sie direkt via Namespace zugreifen:

# Finde die PID des Containers
PID=$(docker inspect -f '{{.State.Pid}}' web01)
# Betrete den Netzwerk-Namespace des Containers
sudo nsenter -t $PID -n ip addr

# 4. Day-2 Operations: Inspektion

Wer gehört zu wem?

# Namespaces auflisten

lsns
# Zeigt alle Namespaces im System und die zugehörigen PIDs.

Jede PID hat ihre Namespaces unter /proc/ verlinkt:

ls -l /proc/self/ns/

# 5. Troubleshooting & “War Stories”

Wenn die Isolation zum Gefängnis wird.

# Story 1: “Der unsichtbare Dienst”

Symptom: Ein Admin startet einen Datenbank-Server in einem Namespace. Der Dienst läuft (ps sieht ihn), aber er ist über das Netzwerk nicht erreichbar, obwohl die Firewall offen ist. Ursache: Der Dienst läuft in einem eigenen Network-Namespace und hat keine Verbindung (veth-pair) zum Hauptnetzwerk des Hosts. Lösung: Nutzen Sie ip link add veth0 type veth peer name veth1 und verschieben Sie ein Ende in den Namespace des Dienstes.

# Story 2: “Das hängende Mount-Device”

Symptom: Ein externes USB-Laufwerk lässt sich auf dem Host nicht unmounten (Device busy), obwohl kein Prozess darauf zugreift. Ursache: Ein Backup-Container wurde gestartet, während das Laufwerk gemountet war. Der Container hat den Mount-Namespace geerbt und hält das Device nun intern offen. Lösung: Finden Sie den Container mit lsns -t mnt und beenden Sie ihn, oder nutzen Sie umount -l (Lazy Unmount).


# 6. Fazit & Empfehlung

  • Sicherheit: Namespaces sind die wichtigste Härtungsebene für Multi-Tenant-Systeme.
  • Wahl: Nutzen Sie Rootless Podman, um die Vorteile von user-Namespaces voll auszuschöpfen.
  • Wartung: Nutzen Sie lsns, um verwaiste Namespaces von abgestürzten Applikationen zu finden.

# Anhang: Cheatsheet

Aufgabe Befehl
Alle Namespaces listen lsns
In PID-Namespace eintreten nsenter -t <pid> -p
Eigenen Namespace erstellen unshare -m -u -n -p -f --mount-proc
Net-Namespace erstellen ip netns add <name>
Befehl in Net-NS ip netns exec <name> <cmd>
Veth-Pair verschieben ip link set <veth> netns <pid>
Prozess Namespaces sehen ls -l /proc/<pid>/ns/
Paket suchen (Arch) sudo pacman -S util-linux
Paket suchen (Alpine) apk add util-linux