# namespaces

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-linux-namespaces-sin" inline-copy-host=""><div>**Linux Namespaces** sind ein fundamentales Feature des Linux-Kernels, das die Grundlage für moderne Container-Technologien (wie Docker, Podman oder Kubernetes) bildet.</div>  
<div>Einfach ausgedrückt: **Namespaces isolieren Systemressourcen für bestimmte Prozesse.**</div>  
<div>Ein Prozess (oder eine Gruppe von Prozessen), der sich in einem eigenen Namespace befindet, sieht nur die Ressourcen, die diesem Namespace zugewiesen sind. Aus der Perspektive des Prozesses sieht es so aus, als hätte er ein eigenes, völlig isoliertes Linux-System für sich allein.</div>  
</div>### 1. Die Analogie: Das Bürogebäude

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-stell-dir-das-linux-" inline-copy-host=""><div>Stell dir das Linux-Betriebssystem wie ein großes Bürogebäude vor:</div>  
- <div>**Ohne Namespaces (Klassisches Linux):** Alle Mitarbeiter (Prozesse) arbeiten im selben Open-Space-Büro. Jeder sieht jeden, nutzt dieselbe Kaffeemaschine (Dateisystem), dieselbe Telefonanlage (Netzwerk) und sieht die gleichen Namensschilder (PIDs).</div>
- <div>**Mit Namespaces (Container-Prinzip):** Das Bürogebäude wird in Einzelbüros mit Milchglas und eigenen Telefonanlagen unterteilt. Mitarbeiter in *Büro A* wissen nicht einmal, dass Mitarbeiter in *Büro B* existieren. Sie haben ihre eigene Kaffeemaschine und eigene Durchwahlnummern – obwohl sie sich alle im selben Gebäude befinden und das gleiche Fundament (den Kernel) teilen.</div>

</div>### 2. Die 8 Typen von Linux Namespaces

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-linux-stellt-verschi" inline-copy-host=""><div>Linux stellt verschiedene Arten von Namespaces zur Verfügung. Jeder Typ isoliert eine ganz bestimmte Systemressource:</div>  
<table data-path-to-node="10"><thead><tr><td>**Namespace-Typ**</td><td>**Isolierte Ressource**</td><td>**Was der Prozess sieht**</td></tr></thead><tbody><tr><td><span data-path-to-node="10,1,0,0">**PID** (Process ID)</span></td><td><span data-path-to-node="10,1,1,0">Prozess-IDs</span></td><td><span data-path-to-node="10,1,2,0">Einen eigenen Prozess-Baum. Prozess `#1` im Namespace ist die "Initiator-PID", obwohl er auf dem Host eine ganz andere PID hat.</span></td></tr><tr><td><span data-path-to-node="10,2,0,0">**NET** (Network)</span></td><td><span data-path-to-node="10,2,1,0">Netzwerk-Stack</span></td><td><span data-path-to-node="10,2,2,0">Eigene Netzwerk-Interfaces (`eth0`, `lo`), eigene Routing-Tabellen, Firewall-Regeln (iptables) und Port-Belegungen.</span></td></tr><tr><td><span data-path-to-node="10,3,0,0">**MNT** (Mount)</span></td><td><span data-path-to-node="10,3,1,0">Dateisystem-Mountpoints</span></td><td><span data-path-to-node="10,3,2,0">Einen eigenen Mount-Baum. Änderungen an Dateisystem-Mounts betreffen nur diesen Namespace.</span></td></tr><tr><td><span data-path-to-node="10,4,0,0">**UTS** (UNIX Timesharing)</span></td><td><span data-path-to-node="10,4,1,0">Hostname &amp; Domain</span></td><td><span data-path-to-node="10,4,2,0">Einen eigenen Hostnamen (z. B. `my-container`) unabhängig vom tatsächlichen Host-Namen.</span></td></tr><tr><td><span data-path-to-node="10,5,0,0">**IPC** (Inter-Process Comm.)</span></td><td><span data-path-to-node="10,5,1,0">Shared Memory &amp; Queues</span></td><td><span data-path-to-node="10,5,2,0">Eigene System V IPC-Objekte und POSIX Message Queues (Prozesse aus verschiedenen IPC-Namespaces können nicht direkt über Shared Memory kommunizieren).</span></td></tr><tr><td><span data-path-to-node="10,6,0,0">**USER** (User IDs)</span></td><td><span data-path-to-node="10,6,1,0">Benutzer &amp; Gruppen (UID/GID)</span></td><td><span data-path-to-node="10,6,2,0">Ein normaler Benutzer auf dem Hostsystem kann **Root (UID 0)** innerhalb seines User-Namespaces sein (wichtig für die Sicherheit!).</span></td></tr><tr><td><span data-path-to-node="10,7,0,0">**CGROUP**</span></td><td><span data-path-to-node="10,7,1,0">Control Groups</span></td><td><span data-path-to-node="10,7,2,0">Sichtbarkeit der eigenen Cgroup-Hierarchie (Ressourcen-Limits wie CPU/RAM).</span></td></tr><tr><td><span data-path-to-node="10,8,0,0">**TIME**</span></td><td><span data-path-to-node="10,8,1,0">Systemzeit</span></td><td><span data-path-to-node="10,8,2,0">Abweichende Systemzeiten/Uhrzeiten (z. B. für Testumgebungen mit simulierten Datumswerten).</span></td></tr></tbody></table>

