Jak používat příkaz chroot v systému Linux

Příkaz chroot vás může poslat do vězení, udržet vaše vývojové nebo testovací prostředí izolované nebo jen zlepšit zabezpečení vašeho systému. Ukážeme vám nejjednodušší způsob, jak jej použít.

Co je to chroot?

Pokud se pokusíte změřit užitečnost příkazu, musíte vzít v úvahu funkčnost, kterou poskytuje, a snadnost použití. Pokud je to pro lidi příliš komplikované nebo příliš zdlouhavé na to, aby to chtěli zkusit použít, funkce může být také nulová. Pokud jej nikdo nepoužívá, neposkytuje žádnou funkci.

V diskusích s uživateli Linuxu – osobně a na fórech – se zdá, že příkaz chroot je ten, který je považován za obtížně použitelný nebo příliš složitý a zdlouhavý na nastavení. Zdá se, že tento skvělý nástroj není využíván tak, jak by mohl být.

Pomocí chrootu můžete nastavit a spouštět programy nebo interaktivní shelly jako je Bash v zapouzdřeném souborovém systému, kterému je zabráněno v interakci s vaším běžným souborovým systémem. Vše v chrootovém prostředí je zapsáno a obsaženo. Nic v chrootovém prostředí nemůže vidět ven za svůj vlastní, speciální, kořenový adresář, aniž by eskalovalo na práva roota. To tomuto typu prostředí vyneslo přezdívku chroot jail. Termín „vězení“ by neměl být zaměňován s FreeBSD příkaz jail, který vytváří prostředí chroot to je bezpečnější než je obvyklé chroot prostředí.

Ale ve skutečnosti existuje velmi přímočarý způsob, jak používat chroot, který si projdeme. Používáme běžné linuxové příkazy, které budou fungovat na všech distribucích. Některé distribuce Linuxu mají vyhrazené nástroje pro nastavení chrootových prostředí, jako např debootstrap pro Ubuntu, ale my jsme zde distroagnostici.

Kdy byste měli použít chroot?

Prostředí chroot poskytuje funkcionalitu podobnou funkci virtuálního stroje, ale je to lehčí řešení. Captive systém nepotřebuje k instalaci a konfiguraci hypervizor, jako např VirtualBox nebo Správce virtuálních strojů. Ani nepotřebuje mít nainstalované jádro v kaptivním systému. Kaptivní systém sdílí vaše stávající jádro.

V některých smyslech se chroot prostředí blíží kontejnerům jako např LXC než na virtuální stroje. Jsou lehké, rychle se nasazují a jejich vytváření a spouštění lze automatizovat. Stejně jako kontejnery je jedním z pohodlných způsobů jejich konfigurace nainstalovat jen tolik operačního systému, abyste dosáhli toho, co je požadováno. Otázka „co je požadováno“ je zodpovězena tím, že se podíváte na to, jak budete používat své prostředí chroot.

Některá běžná použití jsou:

Vývoj softwaru a ověřování produktů. Vývojáři píší software a tým pro ověřování produktu (PV) jej testuje. Někdy PV zjistí problémy, které nelze replikovat na počítači vývojáře. Vývojář má na svém vývojovém počítači nainstalované nejrůznější nástroje a knihovny, které průměrný uživatel – a PV – mít nebude. Často se ukáže, že nový software, který funguje pro vývojáře, ale ne pro ostatní, používá zdroj na počítači vývojáře, který nebyl zahrnut do testovací verze softwaru. chroot umožňuje vývojářům mít na svém počítači jednoduché vanilkové prostředí, do kterého mohou namočit software, než jej dají PV. Kaptivní prostředí lze konfigurovat s minimálními závislostmi, které software vyžaduje.

Snížení rozvojového rizika. Vývojář může vytvořit vyhrazené vývojové prostředí, takže nic, co se v něm stane, nemůže pokazit jeho skutečný počítač.

Spuštění zastaralého softwaru. Někdy prostě musíte mít spuštěnou starou verzi něčeho. Pokud má starý software požadavky, které by kolidovaly nebo byly nekompatibilní s vaší verzí Linuxu, můžete chrootovat prostředí pro problémový software.

Obnova a upgrady souborového systému: Pokud se instalace Linuxu stane nefunkční, můžete použít chroot k připojení poškozeného souborového systému k bodu připojení na Live CD. To vám umožní pracovat v poškozeném systému a pokusit se jej opravit, jako by byl normálně připojen k root /. To znamená, že očekávané cesty k souborům v rámci poškozeného systému budou správně odkazovány z kořenového adresáře, nikoli z bodu připojení Live CD. Podobná technika byla použita v článku popisujícím, jak migrovat souborový systém Linux z ext2 nebo ext3 na ext4.

Ringfencing aplikace. Provozování FTP serveru nebo jiného zařízení připojeného k internetu v prostředí chroot omezuje škody, které může externí útočník způsobit. To může být cenným krokem k posílení zabezpečení vašeho systému.

Vytvoření chrootového prostředí

Potřebujeme adresář, který bude fungovat jako kořenový adresář prostředí chroot. Abychom měli zkrácený způsob odkazování na tento adresář, vytvoříme proměnnou a uložíme do ní název adresáře. Zde nastavujeme proměnnou pro uložení cesty k adresáři „testroot“. Nevadí, že tento adresář ještě neexistuje, brzy ho vytvoříme. Pokud adresář existuje, měl by být prázdný.

chr=/home/dave/testroot

Pokud adresář neexistuje, musíme jej vytvořit. Můžeme to udělat pomocí tohoto příkazu. Volba -p (rodiče) zajišťuje, že všechny chybějící nadřazené adresáře budou vytvořeny současně:

mkdir -p $chr

