User Namespace
Grundlegende Informationen
Ein Benutzernamensraum ist eine Funktion des Linux-Kernels, die eine Isolierung von Benutzer- und Gruppen-ID-Zuordnungen ermöglicht und es jedem Benutzernamensraum ermöglicht, seinen eigenen Satz von Benutzer- und Gruppen-IDs zu haben. Diese Isolierung ermöglicht es Prozessen, die in verschiedenen Benutzernamensräumen ausgeführt werden, unterschiedliche Berechtigungen und Besitzverhältnisse zu haben, auch wenn sie numerisch dieselben Benutzer- und Gruppen-IDs teilen.
Benutzernamensräume sind besonders nützlich bei der Containerisierung, bei der jeder Container seinen eigenen unabhängigen Satz von Benutzer- und Gruppen-IDs haben sollte, um eine bessere Sicherheit und Isolierung zwischen Containern und dem Host-System zu ermöglichen.
Wie es funktioniert:
Wenn ein neuer Benutzernamensraum erstellt wird, beginnt er mit einem leeren Satz von Benutzer- und Gruppen-ID-Zuordnungen. Das bedeutet, dass jeder Prozess, der im neuen Benutzernamensraum ausgeführt wird, anfangs keine Berechtigungen außerhalb des Namensraums hat.
ID-Zuordnungen können zwischen den Benutzer- und Gruppen-IDs im neuen Namensraum und denen im übergeordneten (oder Host-) Namensraum hergestellt werden. Dadurch können Prozesse im neuen Namensraum Berechtigungen und Besitzverhältnisse entsprechend den Benutzer- und Gruppen-IDs im übergeordneten Namensraum haben. Die ID-Zuordnungen können jedoch auf bestimmte Bereiche und Teilgruppen von IDs beschränkt werden, um eine feinere Kontrolle über die den Prozessen im neuen Namensraum gewährten Berechtigungen zu ermöglichen.
Innerhalb eines Benutzernamensraums können Prozesse volle Root-Berechtigungen (UID 0) für Operationen innerhalb des Namensraums haben, während sie außerhalb des Namensraums nur begrenzte Berechtigungen haben. Dies ermöglicht es Containern, mit root-ähnlichen Fähigkeiten in ihrem eigenen Namensraum zu laufen, ohne volle Root-Berechtigungen auf dem Host-System zu haben.
Prozesse können zwischen Namensräumen wechseln, indem sie den Systemaufruf
setns()
verwenden oder neue Namensräume erstellen, indem sie die Systemaufrufeunshare()
oderclone()
mit dem FlagCLONE_NEWUSER
verwenden. Wenn ein Prozess zu einem neuen Namensraum wechselt oder einen neuen erstellt, beginnt er die Benutzer- und Gruppen-ID-Zuordnungen zu verwenden, die mit diesem Namensraum verbunden sind.
Labor:
Verschiedene Namensräume erstellen
CLI
Durch das Einbinden einer neuen Instanz des /proc
-Dateisystems mit dem Parameter --mount-proc
stellen Sie sicher, dass der neue Mount-Namespace eine genaue und isolierte Ansicht der prozessspezifischen Informationen für diesen Namespace hat.
Docker
Um den Benutzernamensraum zu verwenden, muss der Docker-Daemon mit --userns-remap=default
gestartet werden (In Ubuntu 14.04 kann dies durch Ändern von /etc/default/docker
und anschließendes Ausführen von sudo service docker restart
erfolgen).
Überprüfen Sie, in welchem Namensraum sich Ihr Prozess befindet
Es ist möglich, die Benutzerzuordnung des Docker-Containers mit folgendem Befehl zu überprüfen:
Oder vom Host aus mit:
Alle Benutzernamenräume finden
Außerdem können Sie nur in einen anderen Prozess-Namespace wechseln, wenn Sie root sind. Und Sie können nicht in einen anderen Namespace wechseln, ohne einen Descriptor darauf zu verweisen (wie z.B. /proc/self/ns/user
).
Neuen Benutzer-Namespace erstellen (mit Zuordnungen)
Wiederherstellung von Berechtigungen
Im Fall von Benutzernamensräumen wird einem Prozess, der in den Namensraum eintritt, ein vollständiger Satz von Berechtigungen innerhalb dieses Namensraums gewährt. Diese Berechtigungen ermöglichen es dem Prozess, privilegierte Operationen wie das Mounten von Dateisystemen, das Erstellen von Geräten oder das Ändern des Dateibesitzes durchzuführen, jedoch nur im Kontext seines Benutzernamensraums.
Wenn Sie beispielsweise die CAP_SYS_ADMIN
-Berechtigung innerhalb eines Benutzernamensraums haben, können Sie Operationen durchführen, die normalerweise diese Berechtigung erfordern, wie das Mounten von Dateisystemen, jedoch nur im Kontext Ihres Benutzernamensraums. Alle Operationen, die Sie mit dieser Berechtigung durchführen, wirken sich nicht auf das Host-System oder andere Namensräume aus.
Daher erhalten Sie durch das Erstellen eines neuen Prozesses in einem neuen Benutzernamensraum alle Berechtigungen zurück (CapEff: 000001ffffffffff), Sie können jedoch tatsächlich nur diejenigen verwenden, die mit dem Namensraum zusammenhängen (z. B. Mounten), aber nicht alle. Daher reicht dies allein nicht aus, um aus einem Docker-Container auszubrechen.
```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash
Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error
Last updated