</div>### 3. Wie Namespaces technisch funktionieren

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-im-kernel-ist-jeder-" inline-copy-host=""><div>Im Kernel ist jeder Prozess durch eine Struktur namens `task_struct` repräsentiert. Diese Struktur enthält Zeiger auf die jeweiligen Namespaces, zu denen der Prozess gehört.</div>  
</div>#### System Calls zur Steuerung:

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-es-gibt-drei-prim%C3%A4re" inline-copy-host=""><div>Es gibt drei primäre Systemaufrufe (System Calls) in C, um mit Namespaces zu interagieren:</div>  
1. <div>**`clone()`**: Erstellt einen neuen Kind-Prozess (ähnlich wie `fork()`), kann aber über Flags (z. B. `CLONE_NEWNET`, `CLONE_NEWPID`) direkt neue Namespaces für das Kind anlegen.</div>
2. <div>**`unshare()`**: Erlaubt einem bereits laufenden Prozess, sich von seinen bisherigen Namespaces zu lösen und neue zu erstellen.</div>
3. <div>**`setns()`**: Klinkt einen Prozess in einen bereits existierenden Namespace ein (das nutzt z. B. `docker exec`, um sich in den Namespace eines laufenden Containers einzuklinken).</div>

</div>### 4. Praxistest: Namespaces auf der Kommandozeile ausprobieren

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-du-kannst-namespaces" inline-copy-host=""><div>Du kannst Namespaces direkt mit dem Utility-Befehl `unshare` in deiner Linux-Shell testen.</div>  
</div>#### Beispiel 1: Einen eigenen Hostnamen-Namespace (UTS) erstellen

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-" inline-copy-host=""></div><div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-56 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQjwI" decode-data-ved="1" id="bkmrk-bash" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl84MjY0NjE3ZGFhNWY2YWU3IiwiY19jZTRlOGI1ZmE4NTMzNzA4IixudWxsLCJyY19iMThkMTljYjEyMDI1Mjg4IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-56"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-56"><div _ngcontent-ng-c25623069="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-56 ng-star-inserted"><span class="ng-tns-c25623069-56">Bash</span><div _ngcontent-ng-c25623069="" class="buttons ng-tns-c25623069-56 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
# Erstelle ein neues UTS-Namespace und starte darin eine Bash
sudo unshare --uts bash

# Ändere den Hostnamen innerhalb des Namespaces
hostname isolierter-host

# Überprüfe den Namen:
hostname
# Output: isolierter-host

