A chroot parancs használata Linuxon

A chroot paranccsal börtönbe kerülhet, elszigetelheti a fejlesztői vagy tesztkörnyezetet, vagy éppen javíthatja a rendszer biztonságát. Mutatjuk a használatának legegyszerűbb módját.

Mi az a chroot?

Ha egy parancs hasznosságát próbálja mérni, akkor figyelembe kell vennie az általa nyújtott funkcionalitást és a könnyű használhatóságot. Ha túl bonyolult az emberek számára, vagy túl elhúzódó ahhoz, hogy megpróbálják használni, akkor a funkcionalitás akár nulla is lehet. Ha senki nem használja, akkor semmilyen funkciót nem biztosít.

A Linux-felhasználókkal folytatott megbeszélések során – személyesen és fórumokon – úgy tűnik, hogy a chroot parancs nehezen használható, vagy túl ravasz és unalmas a beállításhoz. Úgy tűnik, ezt a nagyszerű segédprogramot nem használják annyira, mint amennyire lehetne.

A chroot segítségével beállíthatod és programokat vagy interaktív parancsértelmezőket futtatni például a Bash egy beágyazott fájlrendszerben, amely nem tud együttműködni a normál fájlrendszerrel. A chroot környezetben minden benne van és be van zárva. A chroot környezetben semmi sem tud túllépni saját, speciális gyökérkönyvtárán anélkül, hogy a root jogosultságra ne torkolljon. Ez kiérdemelte az ilyen típusú környezetet a chroot börtön becenevével. A „börtön” kifejezést nem szabad összetéveszteni FreeBSD-k jail parancs, amely chroot környezetet hoz létre az biztosabb mint a szokásos chroot környezet.

De valójában van egy nagyon egyszerű módja a chroot használatának, amelyen keresztül fogunk lépni. Szokásos Linux-parancsokat használunk, amelyek minden disztribúción működni fognak. Egyes Linux disztribúciók dedikált eszközökkel rendelkeznek a chroot környezetek beállítására, mint pl debootstrap az Ubuntu számára, de mi itt disztro-agnosztikusak vagyunk.

Mikor érdemes chrootot használni?

A chroot környezet a virtuális gépekhez hasonló funkcionalitást biztosít, de könnyebb megoldás. A captive rendszernek nincs szüksége hipervizorra a telepítéshez és konfiguráláshoz, mint pl VirtualBox vagy Virtuálisgép-kezelő. Nem szükséges, hogy kernel legyen telepítve a captive rendszerben. A captive rendszer megosztja a meglévő kernelt.

Bizonyos értelemben a chroot környezetek közelebb állnak az olyan konténerekhez, mint pl évi LXC mint a virtuális gépekre. Könnyűek, gyorsan telepíthetők, létrehozásuk és beindításuk automatizálható. A konténerekhez hasonlóan a konfigurálásuk egyik kényelmes módja az, hogy csak annyi operációs rendszert telepít, amennyi szükséges ahhoz, hogy elérje a szükséges lépéseket. A „mi szükséges” kérdésre úgy válaszolunk, hogy megnézzük, hogyan fogja használni a chroot környezetét.

  Mi történik pontosan, ha leállítja vagy kijelentkezik a Windowsból?

Néhány gyakori felhasználás:

Szoftverfejlesztés és termékellenőrzés. A fejlesztők szoftvereket írnak, és a termékellenőrző csapat (PV) teszteli azt. Néha a PV olyan problémákat talál, amelyek nem replikálhatók a fejlesztő számítógépén. A fejlesztő mindenféle eszközt és könyvtárat telepített a fejlesztői számítógépére, amivel az átlagos felhasználó – és a PV – nem fog rendelkezni. Gyakran kiderül, hogy az új szoftverek, amelyek a fejlesztőnek működnek, de másoknak nem, olyan erőforrást használnak a fejlesztő számítógépén, amely nem szerepelt a szoftver tesztkiadásában. A chroot lehetővé teszi a fejlesztők számára, hogy egy sima vanilla captive környezetet hozzanak létre a számítógépükön, amibe belemárthatják a szoftvert, mielőtt a PV-nek adnák. A rögzített környezet a szoftver által megkívánt minimális függőséggel konfigurálható.

A fejlesztési kockázat csökkentése. A fejlesztő létrehozhat egy dedikált fejlesztői környezetet, hogy semmi, ami benne történik, ne rontsa el a tényleges számítógépét.

