Zum Inhalt springen

Docker/Userns-remap: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
 
(30 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''{{BASEPAGENAME}}''' - Beschreibung
'''{{BASEPAGENAME}}'''


== Beschreibung ==
== Beschreibung ==
; [[Linux-Namespaces]]
Isolation laufender Prozesse
* Systemressourcen beschränken
* ohne dass Prozesse die wahrnehmen


; Rechteausweitung verhindern
Anwendungen von Containern mit nicht privilegierten Benutzern ausführen


Linux-Namespaces bieten Isolation für laufende Prozesse und beschränken deren Zugriff auf Systemressourcen, ohne dass der laufende Prozess diese Beschränkungen wahrnimmt. Weitere Informationen zu Linux-Namespaces finden Sie unter Linux-Namespaces.
; Root-Benutzer innerhalb des Containers
Können einem Benutzer mit weniger Privilegien auf dem Docker-Host zugeordnet werden


Der beste Weg, um Angriffe zur Rechteausweitung aus einem Container heraus zu verhindern, besteht darin, die Anwendungen Ihres Containers so zu konfigurieren, dass sie als nicht privilegierte Benutzer ausgeführt werden. Bei Containern, deren Prozesse als Root-Benutzer innerhalb des Containers ausgeführt werden müssen, können Sie diesen Benutzer einem Benutzer mit weniger Privilegien auf dem Docker-Host zuordnen. Dem zugeordneten Benutzer wird ein Bereich von UIDs zugewiesen, die innerhalb des Namespace wie normale UIDs von 0 bis 65536 funktionieren, aber keine Privilegien auf dem Host-Rechner selbst haben.
; Bereich von UIDs
Dem Benutzer wird ein Bereich von UIDs zugewiesen
* Docker verwendet Sub-UID/GID-Bereiche aus ''/etc/subuid'' und ''/etc/subgid'' (default ''dockremap'')


== Vorbereitung ==
Nach dem Aktivieren von userns-remap verwendet Docker einen separaten Datenpfad:
<syntaxhighlight lang="bash" highlight="">
/var/lib/docker/<uid>.<gid>/
</syntaxhighlight>


== Vorbereitung ==
* Neue Entitäten (Images, Container, Volumes, Overlay-Ebenen) werden dort gespeichert
* Kataloge mit bisherigen Entitäten werden in diesem Modus nicht verwendet (wirken ausgeblendet)
* docker ps, docker images, docker volume ls zeigen nur Entitäten aus dem aktuell verwendeten Docker-Datenpfad
* Der Eigentümer der Dateien in overlay2 und volumes ist nun nicht mehr root, sondern der remapped-Benutzer


=== Für neue Installationen ===
=== Neuinstallationen ===
Images und Container lassen sich einfacher und schneller neu laden als migrieren


* Images und Container lassen sich einfacher und schneller neu laden als migrieren.
; Bei aktiviertem userns-remap


; Bei aktiviertem userns-remap:
:* ''--pid=host'' und ''--network=host'' können nicht verwendet werden
:* ''--pid=host'' und ''--network=host'' können nicht verwendet werden.
:* Einige externe Volume-/Speichertreiber verstehen möglicherweise remap nicht und funktionieren nicht mehr
:* Einige externe Volume-/Speichertreiber verstehen möglicherweise remap nicht und funktionieren nicht mehr.
:* ''--privileged'' ohne ''--userns=host'' funktioniert nicht mehr wie zuvor, einige Funktionen sind eingeschränkt
:* ''--privileged'' ohne ''--userns=host'' funktioniert nicht mehr wie zuvor, einige Funktionen sind eingeschränkt.
:* Es ist besser, ''userns-remap'' bei einer sauberen Docker-Installation zu aktivieren: Alte Image-Layer und Container werden ausgeblendet, da Docker einen separaten Ordner für den neuen Namespace in ''/var/lib/docker/'' erstellt
:* Es ist besser, ''userns-remap'' bei einer sauberen Docker-Installation zu aktivieren: Alte Image-Layer und Container werden ausgeblendet, da Docker einen separaten Ordner für den neuen Namespace in ''/var/lib/docker/'' erstellt.


=== Migration ===
; Migration zu neuen Namespaces
Bei bestehender Installation werden vorhandene Objekte nicht automatisch umgeschrieben
* Praktisch erfolgt ein Neuaufbau: Images neu laden, Container neu erstellen
* Persistente Daten (Bind-Mounts/Volumes) erfordern passende Ownership für den remapped UID/GID-Bereich


=== Migration zu neuen Namespaces ===
== Installation ==


=== Bereinigung ===
=== Standardbereich vorab festlegen ===
Da alle erforderlichen Daten in den Ordner /var/lib/docker/<uid.guid> verschoben werden, müssen nach der Migration alle nicht mehr benötigten Dateien gelöscht werden.
Für konsistente Ownership bei Bind-Mounts empfiehlt sich ein fester Startbereich ab 200000.
* Bereiche dürfen sich nicht überschneiden
* Startbereich nach produktiver Nutzung zu ändern führt typischerweise zu inkonsistenter Ownership. Neuaufbau und Anpassung persistenter Daten erforderlich


<syntaxhighlight lang="bash" highlight="" copy line>
; /etc/subuid
systemctl stop docker
<syntaxhighlight lang="ini" highlight="" copy line>
cd /var/lib/docker
dockremap:200000:65536
rm -rf containers image network plugins swarm tmp trust volumes
</syntaxhighlight>
</syntaxhighlight>


== Installation ==
; /etc/subgid
<syntaxhighlight lang="ini" highlight="" copy line>
dockremap:200000:65536
</syntaxhighlight>


; Ergebnis
* Prozess läuft als ''root'' (UID 0) im Container -> Host-UID 200000
* Prozess läuft als UID 1000 im Container -> Host-UID 201000
* MySQL nutzt häufig UID 999 -> Host-UID 200999
* Verwendete UIDs/GIDs sind image-spezifisch


 
=== userns-remap aktivieren ===
 
; /etc/docker/daemon.json
1.&nbsp;Um den Modus ''userns-remap'' zu aktivieren, müssen Sie die Datei '''''/etc/docker/daemon.js''''' mit folgendem Inhalt erstellen:
<syntaxhighlight lang="json" highlight="" line copy>
<syntaxhighlight lang="json" highlight="" line copy>
{
{
Zeile 45: Zeile 75:
</syntaxhighlight>
</syntaxhighlight>


* Oder Sie können den Benutzer manuell eingeben:
Oder Sie können den Benutzer manuell eingeben:
 
<syntaxhighlight lang="json" highlight="" line copy>
<syntaxhighlight lang="json" highlight="" line copy>
{
{
Zeile 52: Zeile 81:
}
}
</syntaxhighlight>
</syntaxhighlight>
Sie können den Namen, die UID oder user:group angeben


* Sie können den Namen, die UID oder user:group angeben
=== Dienst neu starten ===
 
Nach dem Speichern der Datei den Dienst neu starten:
 
<syntaxhighlight lang="bash" highlight="1" copy>
2.&nbsp;Nach dem Speichern der Datei den Dienst neu starten:
 
<syntaxhighlight lang="bash" highlight="1" line copy>
sudo systemctl restart docker
sudo systemctl restart docker
</syntaxhighlight>
</syntaxhighlight>


3.&nbsp;Überprüfung
=== Überprüfung ===
<syntaxhighlight lang="bash" highlight="1" line copy>
<syntaxhighlight lang="bash" highlight="1" copy>
docker info | grep -i userns
docker info | grep -i userns
</syntaxhighlight>
</syntaxhighlight>
: Ausgabe:
<syntaxhighlight lang="console" highlight="">
<syntaxhighlight lang="console" highlight="">
Userns mode: private
Userns mode: private
</syntaxhighlight>
</syntaxhighlight>


== Bind-Mounts ==
* Bei Bind-Mounts muss der Host-Dateibesitzer zur remapped UID/GID passen, sonst können Dienste nicht starten (z.B. fehlende Schreibrechte)


; Ziel-UID berechnen
<syntaxhighlight lang="bash" highlight="1" line>
grep dockremap /etc/subuid /etc/subgid
</syntaxhighlight>


Ausgabe:
<syntaxhighlight lang="bash" highlight="" line>
dockremap:200000:65536
</syntaxhighlight>


Bespiel: Anwendung läuft im Container als UID/GID 1000.
* ''HOST_UID = 200000 + 1000 = 201000''


<syntaxhighlight lang="bash" highlight="1" copy line>
sudo chown -R 201000:201000 /path/to/bind-mount
</syntaxhighlight>


 
* Die Rechte sind nun korrekt festgelegt.
 
 
 
 
 
 
 
<syntaxhighlight lang="bash" highlight="1" line copy>
 
< /syntaxhighlight>




Zeile 117: Zeile 147:
-->
-->


[[Kategorie:new]]
[[Kategorie:Docker/Sicherheit]]


</noinclude>
</noinclude>

Aktuelle Version vom 15. Januar 2026, 12:28 Uhr

Docker/Userns-remap

Beschreibung

Linux-Namespaces

Isolation laufender Prozesse

  • Systemressourcen beschränken
  • ohne dass Prozesse die wahrnehmen
Rechteausweitung verhindern

Anwendungen von Containern mit nicht privilegierten Benutzern ausführen

Root-Benutzer innerhalb des Containers

Können einem Benutzer mit weniger Privilegien auf dem Docker-Host zugeordnet werden

Bereich von UIDs

Dem Benutzer wird ein Bereich von UIDs zugewiesen

  • Docker verwendet Sub-UID/GID-Bereiche aus /etc/subuid und /etc/subgid (default dockremap)

Vorbereitung

Nach dem Aktivieren von userns-remap verwendet Docker einen separaten Datenpfad:

/var/lib/docker/<uid>.<gid>/
  • Neue Entitäten (Images, Container, Volumes, Overlay-Ebenen) werden dort gespeichert
  • Kataloge mit bisherigen Entitäten werden in diesem Modus nicht verwendet (wirken ausgeblendet)
  • docker ps, docker images, docker volume ls zeigen nur Entitäten aus dem aktuell verwendeten Docker-Datenpfad
  • Der Eigentümer der Dateien in overlay2 und volumes ist nun nicht mehr root, sondern der remapped-Benutzer

Neuinstallationen

Images und Container lassen sich einfacher und schneller neu laden als migrieren

Bei aktiviertem userns-remap
  • --pid=host und --network=host können nicht verwendet werden
  • Einige externe Volume-/Speichertreiber verstehen möglicherweise remap nicht und funktionieren nicht mehr
  • --privileged ohne --userns=host funktioniert nicht mehr wie zuvor, einige Funktionen sind eingeschränkt
  • Es ist besser, userns-remap bei einer sauberen Docker-Installation zu aktivieren: Alte Image-Layer und Container werden ausgeblendet, da Docker einen separaten Ordner für den neuen Namespace in /var/lib/docker/ erstellt

Migration

Migration zu neuen Namespaces

Bei bestehender Installation werden vorhandene Objekte nicht automatisch umgeschrieben

  • Praktisch erfolgt ein Neuaufbau: Images neu laden, Container neu erstellen
  • Persistente Daten (Bind-Mounts/Volumes) erfordern passende Ownership für den remapped UID/GID-Bereich

Installation

Standardbereich vorab festlegen

Für konsistente Ownership bei Bind-Mounts empfiehlt sich ein fester Startbereich ab 200000.

  • Bereiche dürfen sich nicht überschneiden
  • Startbereich nach produktiver Nutzung zu ändern führt typischerweise zu inkonsistenter Ownership. Neuaufbau und Anpassung persistenter Daten erforderlich
/etc/subuid
dockremap:200000:65536
/etc/subgid
dockremap:200000:65536
Ergebnis
  • Prozess läuft als root (UID 0) im Container -> Host-UID 200000
  • Prozess läuft als UID 1000 im Container -> Host-UID 201000
  • MySQL nutzt häufig UID 999 -> Host-UID 200999
  • Verwendete UIDs/GIDs sind image-spezifisch

userns-remap aktivieren

/etc/docker/daemon.json
{
  "userns-remap": "default"
}

Oder Sie können den Benutzer manuell eingeben:

{
  "userns-remap": "testuser"
}

Sie können den Namen, die UID oder user:group angeben

Dienst neu starten

Nach dem Speichern der Datei den Dienst neu starten:

sudo systemctl restart docker

Überprüfung

docker info | grep -i userns
Userns mode: private

Bind-Mounts

  • Bei Bind-Mounts muss der Host-Dateibesitzer zur remapped UID/GID passen, sonst können Dienste nicht starten (z.B. fehlende Schreibrechte)
Ziel-UID berechnen
grep dockremap /etc/subuid /etc/subgid

Ausgabe:

dockremap:200000:65536

Bespiel: Anwendung läuft im Container als UID/GID 1000.

  • HOST_UID = 200000 + 1000 = 201000
sudo chown -R 201000:201000 /path/to/bind-mount
  • Die Rechte sind nun korrekt festgelegt.



Anhang

Siehe auch



Dokumentation

Projekt