```

<div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-56 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQjwI" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl84MjY0NjE3ZGFhNWY2YWU3IiwiY19jZTRlOGI1ZmE4NTMzNzA4IixudWxsLCJyY19iMThkMTljYjEyMDI1Mjg4IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-56"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-56"></div></div></div><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-wenn-du-nun-ein-zwei" inline-copy-host=""><div>*Wenn du nun ein zweites Terminal auf deinem Rechner öffnest und `hostname` eingibst, siehst du weiterhin deinen ursprünglichen Hostnamen.*</div>  
</div>#### Beispiel 2: Einen eigenen Prozess-Namespace (PID) erstellen

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host=""></div><div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-57 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQkAI" decode-data-ved="1" id="bkmrk-bash-1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl84MjY0NjE3ZGFhNWY2YWU3IiwiY19jZTRlOGI1ZmE4NTMzNzA4IixudWxsLCJyY19iMThkMTljYjEyMDI1Mjg4IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-57"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-57"><div _ngcontent-ng-c25623069="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-57 ng-star-inserted"><span class="ng-tns-c25623069-57">Bash</span><div _ngcontent-ng-c25623069="" class="buttons ng-tns-c25623069-57 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
# Erstelle einen neuen PID- und Mount-Namespace
sudo unshare --pid --mount-proc --fork bash

# Welches ist die PID dieses Prozesses im Namespace?
ps aux

```

<div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-57 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQkAI" decode-data-ved="1" id="bkmrk--3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl84MjY0NjE3ZGFhNWY2YWU3IiwiY19jZTRlOGI1ZmE4NTMzNzA4IixudWxsLCJyY19iMThkMTljYjEyMDI1Mjg4IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-57"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-57"></div></div></div><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-du-wirst-sehen%2C-dass" inline-copy-host=""><div>*Du wirst sehen, dass deine `bash` plötzlich die **PID 1** hat und du keine anderen Prozesse deines echten Rechners mehr sehen kannst.*</div>  
</div>### 5. Namespaces vs. Cgroups vs. Chroot: Wo liegt der Unterschied?

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-oft-werden-diese-beg" inline-copy-host=""><div>Oft werden diese Begriffe im Zusammenhang mit Containern zusammengeworfen. Sie erfüllen jedoch unterschiedliche Aufgaben:</div>  
- <div>**Namespaces = Isolierung *(Was kann ich sehen?)*:** Sie bestimmen, welche Ressourcen (Netzwerke, Prozesse, Dateien) ein Prozess überhaupt wahrnehmen kann.</div>
- <div>**Cgroups (Control Groups) = Limitierung *(Was darf ich nutzen?)*:** Sie begrenzen, wie viel CPU, Arbeitsspeicher, I/O-Bandbreite oder Disk-Performance ein Prozess nutzen darf.</div>
- <div>**Chroot = Pfad-Sperre *(Wo darf ich hin?)*:** Ein älterer Mechanismus, der lediglich das Root-Verzeichnis (`/`) für einen Prozess ändert. (Mount-Namespaces sind die moderne, viel sicherere Weiterentwicklung davon).</div>

</div>> <div>**Ein Docker-Container ist im Grunde nichts anderes als ein ganz normaler Linux-Prozess, für den der Kernel mehrere Namespaces und Cgroups kombiniert hat.**</div>

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-linux-namespaces-sin-1" inline-copy-host=""><div>Linux Namespaces sind die Zauberei hinter der Container-Revolution. Sie sorgen dafür, dass Prozesse gegeneinander abgeschottet werden, ohne dass dafür ein schwerfälliger Hypervisor oder ein zweites Betriebssystem (wie bei einer virtuellen Maschine) geladen werden muss. Das macht Container extrem leichtgewichtig und schnell.</div></div><div id="bkmrk--4"></div><div id="bkmrk-user-namespaces-geh%C3%B6"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>**User Namespaces** gehören zu den mächtigsten Sicherheitsfeatures des Linux-Kernels. Sie ermöglichen die Trennung und Zuordnung (Mapping) von Benutzer- und Gruppen-IDs (UIDs/GIDs) zwischen dem Host-System und dem isolierten Namespace.</div>  
<div>Kurz gesagt: **Ein Prozess kann innerhalb seines User Namespaces volle Root-Rechte (UID 0) besitzen, ist aber auf dem eigentlichen Host-System ein völlig gewöhnlicher, privilegienloser Benutzer (z. B. UID 1000).**</div>  
</div></div>### 1. Das Kernprinzip: UID/GID Mapping