Elavult szoftver futtatása. Néha csak egy régi verziónak kell futnia valaminek. Ha a régi szoftvernek olyan követelményei vannak, amelyek ütköznének vagy nem kompatibilisek az Ön Linux-verziójával, chrootolhat egy környezetet a problémás szoftver számára.

Helyreállítás és fájlrendszer-frissítések: Ha egy Linux-telepítés működésképtelenné válik, a chroot segítségével csatlakoztathatja a sérült fájlrendszert a Live CD-n lévő csatolási ponthoz. Ez lehetővé teszi, hogy a sérült rendszerben dolgozzon, és megpróbálja megjavítani, mintha a rendszer normál esetben a gyökérben lenne felszerelve. Ez azt jelenti, hogy a sérült rendszeren belüli várt fájlútvonalak a gyökérkönyvtárból fognak megfelelően hivatkozni, nem pedig a Live CD beillesztési pontjáról. Hasonló technikát alkalmaztak a Linux fájlrendszer ext2-ről vagy ext3-ról ext4-re való migrálását ismertető cikkben is.

Ringfencing alkalmazások. Egy FTP-kiszolgáló vagy más, internethez kapcsolódó eszköz chroot környezetben történő futtatása korlátozza a külső támadók által okozott károkat. Ez értékes lépés lehet a rendszer biztonságának megerősítésében.

Chroot környezet létrehozása

Szükségünk van egy könyvtárra, amely a chroot környezet gyökérkönyvtáraként működik. Annak érdekében, hogy röviden hivatkozhassunk arra a könyvtárra, létrehozunk egy változót, és eltároljuk benne a könyvtár nevét. Itt beállítunk egy változót a „testroot” könyvtár elérési útjának tárolására. Nem számít, ha ez a könyvtár még nem létezik, hamarosan elkészítjük. Ha a könyvtár létezik, akkor üresnek kell lennie.

chr=/home/dave/testroot

Ha a könyvtár nem létezik, létre kell hoznunk. Ezt ezzel a paranccsal tehetjük meg. A -p (parents) opció biztosítja, hogy a hiányzó szülőkönyvtárak egyidejűleg létrejöjjenek:

mkdir -p $chr

Könyvtárakat kell létrehoznunk az operációs rendszer azon részeihez, amelyekre a chroot környezetünknek szüksége lesz. Egy minimalista Linux-környezetet fogunk létrehozni, amely a Bash-t használja interaktív shellként. Tartalmazzuk a touch, rm és ls parancsokat is. Ez lehetővé teszi számunkra a Bash összes beépített parancsának, valamint a touch, rm és ls használatát. Létrehozhatunk, listázhatunk és eltávolíthatunk fájlokat, és használhatjuk a Bash-t. És – ebben az egyszerű példában – ennyi.

  Hogyan hozzunk létre több helyet egy iPhone vagy iPad frissítés számára

Sorolja fel a létrehozandó könyvtárakat a következőn belül: {} merevítő bővítése.

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

Most megváltoztatjuk a könyvtárat az új gyökérkönyvtárunkra.

cd $chr

Másoljuk át a minimalista Linux-környezetünkben szükséges bináris fájlokat a szokásos „/bin” könyvtárból a chroot „/bin” könyvtárunkba. A -v (verbose) opció arra készteti a cp-t, hogy elmondja nekünk, mit csinál, miközben minden másolási műveletet végrehajt.

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

A fájlok be vannak másolva nekünk:

Ezeknek a binárisoknak függőségeik lesznek. Fel kell fedeznünk, hogy mik ezek, és ezeket a fájlokat is be kell másolnunk a környezetünkbe, különben a bash, touch, rm és ls nem fog működni. Ezt felváltva kell megtennünk minden egyes kiválasztott parancsnál. Először megcsináljuk a Basht. Az ldd parancs fogja sorolja fel a függőségeket nekünk.

ldd /bin/bash

A függőségek azonosítása és felsorolása a terminál ablakban történik:

Ezeket a fájlokat át kell másolnunk az új környezetünkbe. A részletek kiemelése a listából és egyenként másolása időigényes és hibás lesz.

Szerencsére félig automatizálhatjuk. Újra felsoroljuk a függőségeket, és ezúttal egy listát készítünk. Ezután végigpörgetjük a listát a fájlok másolásával.

