Cum să utilizați comanda chroot pe Linux

Comanda chroot vă poate trimite la închisoare, vă poate menține mediile de dezvoltare sau de testare izolate sau pur și simplu vă poate îmbunătăți securitatea sistemului. Vă arătăm cel mai simplu mod de a-l folosi.

Ce este un chroot?

Dacă încercați să măsurați utilitatea unei comenzi, trebuie să țineți cont de funcționalitatea pe care o oferă și de ușurința ei de utilizare. Dacă este prea complicat de utilizat pentru oameni sau prea lung pentru a-i face să vrea să încerce să-l folosească, funcționalitatea ar putea fi la fel de bine zero. Dacă nimeni nu îl folosește, nu oferă nicio funcționalitate.

În discuțiile cu utilizatorii Linux – în persoană și pe forumuri – se pare că comanda chroot este una care este considerată ca fiind dificil de utilizat sau prea obscen și plictisitor de configurat. Se pare că acest utilitar extraordinar nu este folosit atât de mult pe cât ar putea fi.

Cu chroot puteți configura și rulați programe sau shell-uri interactive cum ar fi Bash într-un sistem de fișiere încapsulat care este împiedicat să interacționeze cu sistemul de fișiere obișnuit. Tot ce se află în mediul chroot este inclus și conținut. Nimic din mediul chroot nu poate vedea dincolo de propriul director special, rădăcină, fără a escalada la privilegii root. Acest lucru ia adus acestui tip de mediu porecla de închisoare chroot. Termenul „închisoare” nu trebuie confundat cu FreeBSD-uri comanda jail, care creează un mediu chroot asta e mai sigur decât mediul obișnuit chroot.

Dar, de fapt, există o modalitate foarte simplă de a folosi chroot, pe care o vom parcurge. Folosim comenzi Linux obișnuite care vor funcționa pe toate distribuțiile. Unele distribuții Linux au instrumente dedicate pentru a configura medii chroot, cum ar fi debootstrap pentru Ubuntu, dar suntem distro-agnostici aici.

Când ar trebui să utilizați un chroot?

Un mediu chroot oferă o funcționalitate similară cu cea a unei mașini virtuale, dar este o soluție mai ușoară. Sistemul captiv nu are nevoie de un hypervisor pentru a fi instalat și configurat, cum ar fi VirtualBox sau Manager de mașini virtuale. Nici nu trebuie să aibă un nucleu instalat în sistemul captiv. Sistemul captiv partajează nucleul dvs. existent.

În unele sensuri, mediile chroot sunt mai aproape de containere, cum ar fi LXC decât la mașinile virtuale. Sunt ușoare, rapid de implementat, iar crearea și declanșarea unuia poate fi automatizată. La fel ca și containerele, o modalitate convenabilă de a le configura este să instalați doar suficient sistem de operare pentru a realiza ceea ce este necesar. La întrebarea „ce este necesar” se răspunde analizând modul în care veți folosi mediul dvs. chroot.

  Cum să joci Deadcore pe Linux

Câteva utilizări comune sunt:

Dezvoltare software și verificarea produsului. Dezvoltatorii scriu software și echipa de verificare a produsului (PV) îl testează. Uneori, PV găsește probleme care nu pot fi replicate pe computerul dezvoltatorului. Dezvoltatorul are tot felul de instrumente și biblioteci instalate pe computerul său de dezvoltare pe care utilizatorul obișnuit – și PV – nu le va avea. Adesea, software-ul nou care funcționează pentru dezvoltator, dar nu pentru alții, se dovedește a folosi o resursă pe PC-ul dezvoltatorului care nu a fost inclusă în versiunea de testare a software-ului. chroot permite dezvoltatorilor să aibă un mediu captiv simplu pe computerul lor, în care să-l pot scufunda software-ul înainte de a-l oferi PV. Mediul captiv poate fi configurat cu dependențele minime necesare de software.

Reducerea riscului de dezvoltare. Dezvoltatorul poate crea un mediu de dezvoltare dedicat, astfel încât nimic din ceea ce se întâmplă în el să nu-i poată distruge computerul real.

