Comanda chroot reprezintă o unealtă versatilă, capabilă să vă izoleze mediile de lucru, să vă fortifice securitatea sistemului sau chiar să simuleze o „închisoare” pentru aplicații. Vă vom dezvălui o abordare simplă pentru a profita de această comandă.
Ce este, mai exact, chroot?
Pentru a evalua utilitatea unei comenzi, este esențial să analizăm atât funcționalitatea sa, cât și gradul de ușurință în utilizare. O comandă complexă sau dificil de înțeles riscă să fie ignorată, oricât de valoroasă ar fi funcționalitatea sa.
Conform discuțiilor cu utilizatorii Linux, fie că sunt purtate în persoană sau pe forumuri, comanda chroot este adesea percepută ca fiind complicată sau prea laborioasă pentru a fi configurată corect. Din păcate, acest instrument puternic nu este folosit la adevăratul său potențial.
Prin intermediul chroot, puteți iniția și rula programe sau shell-uri interactive, precum Bash, într-un sistem de fișiere protejat, care nu are voie să interacționeze cu sistemul de fișiere normal. Tot ceea ce se găsește în interiorul mediului chroot este autonom și izolat. Mediul chroot nu poate vedea dincolo de directorul său rădăcină, decât dacă se obțin privilegii de administrator. Această caracteristică a condus la denumirea de „închisoare chroot”. Trebuie menționat faptul că acest termen nu se referă la comanda jail din FreeBSD, care produce un mediu chroot mai sigur decât un mediu chroot obișnuit.
Vom demonstra o metodă facilă de a utiliza chroot, folosind comenzi Linux standard, compatibile cu majoritatea distribuțiilor. Deși unele distribuții, ca Ubuntu, oferă utilitare dedicate, cum ar fi debootstrap, ne vom concentra pe o metodă universală, independentă de distribuție.
Când este indicată folosirea chroot?
Un mediu chroot oferă funcționalități similare unei mașini virtuale, dar reprezintă o soluție mai ușoară. Nu necesită instalarea și configurarea unui hypervisor, cum ar fi VirtualBox sau Manager de mașini virtuale. Nici nu impune un nucleu separat; sistemul captiv folosește nucleul dumneavoastră existent.
În anumite privințe, mediile chroot sunt mai apropiate de containere, cum ar fi LXC, decât de mașinile virtuale. Sunt ușoare, rapid de implementat, iar crearea și activarea lor pot fi automatizate. La fel ca și containerele, un mod eficient de a le configura este de a instala strictul necesar pentru a satisface scopul dorit. „Necesarul” depinde de modul în care veți utiliza mediul chroot.
Iată câteva utilizări frecvente:
Dezvoltare și verificare software: Dezvoltatorii scriu cod, iar echipele de verificare a produsului (PV) îl testează. Uneori, PV descoperă erori care nu pot fi reproduse pe calculatorul dezvoltatorului. Mediul de lucru al dezvoltatorului conține numeroase instrumente și biblioteci, care lipsesc utilizatorului obișnuit și echipei PV. Astfel, un software nou, care rulează perfect pentru dezvoltator, dar nu și pentru alții, se dovedește a fi dependent de resurse existente doar pe computerul dezvoltatorului. Chroot permite dezvoltatorilor să creeze un mediu captiv pe propriul computer, în care să testeze software-ul înainte de a-l oferi echipelor PV. Mediul captiv poate fi configurat cu minimumul de dependențe necesare.
Diminuarea riscurilor în dezvoltare: Dezvoltatorul își poate configura un mediu dedicat, astfel încât eventualele probleme din cadrul acestuia să nu afecteze calculatorul principal.
Rularea software-ului învechit: Uneori, este necesară utilizarea unei versiuni vechi a unui anumit software. Dacă acesta are cerințe incompatibile cu versiunea curentă de Linux, un chroot poate rezolva problema.
Recuperarea și actualizarea sistemului de fișiere: Dacă o instalare Linux devine inoperabilă, chroot poate fi utilizat pentru a monta sistemul de fișiere deteriorat într-un punct de montare de pe un Live CD. Această metodă vă permite să lucrați în sistemul afectat și să încercați să-l reparați, ca și cum ar fi montat normal la rădăcina „/”. Astfel, căile către fișierele sistemului 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 prezentată în articolul care descrie migrarea sistemului de fișiere Linux de la ext2/ext3 la ext4.
Izolarea aplicațiilor: Rularea unui server FTP sau a altor servicii conectate la internet într-un mediu chroot reduce daunele pe care le-ar putea provoca un atac extern. Aceasta este o măsură importantă pentru consolidarea securității sistemului dumneavoastră.
Crearea unui mediu chroot
Vom începe prin crearea unui director care va funcționa ca rădăcină pentru mediul chroot. Pentru a ușura referirea la acesta, vom crea o variabilă care să stocheze numele directorului. În exemplul de mai jos, variabila va conține calea către directorul „testroot”. Nu este important dacă directorul există deja, îl vom crea în curând. Dacă directorul există, el trebuie să fie gol.
chr=/home/dave/testroot
Dacă directorul nu există, trebuie să-l creăm. Putem folosi următoarea comandă, care, prin intermediul opțiunii „-p”, se asigură că toate directoarele părinte lipsă sunt create în același timp:
mkdir -p $chr
Trebuie să creăm directoarele esențiale pentru componentele sistemului de operare de care va avea nevoie mediul chroot. Vom configura un mediu Linux minimalist, folosind Bash ca shell interactiv. Vom include, de asemenea, comenzile touch, rm și ls. Astfel, vom avea acces la toate comenzile încorporate ale lui Bash, și la touch, rm și ls. Vom putea crea, lista și șterge fișiere și vom putea utiliza Bash. Pentru acest exemplu, este tot ce ne trebuie.
Utilizăm expansiunea bretelelor pentru a lista directoarele pe care dorim să le creăm:
mkdir -p $chr/{bin,lib,lib64}
Acum, ne vom deplasa în interiorul noului director rădăcină:
cd $chr
Vom copia binarele necesare în mediul nostru Linux minimalist, din directorul obișnuit „/bin” în directorul „/bin” din interiorul chroot. Opțiunea „-v” (verbos) va face ca cp să ne arate acțiunile de copiere în timp ce le execută.
cp -v /bin/{bash,touch,ls,rm} $chr
Fișierele sunt copiate:
Aceste binare au dependențe. Trebuie să identificăm aceste dependențe și să le copiem și pe ele în mediul nostru, altfel bash, touch, rm și ls nu vor funcționa. Trebuie să facem acest lucru pe rând pentru fiecare dintre comenzile alese. Vom începe cu Bash. Comanda ldd ne va lista dependențele.
ldd /bin/bash
Dependențele sunt identificate și listate în terminal:
Trebuie să copiem aceste fișiere în noul nostru mediu. Selectarea manuală și copierea individuală a detaliilor din această listă ar fi consumatoare de timp și predispusă erorilor.
Din fericire, putem semi-automatiza procesul. Vom lista din nou dependențele, dar de această dată le vom stoca într-o listă. Apoi vom itera prin listă, copiind fișierele.
Folosim ldd pentru a lista dependențele și trimitem rezultatele printr-o conductă către egrep. Utilizarea lui egrep este echivalentă 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 cu liniile. Căutăm fișiere de bibliotecă ce 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ă, copiind fișierele rând pe rând. Folosim variabila „i” pentru a itera prin listă. Pentru fiecare element al listei, copiem fișierul în directorul rădăcină chroot, reprezentat de valoarea variabilei $chr.
Opțiunea „-v” (verbos) face ca cp să anunțe fiecare copiere pe măsură ce o realizează. Opțiunea „–parents” garantează că toate directoarele părinte lipsă sunt create în mediul chroot.
for i in $list; do cp -v --parents "$i" "${chr}"; done
Rezultatul este:
Vom folosi această tehnică pentru a captura dependențele fiecăreia dintre celelalte comenzi. Vom folosi, de asemenea, tehnica buclei pentru a efectua copierea efectivă. Singura modificare pe care trebuie să o facem este în comanda care adună dependențele.
Putem accesa comanda din istoricul comenzilor apăsând tasta săgeată sus de câteva ori și apoi editând-o. Comanda de copiere în buclă nu necesită nicio modificare.
Am folosit tasta săgeată sus pentru a găsi comanda și am modificat-o pentru a folosi „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
Și fișierele sunt copiate:
Putem edita linia de comandă pentru „ls”:
list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"
Din nou, vom folosi aceeași comandă buclă. Nu contează ce fișiere se află în listă; ea funcționează orbește, copiind fișierele pentru noi.
for i in $list; do cp -v --parents "$i" "${chr}"; done
Și dependențele pentru ls sunt copiate:
Edităm linia de comandă pentru ultima dată, pentru a funcționa pentru „rm”:
list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"
Folosim comanda de copiere în buclă pentru ultima dată:
for i in $list; do cp -v --parents "$i" "${chr}"; done
Ultimele dependențe sunt copiate în mediul nostru chroot. Acum suntem gata să folosim comanda chroot. Această comandă setează rădăcina mediului chroot și specifică aplicația care va rula 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 din interiorul mediului nostru.
Putem testa comenzile aduse în mediu.
ls
ls /home/dave/Documents
Comanda „ls” funcționează normal atunci când este folosită în mediu. Când încercăm să accesăm un director din afara mediului, comanda eșuează.
Putem folosi touch pentru a crea un fișier, ls pentru a-l lista și rm pentru a-l șterge.
touch sample_file.txt
ls
rm sample_file.txt
ls
Desigur, putem utiliza și comenzile încorporate oferite de shell-ul Bash. Dacă tastați „help” în linia de comandă, Bash le va lista pentru dumneavoastră.
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 interiorul mediului chroot.
Automatizare pentru confort
Dacă sunteți de părere că mediile chroot vă pot fi utile, dar configurația inițială este ușor intimidantă, amintiți-vă că puteți reduce efortul și riscul sarcinilor repetitive prin utilizarea aliasurilor, funcțiilor și scripturilor.