Itt az ldd-t használjuk a függőségek felsorolására, és az eredményeket egy csövön keresztül az egrepbe továbbítjuk. Az egrep használata ugyanaz, mint a grep használata a -E (bővített reguláris kifejezések) opcióval. Az -o (only matching) opció a kimenetet a sorok egyező részeire korlátozza. Egyező könyvtári fájlokat keresünk, amelyek számra végződnek [0-9].

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

A lista tartalmát az echo segítségével ellenőrizhetjük:

echo $list

Most, hogy megvan a lista, a következő ciklussal léphetünk át rajta, a fájlokat egyenként másoljuk. Az i változót használjuk a listán való lépéshez. A lista minden egyes tagjához bemásoljuk a fájlt a chroot gyökérkönyvtárunkba, amely a $chr-ben tárolt érték.

A -v (bőbeszédű) kapcsoló hatására a cp minden másolatot bejelent, amikor azt végrehajtja. A –parents beállítás biztosítja, hogy a hiányzó szülőkönyvtárak létrejöjjenek a chroot környezetben.

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

for i in $list;  do cp -v --parents

És ez a kimenet:

Ezt a technikát fogjuk használni a többi parancs függőségének rögzítésére. És a hurok technikát fogjuk használni a tényleges másoláshoz. A jó hír az, hogy csak egy apró szerkesztést kell végrehajtanunk a függőségeket összegyűjtő parancson.

  A root SSH bejelentkezés engedélyezése Linuxon

A parancsot a parancselőzményeinkből a felfelé mutató nyíl gomb néhányszori megnyomásával kérhetjük le, majd végezzük el a szerkesztést. A looping copy parancsot egyáltalán nem kell módosítani.

Itt a felfelé mutató nyíl billentyűvel kerestük meg a parancsot, és úgy szerkesztettük, hogy a bash helyett érintés legyen.

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

Most megismételhetjük ugyanazt a ciklusparancsot, mint korábban:

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

for i in $list;  do cp -v --parents

És a fájljainkat átmásolják nekünk:

Most már szerkeszthetjük az ls lista parancssorát:

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

Ismét ugyanazt a ciklusparancsot fogjuk használni. Nem mindegy, hogy milyen fájlok vannak a listán. Vakon átmegy a listán, átmásolja nekünk a fájlokat.

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

for i in $list;  do cp -v --parents

És az ls függőségeit átmásoljuk nekünk:

Utoljára szerkesztjük a list parancssort, így működik az rm:

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

Utoljára a looping copy parancsot használjuk:

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

Az utolsó függőségünk a chroot környezetünkbe másolódik. Végre készen állunk a chroot parancs használatára. Ez a parancs beállítja a chroot környezet gyökerét, és meghatározza, hogy melyik alkalmazás fut héjként.

sudo chroot $chr /bin/bash

A chroot környezetünk most aktív. A terminál ablak parancssora megváltozott, és az interaktív shellt a bash shell kezeli a környezetünkben.

Kipróbálhatjuk azokat a parancsokat, amelyeket a környezetbe vittünk.

ls
ls /home/dave/Documents

Az ls parancs úgy működik, ahogyan azt várnánk, amikor a környezetben használjuk. Amikor a környezeten kívüli könyvtárhoz próbálunk hozzáférni, a parancs meghiúsul.

A touch gombbal létrehozhatunk egy fájlt, az ls-t listázhatjuk, az rm-t pedig az eltávolításhoz.

touch sample_file.txt
ls
rm sample_file.txt
ls

Természetesen használhatjuk a Bash shell által biztosított beépített parancsokat is. Ha beírja a help parancsot a parancssorba, a Bash felsorolja azokat.

help

Használja az exit gombot a chroot környezet elhagyásához:

exit

Ha el szeretné távolítani a chroot környezetet, egyszerűen törölheti:

rm -r testroot/

Ez rekurzív módon törli a fájlokat és könyvtárakat a chroot környezetben.

Automatizálás a kényelem érdekében

Ha úgy gondolja, hogy a chroot környezetek hasznosak lehetnek az Ön számára, de kissé körülményes a beállításuk, ne feledje, hogy álnevek, függvények és szkriptek használatával mindig eltávolíthatja az ismétlődő feladatokból adódó feszültséget és kockázatot.