Rulează software depreciat. Uneori trebuie doar să ai o versiune veche a ceva care rulează. Dacă software-ul vechi are cerințe care ar intra în conflict sau ar fi incompatibile cu versiunea dvs. de Linux, puteți efectua un chroot pentru software-ul cu probleme.

Recuperare și actualizări ale sistemului de fișiere: Dacă o instalare Linux devine inoperabilă, puteți utiliza chroot pentru a monta sistemul de fișiere deteriorat într-un punct de montare pe un Live CD. Acest lucru vă permite să lucrați în sistemul deteriorat și să încercați să îl reparați ca și cum ar fi montat normal la root /. Aceasta înseamnă că căile de fișiere așteptate din sistemul deteriorat vor fi referite corect din directorul rădăcină și nu din punctul de montare al Live CD-ului. O tehnică similară a fost folosită în articolul care descrie cum să migrați sistemul de fișiere Linux de la ext2 sau ext3 la ext4.

Aplicații de delimitare. Rularea unui server FTP sau a unui alt dispozitiv conectat la internet într-un mediu chroot limitează daunele pe care le poate face un atacator extern. Acesta poate fi un pas valoros în întărirea securității sistemului dumneavoastră.

Crearea unui mediu chroot

Avem nevoie de un director care să acționeze ca director rădăcină al mediului chroot. Pentru a avea o modalitate scurtă de a ne referi la acel director, vom crea o variabilă și vom stoca numele directorului în ea. Aici setăm o variabilă pentru a stoca o cale către directorul „testroot”. Nu contează dacă acest director nu există încă, îl vom crea în curând. Dacă directorul există, ar trebui să fie gol.

chr=/home/dave/testroot

Dacă directorul nu există, trebuie să-l creăm. Putem face asta cu această comandă. Opțiunea -p (părinți) asigură că toate directoarele părinte lipsă sunt create în același timp:

mkdir -p $chr

Trebuie să creăm directoare pentru a păstra porțiunile sistemului de operare pe care le va avea nevoie mediul nostru chroot. Vom configura un mediu Linux minimalist care folosește Bash ca shell interactiv. Vom include, de asemenea, comenzile touch, rm și ls. Acest lucru ne va permite să folosim toate comenzile încorporate ale lui Bash și să atingem, rm și ls. Vom putea crea, lista și elimina fișiere și vom putea folosi Bash. Și, în acest exemplu simplu, asta este tot.

  Cum să activați suportul pentru pachetul Snap pe Linux Mint

Listați directoarele pe care trebuie să le creați în {} expansiune bretele.

mkdir -p $chr/{bin,lib,lib64}

Acum vom schimba directorul în noul nostru director rădăcină.

cd $chr

Să copiem binarele de care avem nevoie în mediul nostru minimalist Linux din directorul tău obișnuit „/bin” în directorul nostru chroot „/bin”. Opțiunea -v (verbosă) îl face pe cp să ne spună ce face în timp ce efectuează fiecare acțiune de copiere.

cp -v /bin/{bash,touch,ls,rm} $chr

Fișierele sunt copiate pentru noi:

Aceste binare vor avea dependențe. Trebuie să descoperim care sunt acestea și să copiem acele fișiere și în mediul nostru, altfel bash, touch, rm și ls nu vor putea funcționa. Trebuie să facem acest lucru pe rând pentru fiecare dintre comenzile alese de noi. Vom face Bash mai întâi. Comanda ldd va enumerați dependențele pentru noi.

ldd /bin/bash

Dependențele sunt identificate și listate în fereastra terminalului:

Trebuie să copiem acele fișiere în noul nostru mediu. Alegerea detaliilor din lista respectivă și copierea lor pe rând va fi consumatoare de timp și va fi predispusă la erori.

Din fericire, îl putem semi-automatiza. Vom enumera din nou dependențele și de data aceasta vom forma o listă. Apoi vom parcurge lista copiend fișierele.