Musíme vytvořit adresáře pro uložení částí operačního systému, které naše chroot prostředí bude vyžadovat. Chystáme se nastavit minimalistické prostředí Linuxu, které používá Bash jako interaktivní shell. Zahrneme také příkazy touch, rm a ls. To nám umožní používat všechny vestavěné příkazy Bash a touch, rm a ls. Budeme moci vytvářet, vypisovat a odstraňovat soubory a používat Bash. A – v tomto jednoduchém příkladu – to je vše.

Seznam adresářů, které potřebujete vytvořit v rámci {} rozšíření rovnátka.

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

Nyní změníme adresář na náš nový kořenový adresář.

cd $chr

Pojďme si zkopírovat binární soubory, které potřebujeme v našem minimalistickém prostředí Linuxu, z vašeho běžného adresáře „/bin“ do našeho chrootového adresáře „/bin“. Volba -v (verbózní) způsobí, že nám cp řekne, co dělá, když provádí každou akci kopírování.

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

Soubory se nám zkopírují:

Tyto binární soubory budou mít závislosti. Musíme zjistit, co to je, a zkopírovat tyto soubory také do našeho prostředí, jinak bash, touch, rm a ls nebudou moci fungovat. Musíme to udělat postupně pro každý z námi zvolených příkazů. Nejdříve uděláme Bash. Příkaz ldd bude vypsat závislosti pro nás.

ldd /bin/bash

Závislosti jsou identifikovány a uvedeny v okně terminálu:

Tyto soubory musíme zkopírovat do našeho nového prostředí. Vybírání podrobností z tohoto seznamu a jejich kopírování po jednom bude časově náročné a náchylné k chybám.

Naštěstí to můžeme poloautomatizovat. Znovu uvedeme seznam závislostí a tentokrát vytvoříme seznam. Poté projdeme seznam a zkopírujeme soubory.

Zde používáme ldd k vypsání závislostí a vložení výsledků do egrep. Použití egrep je stejné jako použití grep s volbou -E (rozšířené regulární výrazy). Volba -o (pouze párování) omezuje výstup na odpovídající části řádků. Hledáme odpovídající soubory knihovny, které končí číslem [0-9].

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

Obsah seznamu můžeme zkontrolovat pomocí echo:

echo $list

Nyní, když máme seznam, můžeme jej procházet pomocí následující smyčky a kopírovat soubory jeden po druhém. Pro procházení seznamu používáme proměnnou i. Pro každého člena seznamu zkopírujeme soubor do našeho kořenového adresáře chroot, což je hodnota v $chr.

Volba -v (verbose) způsobí, že cp oznámí každou kopii, když ji provádí. Volba –parents zajišťuje, že všechny chybějící nadřazené adresáře budou vytvořeny v prostředí chroot.

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

pro i v $list;  do cp -v --parents

A toto je výstup:

Tuto techniku ​​použijeme k zachycení závislostí každého z ostatních příkazů. A k provedení skutečného kopírování použijeme techniku ​​smyčky. Dobrou zprávou je, že musíme provést pouze malou úpravu příkazu, který shromažďuje závislosti.

Příkaz můžeme získat z naší historie příkazů tak, že několikrát stiskneme klávesu Šipka nahoru a poté provedeme úpravy. Příkaz opakování kopírování se nemusí vůbec měnit.

Zde jsme k vyhledání příkazu použili klávesu Šipka nahoru a upravili jsme jej tak, aby místo bash řekl dotyk.

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

Nyní můžeme opakovat přesně stejný příkaz smyčky jako předtím:

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

pro i v $list;  do cp -v --parents

A naše soubory jsou pro nás zkopírovány:

Nyní můžeme upravit příkazový řádek seznamu pro ls:

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

Opět použijeme stejný příkaz loop. Nezáleží na tom, jaké soubory jsou v seznamu. Slepě funguje přes seznam kopírování souborů za nás.

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

pro i v $list;  do cp -v --parents

A závislosti pro ls se nám zkopírují:

Naposledy jsme upravili příkazový řádek seznamu, aby fungoval pro rm:

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

Naposledy použijeme příkaz opakování kopírování:

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

Poslední z našich závislostí se zkopírují do našeho chrootového prostředí. Konečně jsme připraveni použít příkaz chroot. Tento příkaz nastavuje kořen prostředí chroot a určuje, která aplikace se má spustit jako shell.

sudo chroot $chr /bin/bash

Naše chroot prostředí je nyní aktivní. Výzva okna terminálu se změnila a interaktivní shell je v našem prostředí ovládán bash shellem.

Můžeme si vyzkoušet příkazy, které jsme do prostředí přinesli.

ls
ls /home/dave/Documents

Příkaz ls funguje tak, jak bychom očekávali, když jej používáme v prostředí. Když se pokusíme o přístup k adresáři mimo prostředí, příkaz selže.

Můžeme použít dotyk k vytvoření souboru, ls k jeho zobrazení a rm k jeho odstranění.

touch sample_file.txt
ls
rm sample_file.txt
ls

Samozřejmě můžeme použít i vestavěné příkazy, které poskytuje shell Bash. Pokud na příkazovém řádku zadáte help, Bash vám je vypíše.

help

Chcete-li opustit prostředí chroot, použijte exit:

exit

Pokud chcete odstranit prostředí chroot, můžete jej jednoduše odstranit:

rm -r testroot/

Tím se rekurzivně odstraní soubory a adresáře v prostředí chroot.

Automatizace pro pohodlí

Pokud si myslíte, že by pro vás mohla být užitečná prostředí chroot, ale jejich nastavení je trochu nešikovné, pamatujte, že vždy můžete ubrat námahu a riziku opakujících se úkolů pomocí aliasů, funkcí a skriptů.