ce este o închisoare chroot?
un chroot pe sistemele de operare Unix este o operație care schimbă directorul rădăcină aparent pentru procesul de rulare curent și copiii săi. Programele care rulează în acest mediu modificat nu pot accesa fișierele din afara arborelui director desemnat. Acest lucru limitează în esență accesul lor la un arbore de directoare și astfel primesc numele „chroot jail”.
ideea este că creați un arbore de directoare în care copiați sau conectați toate fișierele de sistem necesare pentru ca un proces să ruleze. Apoi utilizați apelul de sistem chroot pentru a schimba directorul rădăcină pentru a fi la baza acestui nou copac și a începe procesul care rulează în acel mediu chrooted. Deoarece nu poate face referire la căi în afara rădăcinii modificate, nu poate citi sau scrie cu rea intenție în acele locații.
de ce este necesar și cum este diferit de mașinile virtuale?
aceasta este o virtualizare la nivel de sistem de operare și este adesea folosită în locul mașinilor virtuale pentru a crea mai multe instanțe izolate ale sistemului de operare gazdă. Aceasta este o virtualizare la nivel de kernel și practic nu are cheltuieli generale în comparație cu mașinile virtuale, care sunt o virtualizare a stratului de aplicație, ca urmare oferă o metodă foarte bună pentru crearea mai multor instanțe izolate pe același hardware. O mașină virtuală (VM) este o implementare software a unei mașini și exploatează adesea ceea ce este cunoscut sub numele de virtualizare Hardware pentru a reda imagini virtuale ale unui sistem de operare funcțional.
cum îl folosesc?
comanda de bază pentru a crea o închisoare chroot este după cum urmează:
chroot /path/to/new/root command OR chroot /path/to/new/root /path/to/server OR chroot /path/to/new/root /path/to/server
notă: Numai un utilizator root/privilegiat poate utiliza apelul de sistem chroot. Un utilizator non-privilegiat cu acces la comandă poate ocoli închisoarea chroot.
pași pentru a crea un mini-închisoare pentru ‘bash’ și ‘ Ls ‘ comanda
1. Creați un director care va acționa ca rădăcină a comenzii.
$ mkdir jailed $ cd jailed
2. Creați toate directoarele esențiale pentru rularea comenzii: în funcție de sistemul dvs. de operare, directoarele necesare se pot schimba. În mod logic, creăm toate aceste directoare pentru a păstra o copie a bibliotecilor necesare. Pentru a vedea ce sunt necesare toate directoarele, consultați Pasul 4.
$ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu
3.Rulați comanda’ care’: rulați comanda ‘care’ pentru a găsi locația comenzii LS și bash. După ce executați ce comandă, copiați acele binare în directorul’ bin ‘ al închisorii noastre. Asigurați-vă că nu aveți niciuna dintre aceste comenzi alias. De acum înainte, ne-ar fi referindu-se la directorul nostru ca ‘închis’ director pentru comoditate.
$ 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. Copiați bibliotecile/obiectele corespunzătoare: pentru ca executabilele din Directorul închis să funcționeze, trebuie să copiem bibliotecile/obiectele corespunzătoare din Directorul închis. În mod implicit, executabilul se uită la locațiile care încep cu ‘/’. Pentru a găsi dependențele folosim comanda ‘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)
Rulați următoarele comenzi pentru a crea directoare corespunzătoare.
$ 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/
similar pentru 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/
structura de directoare finală trebuie să fie similară cu aceasta,
5. Sudo chroot: rulați această comandă pentru a schimba rădăcina în directorul închis, împreună cu calea către shell. În mod implicit, va încerca să încarce ‘/bin/sh’ shell.
$ cd .. $ sudo chroot jailed /bin/bash
s-ar putea confrunta cu această eroare în timp ce rulează comanda chroot,
chroot: failed to run command `/bin/bash': No such file or directory
acest lucru se poate datora 2 motive, fie fișierul nu există(ceea ce este evident), sau atunci când biblioteca de încărcare eșuează sau nu este disponibil. Verificați dacă libaries sunt în locația corectă.
6. O nouă coajă trebuie să pop-up: sa bash nostru închis. În prezent avem doar 2 comenzi instalate, bash și ls. Din fericire cd și pwd sunt comenzi builtin în Bash shell, și astfel încât să le puteți folosi, de asemenea.
Roam în jurul directorului, încercați să accesați ‘cd /..sau ceva similar. Încercați să spargeți închisoarea, probabil că nu veți putea.
pentru a ieși din închisoare,
$ exit
partea cea mai importantă și interesantă este că, atunci când executați,
$ ps aux
și pentru a găsi procesul, veți găsi că există doar un singur proces,
root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash
interesant este că procesele din cochilia închisă rulează ca un proces simplu copil al acestei cochilii. Toate procesele din interiorul mediului închis, sunt doar un proces simplu la nivel de utilizator în sistemul de operare gazdă și sunt izolate de spațiile de nume furnizate de kernel, astfel există cheltuieli minime și, ca un beneficiu suplimentar, obținem izolare.
o copie a închis-bash-director explicat aici poate fi descărcat de aici.
în mod similar, puteți adăuga mai multe comenzi pentru a vă virtual închis mediu. Pentru a adăuga programe mai complexe, poate fi necesar să creați mai multe directoare, cum ar fi ‘/proc’ și ‘/dev’. Acestea cresc complexitatea procesului. Sperăm că nu avem nevoie de ea pentru scopul nostru.
acest lucru este tot ce trebuie să știți despre chroot și jailing de directoare. Scopul nostru final este să înțelegem ce sunt containerele și cum sunt servicii precum AWS (Amazon Web Services), Google Cloud și Docker capabile să ofere atât de multe instanțe virtuale ale sistemelor de operare la cerere. De asemenea, cum rulează sys-admin Mai multe servere web pentru mai multe domenii pe o singură mașină fizică. Acesta a fost doar un pas spre înțelegerea acestuia 🙂
- 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
despre autor:
Pinkesh Badjatiya provine din IIIT Hyderabad. El este un geek la inimă, cu proiecte ample care merită căutate. Lucrările sale de proiect pot fi văzute aici.
dacă doriți, de asemenea, pentru a prezenta blog-ul aici, vă rugăm să consultați GBlog pentru comentarii blog scris pe GeeksforGeeks.