User Namespace
Podstawowe informacje
Przestrzeń nazw użytkownika to funkcja jądra Linux, która zapewnia izolację mapowania identyfikatorów użytkownika i grupy, umożliwiając każdej przestrzeni nazw użytkownika posiadanie własnego zestawu identyfikatorów użytkownika i grupy. Ta izolacja umożliwia procesom działającym w różnych przestrzeniach nazw użytkownika posiadanie różnych uprawnień i właścicieli, nawet jeśli mają te same identyfikatory użytkownika i grupy numerycznie.
Przestrzenie nazw użytkownika są szczególnie przydatne w konteneryzacji, gdzie każdy kontener powinien mieć własny niezależny zestaw identyfikatorów użytkownika i grupy, co umożliwia lepsze zabezpieczenie i izolację między kontenerami a systemem hosta.
Jak to działa:
Po utworzeniu nowej przestrzeni nazw użytkownika, rozpoczyna się ona z pustym zestawem mapowania identyfikatorów użytkownika i grupy. Oznacza to, że każdy proces działający w nowej przestrzeni nazw użytkownika początkowo nie ma uprawnień poza przestrzenią nazw.
Mapowania identyfikatorów mogą być ustanawiane między identyfikatorami użytkownika i grupy w nowej przestrzeni nazw a tymi w przestrzeni nadrzędnej (lub hosta). Pozwala to procesom w nowej przestrzeni nazw na posiadanie uprawnień i właścicieli odpowiadających identyfikatorom użytkownika i grupy w przestrzeni nadrzędnej. Jednak mapowania identyfikatorów mogą być ograniczone do określonych zakresów i podzbiorów identyfikatorów, co umożliwia precyzyjną kontrolę nad uprawnieniami przyznawanymi procesom w nowej przestrzeni nazw.
W obrębie przestrzeni nazw użytkownika procesy mogą mieć pełne uprawnienia roota (UID 0) do operacji wewnątrz przestrzeni nazw, jednocześnie posiadając ograniczone uprawnienia poza przestrzenią nazw. Pozwala to kontenerom na uruchamianie się z uprawnieniami podobnymi do roota w ich własnej przestrzeni nazw, bez posiadania pełnych uprawnień roota na systemie hosta.
Procesy mogą przenosić się między przestrzeniami nazw za pomocą wywołania systemowego
setns()
lub tworzyć nowe przestrzenie nazw za pomocą wywołań systemowychunshare()
lubclone()
z flagąCLONE_NEWUSER
. Gdy proces przenosi się do nowej przestrzeni nazw lub ją tworzy, zaczyna korzystać z mapowania identyfikatorów użytkownika i grupy powiązanego z tą przestrzenią nazw.
Laboratorium:
Utwórz różne przestrzenie nazw
CLI
Montując nową instancję systemu plików /proc
przy użyciu parametru --mount-proc
, zapewniasz, że nowa przestrzeń montowania ma dokładny i izolowany widok informacji o procesach specyficznych dla tej przestrzeni.
Docker
Aby korzystać z przestrzeni nazw użytkownika, demona Dockera należy uruchomić z opcją --userns-remap=default
(W Ubuntu 14.04 można to zrobić, modyfikując plik /etc/default/docker
, a następnie wykonując polecenie sudo service docker restart
).
Sprawdź, w jakiej przestrzeni nazw znajduje się Twój proces
Możliwe jest sprawdzenie mapy użytkowników z kontenera Docker za pomocą polecenia:
Lub z hosta za pomocą:
Znajdź wszystkie przestrzenie nazw użytkowników
Dodatkowo, możesz wejść do innego przestrzeni nazw procesu tylko jeśli jesteś rootem. I nie możesz wejść do innej przestrzeni nazw bez deskryptora wskazującego na nią (takiego jak /proc/self/ns/user
).
Tworzenie nowej przestrzeni nazw użytkownika (z mapowaniem)
Odzyskiwanie uprawnień
W przypadku przestrzeni nazw użytkownika, po utworzeniu nowej przestrzeni nazw użytkownika, proces, który do niej wchodzi, otrzymuje pełny zestaw uprawnień w ramach tej przestrzeni nazw. Uprawnienia te pozwalają procesowi wykonywać operacje uprzywilejowane, takie jak montowanie systemów plików, tworzenie urządzeń lub zmiana właściciela plików, ale tylko w kontekście swojej przestrzeni nazw użytkownika.
Na przykład, posiadając uprawnienie CAP_SYS_ADMIN
w przestrzeni nazw użytkownika, możesz wykonywać operacje, które zwykle wymagają tego uprawnienia, takie jak montowanie systemów plików, ale tylko w kontekście swojej przestrzeni nazw użytkownika. Operacje wykonywane z tym uprawnieniem nie będą miały wpływu na system hosta ani inne przestrzenie nazw.
Dlatego nawet jeśli uzyskanie nowego procesu w nowej przestrzeni nazw użytkownika przywróci wszystkie uprawnienia (CapEff: 000001ffffffffff), faktycznie możesz używać tylko tych związanych z przestrzenią nazw (np. montowanie), ale nie wszystkich. Samo to nie wystarczy, aby uciec z kontenera Docker.
```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