Aici folosim ldd pentru a enumera dependențele și pentru a alimenta rezultatele printr-o conductă în egrep. Folosirea egrep este aceeași cu utilizarea grep cu opțiunea -E (expresii regulate extinse). Opțiunea -o (doar potrivire) restricționează ieșirea la părțile care se potrivesc ale liniilor. Căutăm fișiere de bibliotecă care se potrivesc care se termină cu un număr [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

Putem verifica conținutul listei folosind echo:

echo $list

Acum că avem lista, o putem parcurge cu următoarea buclă, copiend fișierele pe rând. Folosim variabila i pentru a parcurge lista. Pentru fiecare membru al listei, copiem fișierul în directorul nostru rădăcină chroot, care este valoarea deținută în $chr.

Opțiunea -v (verbosă) face ca cp să anunțe fiecare copie pe măsură ce o realizează. Opțiunea –parents asigură că orice directoare părinte lipsă sunt create în mediul chroot.

for i in $list; do cp -v --parents "$i" "${chr}"; done

pentru i în $list;  face cp -v --parinti

Și aceasta este rezultatul:

  Original Sin 2 pe Linux

Vom folosi această tehnică pentru a captura dependențele fiecăreia dintre celelalte comenzi. Și vom folosi tehnica buclei pentru a efectua copierea propriu-zisă. Vestea bună este că trebuie doar să facem o mică modificare a comenzii care adună dependențele.

Putem prelua comanda din istoricul comenzilor apăsând de câteva ori tasta săgeată sus și apoi efectuând editarea. Comanda de copiere în buclă nu trebuie schimbată deloc.

Aici am folosit tasta săgeată sus pentru a găsi comanda și am editat-o ​​pentru a spune touch în loc de bash.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

Acum putem repeta exact aceeași comandă buclă ca înainte:

for i in $list; do cp -v --parents "$i" "${chr}"; done

pentru i în $list;  face cp -v --parinti

Și fișierele noastre sunt copiate pentru noi:

Acum putem edita linia de comandă a listei pentru ls:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Din nou, vom folosi aceeași comandă buclă. Nu-i pasă ce fișiere sunt în listă. Funcționează orbește prin listă copiend fișierele pentru noi.

for i in $list; do cp -v --parents "$i" "${chr}"; done

pentru i în $list;  face cp -v --parinti

Și dependențele pentru ls sunt copiate pentru noi:

Edităm linia de comandă a listei pentru ultima dată, făcând-o să funcționeze pentru rm:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Folosim comanda looping copy pentru ultima dată:

for i in $list; do cp -v --parents "$i" "${chr}"; done

Ultimele dependențe sunt copiate în mediul nostru chroot. În sfârșit suntem gata să folosim comanda chroot. Această comandă setează rădăcina mediului chroot și specifică ce aplicație să ruleze ca shell.

sudo chroot $chr /bin/bash

Mediul nostru chroot este acum activ. Promptul ferestrei terminalului s-a schimbat, iar shell-ul interactiv este gestionat de shell-ul bash în mediul nostru.

Putem încerca comenzile pe care le-am adus în mediu.

ls
ls /home/dave/Documents

Comanda ls funcționează așa cum ne-am aștepta atunci când o folosim în mediu. Când încercăm să accesăm un director în afara mediului, comanda eșuează.

Putem folosi touch pentru a crea un fișier, ls pentru a-l lista și rm pentru a-l elimina.

touch sample_file.txt
ls
rm sample_file.txt
ls

Desigur, putem folosi și comenzile încorporate pe care shell-ul Bash le oferă. Dacă tastați ajutor în linia de comandă, Bash le va lista pentru dvs.

help

Utilizați exit pentru a părăsi mediul chroot:

exit

Dacă doriți să eliminați mediul chroot, îl puteți șterge pur și simplu:

rm -r testroot/

Aceasta va șterge recursiv fișierele și directoarele din mediul chroot.

Automatizați pentru confort

Dacă vă gândiți că mediile chroot v-ar putea fi utile, dar sunt puțin dificil de configurat, amintiți-vă că puteți elimina oricând efortul și riscul sarcinilor repetitive folosind aliasuri, funcții și scripturi.