logo

Wirtualizacja systemu Linux — więzienie Chroot

Chroot w systemach operacyjnych Unix to operacja zmieniająca pozorny katalog główny dla aktualnie uruchomionego procesu i jego potomków. Programy działające w tym zmodyfikowanym środowisku nie mogą uzyskać dostępu do plików poza wyznaczonym drzewem katalogów. To zasadniczo ogranicza ich dostęp do drzewa katalogów i dlatego otrzymują nazwę „więzienia chroot”.

warstwy modelu osi

Pomysł jest taki, że tworzysz drzewo katalogów, do którego kopiujesz lub łączysz wszystkie pliki systemowe potrzebne do uruchomienia procesu. Następnie używasz wywołania systemowego chroot, aby zmienić katalog główny tak, aby znajdował się u podstawy tego nowego drzewa i rozpocząć proces działający w tym środowisku chrootowanym. Ponieważ w rzeczywistości nie może odwoływać się do ścieżek poza zmodyfikowanym katalogiem głównym, nie może złośliwie czytać ani zapisywać w tych lokalizacjach.



Dlaczego jest to wymagane i czym różni się od maszyn wirtualnych?

Jest to wirtualizacja na poziomie systemu operacyjnego i często jest używana zamiast maszyn wirtualnych do tworzenia wielu izolowanych instancji systemu operacyjnego hosta. Jest to wirtualizacja na poziomie jądra i praktycznie nie wiąże się z żadnymi dodatkowymi kosztami w porównaniu z maszynami wirtualnymi będącymi wirtualizacją warstwy aplikacji, dzięki czemu zapewnia bardzo dobrą metodę tworzenia wielu izolowanych instancji na tym samym sprzęcie. Maszyna wirtualna (VM) to programowa implementacja maszyny, która często wykorzystuje tak zwaną wirtualizację sprzętową do renderowania wirtualnego obrazu działającego systemu operacyjnego.

Jak korzystać z więzienia Chroot

Podstawowe polecenie utworzenia więzienia chroot jest następujące:

 chroot /path/to/new/root command  
OR
chroot /path/to/new/root /path/to/server
OR
chroot [options] /path/to/new/root /path/to/server

Uwaga: Tylko użytkownik root/uprzywilejowany może używać wywołania systemowego chroot. Nieuprzywilejowany użytkownik posiadający dostęp do polecenia może ominąć więzienie chroot.



Kroki, aby utworzyć mini-więzienie dla poleceń „bash” i „ls”.


1. Utwórz katalog, który będzie katalogiem głównym polecenia.

 $ mkdir jailed  
$ cd jailed

2. Utwórz wszystkie niezbędne katalogi, aby polecenie mogło zostać uruchomione: W zależności od systemu operacyjnego wymagane katalogi mogą się zmieniać. Logicznie rzecz biorąc, tworzymy wszystkie te katalogi, aby zachować kopię wymaganych bibliotek. Aby zobaczyć, jakie wszystkie katalogi są wymagane, zobacz Krok 4.

 $ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu

3. Uruchom polecenie „które”: Uruchom polecenie „które”, aby znaleźć lokalizację polecenia ls i bash. Po uruchomieniu polecenia what skopiuj te pliki binarne do katalogu „bin” naszego więzienia. Upewnij się, że żadne z tych poleceń nie ma aliasu. Odtąd będziemy odnosić się do naszego katalogu jako 'Osadzony w więzieniu' katalog dla wygody.



 $ unalias ls # Required only if you have aliased ls command  
$ unalias bash # Required only if you have aliased bash command
$ cp $(which ls) ./bin/
$ cp $(which bash) ./bin/

4. Skopiuj odpowiednie biblioteki/obiekty : Dla plików wykonywalnych w naszym Osadzony w więzieniu do pracy, musimy skopiować odpowiednie biblioteki/obiekty do katalogu JAILED. Domyślnie plik wykonywalny sprawdza lokalizacje zaczynające się od „/”. Aby znaleźć zależności używamy polecenia „ldd”

$ ldd $(which bash)  
linux-vdso.so.1 => (0x00007ffc75dd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000)
/lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)

Uruchom następujące polecenia, aby utworzyć odpowiednie katalogi.

$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/  
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2 lib64/

Podobnie dla ls 

$ ldd $(which ls)  
linux-vdso.so.1 => (0x00007fff4f05d000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000)
/lib64/ld-linux-x86-64.so.2 (0x000055e836c69000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/  
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2 lib64/
$ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/


Ostateczna struktura katalogów musi być podobna do tej

Chrootowe więzienie' title=

5. Sudo chroot: Uruchom to polecenie, aby zmienić katalog główny na katalog JAILED wraz ze ścieżką do powłoki. Domyślnie spróbuje załadować powłokę „/bin/sh”.

 $ cd ..  
$ sudo chroot jailed /bin/bash

Możesz napotkać ten błąd podczas uruchamiania polecenia chroot 

chroot: failed to run command `/bin/bash': No such file or directory

Może to wynikać z 2 powodów: albo plik nie istnieje (co jest oczywiste), albo gdy biblioteka ładująca nie powiedzie się lub będzie niedostępna. Sprawdź dokładnie, czy biblioteki znajdują się we właściwej lokalizacji.

6. Musi pojawić się nowa powłoka: To nasza więzienna bash. Obecnie mamy zainstalowane tylko 2 polecenia bash i ls. Na szczęście polecenia cd i pwd są wbudowanymi poleceniami powłoki bash, więc można ich również używać.

Poruszaj się po katalogu, spróbuj uzyskać dostęp do „cd /../” lub czegoś podobnego. Spróbuj rozbić więzienie, prawdopodobnie nie będziesz w stanie. :)

Aby wyjść z więzienia 

 $ exit

Najważniejszą i najciekawszą częścią jest to, że biegasz 

 $ ps aux

i znajdź proces, przekonasz się, że jest tylko jeden proces 

root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash

Co ciekawe, procesy w uwięzionej powłoce działają jako prosty proces potomny tej powłoki. Wszystkie procesy w środowisku JAILED są po prostu prostymi procesami na poziomie użytkownika w systemie operacyjnym hosta i są izolowane przez przestrzenie nazw udostępniane przez jądro, dzięki czemu obciążenie jest minimalne, a dodatkową korzyścią jest izolacja.

Verilog zawsze

Podobnie możesz dodać więcej poleceń do swojego wirtualnego, uwięzionego środowiska. Aby dodać bardziej złożone programy, może być konieczne utworzenie większej liczby katalogów, takich jak „/proc” i „/dev”. Zwiększają one złożoność procesu. Mamy nadzieję, że nie będzie nam to potrzebne do naszych celów.

To wszystko, co musisz wiedzieć o chroot i blokowaniu katalogów. Naszym ostatecznym celem jest zrozumienie, czym są kontenery i w jaki sposób usługi takie jak AWS (Amazon Web Services), Google Cloud i Docker są w stanie zapewnić tak wiele wirtualnych instancji systemów operacyjnych na żądanie. Oraz w jaki sposób sys-admin uruchamia wiele serwerów WWW dla wielu domen na jednej fizycznej maszynie. To był tylko jeden krok w kierunku zrozumienia tego