logo

Virtualizare Linux - î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 de director desemnat. Acest lucru își limitează în esență accesul la un arbore de director și, astfel, primesc numele „închisoare chroot”.

Ideea este că creați un arbore de director în care copiați sau conectați în toate fișierele de sistem necesare pentru ca un proces de rulat. Apoi utilizați apelul de sistem Chroot pentru a schimba directorul rădăcină pentru a fi la baza acestui nou arbore și pentru a începe procesul care rulează în acel mediu chrooted. Deoarece nu poate referința căilor în afara rădăcinii modificate, nu poate citi sau scrie în mod rău în acele locații.



De ce este necesar și cum este diferit de mașinile virtuale?

Aceasta este virtualizarea la nivel de operare și este adesea folosită în loc de mașini 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 virtualizarea stratului de aplicații 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 deseori exploatează ceea ce este cunoscut sub numele de virtualizare hardware pentru a reda o imagine virtuală a unui sistem de operare de lucru.

Cum se folosește închisoarea chroot

Comanda de bază pentru a crea o închisoare Chroot este următoarea:

 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

Notă: Doar un utilizator rădăcină/privilegiat poate utiliza apelul de sistem Chroot. Un utilizator neprivileizat cu acces la comandă poate ocoli închisoarea Chroot.



Pași pentru a crea o mini-cheia pentru „comanda„ bash ”și„ ls ”


1. Creați un director care va acționa ca rădăcina comenzii.

converti o dată într-un șir
 $ mkdir jailed  
$ cd jailed

2. Creați toate directoarele esențiale pentru ca comanda de rulat: Î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 directoare sunt necesare a se vedea pasul 4.

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

3.Run comanda „care”: Rulați comanda „care” pentru a găsi locația LS și Bash Command.After rulează care există comandanți acele binare din directorul „bin” al închisorii noastre. Asigurați -vă că nu aveți niciuna dintre aceste comenzi aliase. De acum înainte ne -am referi 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 executabilele din Închis Director pentru a lucra trebuie să copiem bibliotecile/obiectele corespunzătoare din directorul închis. În mod implicit, executabilul privește locațiile începând 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 adecvate.

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

În mod 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-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/


Structura finală a directorului trebuie să fie similară cu aceasta

Închisoare chroot' title=

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 shell -ul „bin/sh”.

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

S -ar putea să vă confruntați cu această eroare în timp ce rulați comanda chroot 

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

Acest lucru se poate datora 2 motive, fie că fișierul nu există (ceea ce este evident), fie când biblioteca de încărcare eșuează, fie nu este disponibilă. Verificați dublu dacă bibliotecile sunt într-o locație corectă.

6. O coajă nouă trebuie să apară: Este bash -ul nostru închis. În prezent, avem doar 2 comenzi instalate Bash și LS. Din fericire CD -ul și PWD sunt comenzi construite în Bash Shell și astfel le puteți folosi și ele.

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. :)

A ieși din închisoare 

 $ exit

Cea mai importantă și interesantă parte este că atunci când alergi 

 $ ps aux

Și găsiți procesul pe care îl veți constata că există un singur proces 

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

Interesant este că procesele din shell -ul închis rulează ca un simplu proces de copil al acestei cochilii. Toate procesele din mediul închis sunt doar un proces simplu de nivel al utilizatorului în sistemul de operare gazdă și sunt izolate de spațiile de nume furnizate de kernel, astfel încât există o cheltuială minimă și ca beneficiu suplimentar obținem izolare.

În mod similar, puteți adăuga mai multe comenzi pentru dvs. mediul închis virtual. Pentru a adăuga mai multe programe complexe, este posibil să aveți nevoie pentru a crea mai multe directoare precum „/proc” și „/dev”. Acestea cresc complexitatea procesului. Sperăm că nu o cerem pentru scopul nostru.

Acest lucru este tot ce trebuie să știți despre Chroot și închisoarea directoarelor. Scopul nostru final este să înțelegem care sunt containerele și cum sunt servicii precum AWS (Amazon Web Services) Google Cloud și Docker capabili să ofere atât de multe cazuri virtuale de sisteme de operare la cerere. De asemenea, cum rulează Sy-Admin mai multor servere web pentru mai multe domenii pe o singură mașină fizică. Acesta a fost doar un pas spre înțelegerea acestuia