Како користити команду цхроот на Линуку

Komanda chroot može vas prebaciti u zatvoreno okruženje, omogućiti da vaše razvojno ili testno okruženje ostane izolovano, ili jednostavno poboljšati sigurnost vašeg sistema. Pokazaćemo vam najjednostavniji način da je koristite.

Šta je chroot?

Kada procenjujemo korisnost neke komande, moramo uzeti u obzir funkcionalnost koju ona nudi, kao i lakoću upotrebe. Ako je previše komplikovana za korišćenje ili oduzima previše vremena za podešavanje, njena funkcionalnost može biti zanemarljiva. Ako je niko ne koristi, ona ne pruža nikakvu funkcionalnost.

U razgovorima sa korisnicima Linuxa, čini se da se komanda chroot smatra teškom za upotrebu ili previše složenom i zamornom za konfigurisanje. Čini se da se ovaj sjajan uslužni program ne koristi onoliko koliko bi mogao.

Uz chroot, možete postaviti i pokrenuti programe ili interaktivne ljuske, kao što je Bash, u zatvorenom sistemu datoteka kojem je onemogućena interakcija sa vašim redovnim sistemom datoteka. Sve unutar chroot okruženja je ograničeno i sadržano. Ništa u chroot okruženju ne može videti dalje od svog posebnog, korenskog direktorijuma, osim uz eskalaciju na root privilegije. Zbog toga se ovo okruženje naziva „chroot zatvor“. Izraz „zatvor“ ne treba mešati sa FreeBSD naredbom jail, koja kreira chroot okruženje koje je sigurnije od uobičajenog chroot okruženja.

Međutim, postoji vrlo jednostavan način korišćenja chroot, koji ćemo objasniti. Koristimo standardne Linux komande koje funkcionišu na svim distribucijama. Neke Linux distribucije imaju namenske alate za podešavanje chroot okruženja, poput debootstrap za Ubuntu, ali mi ovde pristupamo distros-agnostički.

Kada treba koristiti chroot?

chroot okruženje pruža sličnu funkcionalnost kao virtuelna mašina, ali je jednostavnije rešenje. Zatvoreni sistem ne zahteva hipervizor za instalaciju i konfiguraciju, kao što su VirtualBox ili Virt-Manager. Takođe, ne mora imati instaliran sopstveni kernel. Zatvoreni sistem deli vaš postojeći kernel.

U nekom smislu, chroot okruženja su bliža kontejnerima, kao što je LXC, nego virtuelnim mašinama. Oni su lagani, brzo se postavljaju, a kreiranje i pokretanje se može automatizovati. Slično kontejnerima, praktičan način da ih konfigurišete je da instalirate dovoljno operativnog sistema da biste postigli željeni cilj. Na pitanje „šta je potrebno“ odgovara se gledanjem kako planirate koristiti vaše chroot okruženje.

Neke od uobičajenih upotreba su:

Razvoj softvera i validacija proizvoda. Programeri pišu softver, a tim za validaciju proizvoda (PV) ga testira. Ponekad PV pronađe probleme koji se ne mogu ponoviti na računaru programera. Programer ima razne alate i biblioteke instalirane na svom razvojnom računaru, koje prosečan korisnik – a ni PV – neće imati. Često se ispostavi da novi softver koji radi za programera, ali ne i za druge, koristi resurs na programerovom računaru koji nije uključen u probnu verziju softvera. chroot omogućava programerima da imaju jednostavno, „vanila“ okruženje na svom računaru, u koje mogu uroniti softver pre nego što ga daju PV-u. Zatvoreno okruženje se može konfigurisati sa minimalnim zavisnostima koje softver zahteva.

Smanjenje rizika razvoja. Programer može kreirati namensko razvojno okruženje tako da ništa što se dešava unutar njega ne može naštetiti njegovom pravom računaru.

Pokretanje zastarelog softvera. Ponekad je jednostavno potrebno imati staru verziju nečega. Ako stari softver ima zahteve koji su u suprotnosti ili nisu kompatibilni sa vašom verzijom Linuxa, možete koristiti chroot za problematični softver.

Oporavak i nadogradnja sistema datoteka. Ako Linux instalacija postane nefunkcionalna, možete koristiti chroot za montiranje oštećenog sistema datoteka na tačku montiranja na Live CD-u. To vam omogućava da radite u oštećenom sistemu i pokušate da ga popravite, kao da je normalno montiran u root /. To znači da će očekivane putanje datoteka unutar oštećenog sistema biti ispravno referencirane iz korenskog direktorijuma, a ne iz tačke montiranja Live CD-a. Slična tehnika je korišćena u članku koji opisuje kako migrirati Linux sistem datoteka sa ext2 ili ext3 na ext4.

Zaštita aplikacija. Pokretanje FTP servera ili drugog uređaja povezanog na internet unutar chroot okruženja ograničava štetu koju spoljni napadač može napraviti. Ovo može biti vredan korak u jačanju sigurnosti vašeg sistema.

Kreiranje chroot okruženja

Potreban nam je direktorijum koji će služiti kao osnovni direktorijum chroot okruženja. Da bismo imali jednostavan način upućivanja na taj direktorijum, kreiraćemo promenljivu i u nju sačuvati ime direktorijuma. Ovde postavljamo promenljivu za čuvanje putanje do „testroot“ direktorijuma. Nije bitno ako ovaj direktorijum još uvek ne postoji, uskoro ćemo ga napraviti. Ako direktorijum postoji, trebalo bi da bude prazan.

chr=/home/dave/testroot

Ako direktorijum ne postoji, moramo ga kreirati. Ovo možemo da uradimo sa ovom komandom. Opcija -p (roditelji) osigurava da se svi nedostajući roditeljski direktorijumi kreiraju u isto vreme:

