logo

Linux Virtualization - Chroot fängelse

En chroot på UNIX -operativsystem är en operation som ändrar den uppenbara rotkatalogen för den aktuella körprocessen och dess barn. Programmen som körs i denna modifierade miljö kan inte komma åt filerna utanför det angivna katalogträdet. Detta begränsar i huvudsak deras tillgång till ett katalogträd och därmed får de namnet "Chroot fängelse".

Tanken är att du skapar ett katalogträd där du kopierar eller länkar i alla systemfiler som behövs för att en process ska köras. Du använder sedan Chroot System -samtalet för att ändra rotkatalogen för att vara vid basen av detta nya träd och starta processen att köra i den chrootade miljön. Eftersom det faktiskt inte kan hänvisa till vägar utanför den modifierade roten kan den inte skadligt läsa eller skriva till dessa platser.



Varför krävs det och hur skiljer sig det från de virtuella maskinerna?

Detta är virtualisering på operativsystemnivå och används ofta istället för virtuella maskiner för att skapa flera isolerade instanser av värd OS. Detta är en virtualisering av kärnnivå och har praktiskt taget ingen omkostnad jämfört med virtuella maskiner som är applikationsskikt virtualisering som ett resultat, det ger en mycket bra metod för att skapa flera isolerade instanser på samma hårdvara. En virtuell maskin (VM) är en mjukvaruimplementering av en maskin och de utnyttjar ofta vad som kallas virtualisering av hårdvara för att göra en virtuell bild av ett fungerande operativsystem.

Hur man använder Chroot -fängelse

Det grundläggande kommandot för att skapa ett Chroot -fängelse är som följer:

 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

Obs: Endast en rot/privilegierad användare kan använda Chroot System -samtalet. En icke-privilegierad användare med åtkomst till kommandot kan kringgå Chroot-fängelset.



Steg för att skapa en mini-jail för 'Bash' och 'LS' -kommandot


1. Skapa en katalog som kommer att fungera som kommandot.

 $ mkdir jailed  
$ cd jailed

2. Skapa alla viktiga kataloger för kommandot att köra: Beroende på ditt operativsystem kan de nödvändiga katalogerna ändras. Logiskt skapar vi alla dessa kataloger för att hålla en kopia av nödvändiga bibliotek. För att se vad alla kataloger krävs se steg 4.

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

3. Kommandot "vilket" -kommandot: Kör kommandot 'vilket' för att hitta platsen för LS och Bash -kommando. Se till att du inte har några av dessa kommandon alias. Från och med nu skulle vi hänvisa till vår katalog som 'Fängslad' katalog för bekvämlighet.



 $ 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. Kopiera lämpliga bibliotek/objekt : För körbara filerna i vår Fängslad Katalog till arbete Vi måste kopiera lämpliga bibliotek/objekt i den fängslade katalogen. Som standard tittar den körbara på platserna som börjar med '/'. För att hitta beroenden använder vi kommandot '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)

Kör följande kommandon för att skapa lämpliga kataloger.

$ 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/

På samma sätt för 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/


Den slutliga katalogstrukturen måste likna detta

Hakfängelse' title=

5. Sudo Chroot: Kör detta kommando för att ändra roten till den fängslade katalogen tillsammans med sökvägen till skalet. Som standard kommer det att försöka ladda '/bin/sh' skal.

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

Du kan möta det här felet när du kör Chroot -kommandot 

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

Detta kan bero på två skäl som antingen finns filen inte (vilket är uppenbart) eller när lastbiblioteket misslyckas eller inte är tillgängligt. Dubbelkontrollera om biblioteken har rätt plats.

6. Ett nytt skal måste dyka upp: Det är vår fängslade bash. Vi har för närvarande bara två kommandon installerade bash och LS. Lyckligtvis är CD och PWD byggda kommandon i Bash Shell och så kan du också använda dem.

Ströva runt katalogen Försök åtkomst till 'CD /../' eller något liknande. Försök att bryta fängelset, förmodligen kommer du inte att kunna. :)

Att lämna fängelset 

 $ exit

Den viktigaste och intressanta delen är att när du springer 

 $ ps aux

och hitta processen du hittar att det bara finns en process 

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

Intressant nog processer i det fängslade skalet körs som en enkel barnprocess för detta skal. Alla processer i den fängslade miljön är bara en enkel användarnivåprocess i värd OS och isoleras av namnen som tillhandahålls av kärnan, så det finns minimal omkostnad och som en extra fördel får vi isolering.

På liknande sätt kan du lägga till fler kommandon till din virtuella fängslade miljö. För att lägga till mer komplexa program kan du behöva för att skapa fler kataloger som '/proc' och '/dev'. Dessa ökar processens komplexitet. Förhoppningsvis behöver vi inte det för vårt syfte.

Detta är allt du behöver veta om Chroot och fängelse av kataloger. Vårt ultimata mål är att förstå vad som är containrar och hur är tjänster som AWS (Amazon Web Services) Google Cloud och Docker som kan tillhandahålla så många virtuella instanser av operativsystem på begäran. Också hur kör sys-admin flera webbserver för flera domäner på en enda fysisk maskin. Detta var bara ett steg mot att förstå det