Vad är en 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 den här modifierade miljön 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 jail”.
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-systemanropet för att ändra rotkatalogen för att ligga vid basen av det nya trädet och starta processen som körs i den chrooted miljön. Eftersom det faktiskt inte kan referera sökvä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 det sig från de virtuella maskinerna?
detta är en virtualisering på operativsystemnivå och används ofta istället för virtuella maskiner för att skapa flera isolerade instanser av värd-operativsystemet. Detta är en kärnnivåvirtualisering och har praktiskt taget ingen overhead jämfört med virtuella maskiner, som är en applikationslagervirtualisering, vilket resulterar i att 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 det som är känt som hårdvaruvirtualisering för att göra virtuella bilder av ett fungerande operativsystem.
Hur använder jag det?
det grundläggande kommandot för att skapa en chroot-fängelse är som följer:
chroot /path/to/new/root command OR chroot /path/to/new/root /path/to/server OR chroot /path/to/new/root /path/to/server
notera: Endast en root / privilegierad användare kan använda chroot-systemanropet. En icke-privilegierad användare med åtkomst till kommandot kan kringgå chroot-fängelset.
steg för att skapa en mini-fängelse för’ bash ’och’ ls ’ kommandot
1. Skapa en katalog som kommer att fungera som roten till 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 behålla en kopia av obligatoriska 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.Kör kommandot’ vilket’: Kör kommandot’ vilket ’ för att hitta platsen för kommandot ls och bash. Efter att ha kört vilket kommando, kopiera dessa binärer i ’ bin ’ – katalogen i vårt fängelse. Se till att du inte har någon av dessa kommandon Alias. Från och med nu, vi skulle hänvisa till vår katalog som ’fängslade’ katalog för enkelhetens skull.
$ 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 att körbara filer i vår fängslade katalog ska fungera måste vi 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-liux-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,
5. Sudo chroot: kör det här kommandot 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 detta fel när du kör chroot-kommandot,
chroot: failed to run command `/bin/bash': No such file or directory
detta kan bero på 2 skäl, antingen filen inte existerar (vilket är uppenbart), eller när laddningsbiblioteket misslyckas eller inte är tillgängligt. Dubbelkolla om libarierna är på 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 2 kommandon installerade, bash och ls. Lyckligtvis cd och pwd är inbyggda kommandon i bash shell, och så kan du använda dem också.
Roam runt katalogen, försök att komma åt ’ cd/..eller något liknande. Försök att bryta fängelset, förmodligen kommer du inte att kunna.
för att lämna fängelset,
$ exit
den viktigaste och mest intressanta delen är att när du kör,
$ ps aux
och hitta processen, du kommer att upptäcka att det bara finns en process,
root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash
intressant är att processer i det fängslade skalet körs som en enkel barnprocess av detta skal. Alla processer i den fängslade miljön är bara enkla användarnivåprocesser i värd OS och isoleras av namnrymderna som tillhandahålls av kärnan, så det finns minimal overhead och som en extra fördel får vi isolering.
en kopia av fängelse-bash-katalogen som förklaras här kan laddas ner härifrån.
på samma sätt kan du lägga till fler kommandon till dig virtuell fängslad miljö. För att lägga till mer komplexa program kan du behöva skapa fler kataloger, som ’/proc’ och ’/dev’. Dessa ökar komplexiteten i processen. 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 yttersta mål är att förstå vad som är containrar och hur kan tjänster som AWS (Amazon Web Services), Google Cloud och Docker tillhandahålla så många virtuella instanser av operativsystem på begäran. Också, hur sys-admin köra flera webbservrar för flera domäner på en enda fysisk maskin. Detta var bara ett steg mot att förstå det 🙂
- https://help.ubuntu.com/community/DebootstrapChroot
- https://wiki.archlinux.org/index.php/Install_from_existing_Linux
- http://serverfault.com/questions/162362/chroot-fails-cannot-run-command-bin-bash-no-such-file-or-directory
- https://wiki.archlinux.org/index.php/change_root
om författaren:
Pinkesh Badjatiya kommer från IIIT Hyderabad. Han är en nörd i hjärtat med gott om projekt värda att leta efter. Hans projektarbete kan ses här.
om du också vill visa upp din blogg här, se GBlog för gästbloggskrivning på GeeksforGeeks.