mkdir -p $chr

Moramo kreirati direktorijume za smeštaj delova operativnog sistema koje će naše chroot okruženje zahtevati. Postavićemo minimalističko Linux okruženje koje koristi Bash kao interaktivnu ljusku. Takođe ćemo uključiti komande touch, rm i ls. To će nam omogućiti da koristimo sve Bash-ove ugrađene komande i touch, rm i ls. Moći ćemo da kreiramo, navodimo i uklanjamo datoteke, kao i da koristimo Bash. I – u ovom jednostavnom primeru – to je sve.

Navedite direktorijume koje treba kreirati u okviru {} proširenja vitičastih zagrada.

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

Sada ćemo promeniti trenutni direktorijum u naš novi osnovni direktorijum.

cd $chr

Kopirajmo binarne datoteke koje su nam potrebne u našem minimalističkom Linux okruženju iz vašeg redovnog „/bin“ direktorijuma u naš chroot „/bin“ direktorijum. Opcija -v (verbose) čini da nam cp kaže šta radi dok izvršava svaku radnju kopiranja.

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

Datoteke se kopiraju za nas:

Ovi binarni fajlovi imaju zavisnosti. Moramo otkriti koje su one i kopirati te datoteke u naše okruženje, inače bash, touch, rm i ls neće moći da funkcionišu. Ovo treba uraditi za svaku od izabranih komandi. Prvo ćemo to uraditi za Bash. Komanda ldd će navesti zavisnosti za nas.

ldd /bin/bash

Zavisnosti su identifikovane i navedene u terminalu:

Moramo kopirati ove datoteke u naše novo okruženje. Ručno izdvajanje i kopiranje svake datoteke iz ovog spiska bi bilo dugotrajno i podložno greškama.

Srećom, možemo to poluautomatizovati. Ponovo ćemo navesti zavisnosti, ali ovaj put ćemo formirati listu. Zatim ćemo proći kroz listu kopirajući datoteke.

Ovde koristimo ldd da navedemo zavisnosti i prosledimo rezultate kroz cev u egrep. Korišćenje egrep-a je isto kao i korišćenje grep-a sa opcijom -E (prošireni regularni izrazi). Opcija -o (samo podudaranje) ograničava izlaz na delove linija koji se poklapaju. Tražimo odgovarajuće datoteke biblioteka koje se završavaju brojem [0-9].

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

Možemo da proverimo sadržaj liste pomoću echo:

echo $list

Sada kada imamo listu, možemo da je pređemo pomoću sledeće petlje, kopirajući datoteke jednu po jednu. Koristimo promenljivu i za kretanje kroz listu. Za svaki element liste kopiramo datoteku u naš chroot osnovni direktorijum, čija je vrednost smeštena u $chr.

Opcija -v (verbose) čini da cp najavljuje svaku kopiju dok je izvodi. Opcija --parents osigurava da se kreiraju svi nedostajući roditeljski direktorijumi u chroot okruženju.

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

A ovo je izlaz:

Koristićemo istu tehniku za pronalaženje zavisnosti svake druge komande. I takođe ćemo koristiti tehniku petlje za izvršavanje stvarnog kopiranja. Dobra vest je da moramo samo malo da izmenimo komandu koja prikuplja zavisnosti.

Komandu možemo da preuzmemo iz naše istorije komandi, pritiskom na taster strelice nagore nekoliko puta, a zatim da izvršimo izmene. Komanda za kopiranje u petlji uopšte ne mora da se menja.

Ovde smo koristili taster strelice nagore da pronađemo komandu i izmenili je da kaže touch umesto bash.

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

Sada možemo ponoviti potpuno istu komandu petlje kao i ranije:

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

I naše datoteke se kopiraju za nas:

Sada možemo izmeniti liniju komande liste za ls:

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

Opet, koristićemo istu komandu petlje. Nije bitno koje su datoteke na listi. Ona slepo prolazi kroz listu kopirajući datoteke za nas.

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

I zavisnosti za ls su kopirane za nas:

Menjamo liniju komande liste poslednji put, čineći je da radi za rm:

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

Poslednji put koristimo komandu za kopiranje u petlji:

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

Naše poslednje zavisnosti se kopiraju u naše chroot okruženje. Konačno smo spremni da koristimo komandu chroot. Ova komanda postavlja koren chroot okruženja i određuje koju aplikaciju treba pokrenuti kao ljusku.

sudo chroot $chr /bin/bash

Naše chroot okruženje je sada aktivno. Prompt terminala se promenio, a interaktivnom ljuskom rukuje bash shell u našem okruženju.

Možemo isprobati komande koje smo uneli u okruženje.

ls
ls /home/dave/Documents

Komanda ls funkcioniše onako kako bismo očekivali kada je koristimo u okruženju. Kada pokušamo da pristupimo direktorijumu izvan okruženja, komanda ne uspeva.

Možemo koristiti touch da kreiramo datoteku, ls da je navedemo, i rm da je uklonimo.

touch sample_file.txt
ls
rm sample_file.txt
ls

Naravno, možemo koristiti i ugrađene komande koje pruža Bash ljuska. Ako unesete help u komandnu liniju, Bash će ih navesti za vas.

help

Koristite exit da napustite chroot okruženje:

exit

Ako želite da uklonite chroot okruženje, možete ga jednostavno izbrisati:

rm -r testroot/

Ovo će rekurzivno izbrisati datoteke i direktorijume u chroot okruženju.

Automatizujte za udobnost

Ako mislite da bi vam chroot okruženja mogla biti korisna, ali su pomalo nezgodna za podešavanje, zapamtite da uvek možete preuzeti opterećenje i rizik od ponavljajućih zadataka koristeći pseudonime, funkcije i skripte.