<div id="bkmrk-das-herzst%C3%BCck-der-us"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Das Herzstück der User Namespaces ist das sogenannte **UID Mapping**. Der Linux-Kernel übersetzt dabei die Benutzer-IDs dynamisch an den Grenzen des Namespaces.</div>  
<div>Ein vereinfachtes Mapping-Schema sieht so aus:</div>  
</div></div><div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-65 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQsQI" decode-data-ved="1" id="bkmrk-plaintext" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9mOTEwZjkyMGYwNzEzN2UxIiwiY19jZTRlOGI1ZmE4NTMzNzA4IixudWxsLCJyY18xMjk2YzRiYjg5MTIzNDIwIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-65"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-65"><div _ngcontent-ng-c25623069="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-65 ng-star-inserted"><span class="ng-tns-c25623069-65">Plaintext</span><div _ngcontent-ng-c25623069="" class="buttons ng-tns-c25623069-65 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
[ Innerhalb des User Namespaces ]    --->    [ Auf dem Host-System ]
  UID 0   (Root im Container)       --->      UID 1000  (Dein normaler User)
  UID 1   (Sub-User 1)              --->      UID 100001
  UID 2   (Sub-User 2)              --->      UID 100002

```

<div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-65 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQsQI" decode-data-ved="1" id="bkmrk--5" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9mOTEwZjkyMGYwNzEzN2UxIiwiY19jZTRlOGI1ZmE4NTMzNzA4IixudWxsLCJyY18xMjk2YzRiYjg5MTIzNDIwIixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-65"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-65"></div></div></div><div id="bkmrk-wenn-ein-prozess-im-"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Wenn ein Prozess im Container versucht, eine Datei zu erstellen, sieht das für den Prozess im Container so aus, als gehöre sie `root` (UID 0). Schaust du dir dieselbe Datei jedoch vom Host-System aus an, gehört sie in Wahrheit dem Benutzer `1000`.</div>  
</div></div>#### Wo wird das konfiguriert?

<div id="bkmrk-der-kernel-verwaltet"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Der Kernel verwaltet dieses Mapping über zwei Dateien im `/proc`-Dateisystem des jeweiligen Prozesses:</div>  
- <div>`/proc/<PID>/uid_map`</div>
- <div>`/proc/<PID>/gid_map`</div>

<div>Dort ist nach folgendem Muster hinterlegt, wie die UIDs übersetzt werden:</div><div>`ID-inside-NS   ID-outside-NS   Length`</div>  
<div>Beispiel: `0 100000 65536` bedeutet:</div>  
- <div>UID `0` im Namespace entspricht UID `100000` auf dem Host.</div>
- <div>Es werden insgesamt `65536` fortlaufende UIDs gemappt (also von UID 0–65535 im Container auf UID 100000–165535 auf dem Host).</div>

</div></div>### 2. Warum das herkömmliche Docker ein Sicherheitsrisiko war

<div id="bkmrk-in-der-klassischen-d"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>In der klassischen Docker-Architektur läuft der Docker-Daemon (`dockerd`) als echter **Root-User auf dem Host-System**.</div>  
<div>Wenn du einen Standard-Container startest, ist der Prozess im Container standardmäßig ebenfalls als Root (UID 0) unterwegs – und zwar **ohne** User-Namespace-Mapping:</div>  
- <div>**Container Root (UID 0) == Host Root (UID 0)**</div>

</div></div>#### Das Gefahrenszenario (Container Escape):

<div id="bkmrk-gelingt-es-einem-ang"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Gelingt es einem Angreifer durch eine Sicherheitslücke im Anwendungscode oder im Kernel, aus dem Container auszubrechen (ein sogenannter *Container Escape*), landet er direkt auf dem Host-System. Da seine UID auf dem Host ebenfalls `0` ist, hat er sofort die **vollständige Kontrolle über den gesamten Server**.</div>  
</div></div>### 3. Wie Rootless Docker mit User Namespaces maximale Sicherheit schafft

<div id="bkmrk-bei-rootless-docker-"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Bei **Rootless Docker** (sowie nativ bei Podman) läuft schon der Docker-Daemon selbst als unprivilegierter Benutzer (z. B. UID 1000) auf dem Host. Wenn nun ein Container gestartet wird, kommt zwingend ein neuer **User Namespace** zum Einsatz.</div>  
<div>Das bietet drei entscheidende Sicherheitsvorteile:</div>  
</div></div>#### A. Keine Host-Root-Rechte bei einem Container-Escape

<div id="bkmrk-bricht-ein-angreifer"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Bricht ein Angreifer aus einem Rootless-Container aus, sieht der Host-Kernel seine Aktionen nicht als `root`, sondern als gewöhnlicher Benutzer (z. B. UID 1000 oder UID 100000). Der Angreifer kann:</div>  
- <div>Keine Systemdateien wie `/etc/shadow` lesen oder verändern.</div>
- <div>Keine neuen Kernel-Module laden.</div>
- <div>Keine Festplatten neu partitionieren oder das System herunterfahren.</div>
- <div>Keine Prozesse anderer Host-Benutzer manipulieren.</div>

</div></div>#### B. Unprivilegierte Erstellung von Namespaces

<div id="bkmrk-normalerweise-erford"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Normalerweise erfordert das Erstellen von Netzwerk- oder Mount-Namespaces Root-Rechte. **User Namespaces sind die einzige Ausnahme:** Ein normaler Benutzer darf ein neues User Namespace erstellen und erlangt *innerhalb* dieses Namespaces die Rechte (Capabilities) zum Erstellen aller anderen Namespace-Typen (NET, MNT, PID etc.).</div>  
<div>Dadurch können normale Benutzer vollwertige Container starten, **ohne dass dafür jemals ein Root-Prozess beteiligt sein muss**.</div>  
</div></div>#### C. Schutz vor Privilege Escalation über Suid-Binaries oder Sockets

<div id="bkmrk-sollte-im-container-"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Sollte im Container eine SUID-Datei (wie `passwd` oder `sudo`) missbraucht werden, um im Container Root-Rechte zu erlangen, bleibt dieser Rechtegewinn strikt auf die Grenzen des User Namespaces beschränkt.</div>  
</div></div>### 4. Einschränkungen von User Namespaces &amp; Rootless Docker

<div id="bkmrk-obwohl-user-namespac"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" inline-copy-host=""><div>Obwohl User Namespaces die Sicherheit drastisch erhöhen, bringen sie bauartbedingte Einschränkungen mit sich:</div>  
1. <div>**Privilegierte Ports (&lt; 1024):** Ein Rootless-Container kann auf dem Host standardmäßig keine Ports unterhalb von 1024 (z. B. Port 80 oder 443) direkt anbinden, da dies auf dem Host weiterhin dem echten Root vorbehalten ist (lässt sich via Kernel-Parameter `net.ipv4.ip_unprivileged_port_start` anpassen).</div>
2. <div>**Dateirechte auf Mounts:** Wenn Host-Verzeichnisse in den Container gemountet werden (*Bind Mounts*), muss das UID-Mapping berücksichtigt werden. Dateien, die auf dem Host dem normalen User gehören, werden im Container eventuell als fremde UID angezeigt, wenn das Mapping nicht exakt passt.</div>
3. <div>**Cgroup v2 erforderlich:** Für eine vollständige Ressourcenbegrenzung (CPU, RAM) in Rootless-Umgebungen wird zwingend ein modernes Linux-System mit **Cgroup v2** vorausgesetzt.</div>

</div></div><div id="bkmrk-user-namespaces-entk"><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-user-namespaces-entk-1" inline-copy-host=""><div>User Namespaces entkoppeln die Macht der Root-Rechte innerhalb einer isolierten Umgebung von den tatsächlichen Rechten auf dem zugrundeliegenden Betriebssystem. Sie verwandeln das Konzept von Docker vom *"Alles-oder-Nichts-Prinzip"* (Root-Daemon) hin zu einem echten **Least-Privilege-Modell**.</div><div class="attachment-container unknown"></div></div></div>