Příkaz chroot vám umožňuje vytvořit izolované prostředí, ať už pro vývoj, testování, nebo posílení zabezpečení systému. Podíváme se na jednoduchý postup, jak ho používat.
Co je vlastně chroot?
Pro posouzení užitečnosti příkazu je důležité zvážit jeho funkčnost a jednoduchost používání. Pokud je příkaz příliš složitý nebo časově náročný na nastavení, jeho funkčnost je značně omezená, protože jej uživatelé nebudou s oblibou používat.
Z diskuzí s uživateli Linuxu se zdá, že příkaz chroot je považován za náročný na obsluhu a konfiguraci. Tento užitečný nástroj tak není využíván v plném rozsahu jeho možností.
Díky chrootu lze nastavit a spouštět programy nebo interaktivní shelly, jako je Bash, v odděleném souborovém systému, který je izolován od vašeho hlavního systému. Vše v chrootovém prostředí je ohraničeno a nemůže interagovat s vnějším prostředím, aniž by získalo oprávnění roota. Proto se tomuto typu prostředí říká „chroot jail“ neboli „vězení“. Nemělo by se to však zaměňovat s příkazem FreeBSD jail, který vytváří bezpečnější chrootová prostředí.
Nicméně, existuje jednoduchý způsob, jak chroot používat, a my si ho ukážeme. Použijeme standardní linuxové příkazy, které fungují na všech distribucích. Některé distribuce mají speciální nástroje, jako debootstrap pro Ubuntu, ale my zde budeme postupovat obecně, nezávisle na konkrétní distribuci.
Kdy je vhodné používat chroot?
Chrootové prostředí nabízí podobnou funkci jako virtuální stroj, ale je to méně náročné řešení. Captive systém nepotřebuje ke své instalaci a konfiguraci hypervizor, jako VirtualBox nebo Správce virtuálních strojů. Navíc captive systém nemusí mít vlastní jádro, protože sdílí jádro s hostitelským systémem.
V jistém smyslu se chrootová prostředí více podobají kontejnerům, jako LXC, než virtuálním strojům. Jsou nenáročné, rychle se instalují a lze automatizovat jejich vytváření a spouštění. Stejně jako u kontejnerů, je efektivní instalovat jen nezbytné části operačního systému pro daný účel. Odpověď na otázku „co je nezbytné“ závisí na zamýšleném použití chrootového prostředí.
Mezi častá použití patří:
Vývoj a testování softwaru: Vývojáři vytváří software a testovací týmy (PV) ho ověřují. Občas PV objeví problémy, které vývojář nedokáže replikovat na svém počítači. Vývojář má totiž na svém stroji instalovány různé nástroje a knihovny, které běžný uživatel (a testovací tým) nemá. Proto se stává, že software, který funguje u vývojáře, ale ne u ostatních, používá zdroj, který není součástí testovací verze. Chroot umožňuje vývojářům mít čisté, minimalizované prostředí pro testování, než software předají testovacímu týmu. Lze nastavit captive prostředí s minimálními závislostmi.
Snížení rizik při vývoji: Vývojář si může vytvořit dedikované vývojové prostředí, které nemůže poškodit jeho skutečný počítač.
Spouštění staršího softwaru: Občas je potřeba spustit starší verzi softwaru. Pokud má tento software požadavky, které by kolidovaly s vaším systémem, můžete pro něj vytvořit chrootové prostředí.
Obnova a upgrade souborového systému: Pokud se instalace Linuxu stane nefunkční, lze pomocí chrootu připojit poškozený souborový systém k bodu připojení na Live CD. Díky tomu můžete pracovat s poškozeným systémem tak, jako by byl připojen jako root (/). To znamená, že cesty k souborům v poškozeném systému budou odkazovány správně z kořenového adresáře, a ne z bodu připojení Live CD. Podobná technika byla použita v článku o migraci z ext2/ext3 na ext4.
Zabezpečení aplikací: Provozování FTP serveru nebo jiné internetové služby v chrootovém prostředí snižuje škody, které může způsobit externí útočník. Může to být efektivní způsob posílení zabezpečení vašeho systému.
Vytvoření chrootového prostředí
Potřebujeme adresář, který bude sloužit jako kořenový adresář pro naše chrootové prostředí. Pro usnadnění odkazování vytvoříme proměnnou, do které uložíme cestu k tomuto adresáři. V našem příkladě nastavíme proměnnou pro uložení cesty k adresáři „testroot“. I když tento adresář ještě neexistuje, brzy ho vytvoříme. Pokud již existuje, měl by být prázdný.
chr=/home/dave/testroot
Pokud adresář neexistuje, je třeba ho vytvořit. To lze provést následujícím příkazem. Volba -p zajistí, že se současně vytvoří i všechny neexistující nadřazené adresáře:
mkdir -p $chr
Nyní musíme vytvořit adresáře pro uložení částí operačního systému, které bude naše chrootové prostředí vyžadovat. Vytvoříme 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 také touch, rm a ls. Budeme moci vytvářet, vypisovat a mazat soubory a používat Bash. V tomto jednoduchém příkladu nám to bude stačit.
Adresáře potřebné vytvořit jsou uvedeny v následujícím příkazu, který využívá rozšíření složených závorek.
mkdir -p $chr/{bin,lib,lib64}
Následně se přesuneme do našeho nově vytvořeného kořenového adresáře:
cd $chr
Nyní zkopírujeme binární soubory, které potřebujeme pro naše minimalistické prostředí, z vašeho běžného adresáře „/bin“ do našeho chrootového adresáře „/bin“. Volba -v (verbose) zajistí, že příkaz cp bude vypisovat akce při kopírování.
cp -v /bin/{bash,touch,ls,rm} $chr
Soubory se nám zkopírují:
Tyto binární soubory mají závislosti. Musíme zjistit, jaké to jsou, a zkopírovat i tyto soubory, jinak bash, touch, rm a ls nebudou fungovat. Musíme to udělat pro každý z námi vybraných příkazů. Začneme s Bashem. Příkaz ldd zobrazí jeho závislosti.
ldd /bin/bash
Závislosti se vypíší v terminálu:
Tyto soubory je třeba zkopírovat do našeho nového prostředí. Ruční vybírání a kopírování by bylo zdlouhavé a náchylné k chybám.
Naštěstí to můžeme poloautomatizovat. Znovu zobrazíme seznam závislostí, ale tentokrát z něj vytvoříme seznam, kterým následně projdeme a soubory zkopírujeme.
Zde používáme ldd k vypsání závislostí a výstup posíláme do příkazu egrep. Použití egrep je stejné jako grep s volbou -E (rozšířené regulární výrazy). Volba -o (pouze shoda) omezí výstup na odpovídající části řádků. Hledáme odpovídající soubory knihoven končící číslicí [0-9].
list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"
Obsah seznamu můžeme zkontrolovat pomocí echo:
echo $list
Nyní máme seznam a můžeme jím procházet pomocí následujícího cyklu a kopírovat soubory jeden po druhém. Pro procházení seznamu používáme proměnnou „i“. Pro každý prvek seznamu zkopírujeme soubor do našeho kořenového chroot adresáře, který je uložen v proměnné $chr.
Volba -v (verbose) zajistí, že příkaz cp vypíše každý kopírovaný soubor. Volba –parents zajistí, že všechny chybějící nadřazené adresáře budou vytvořeny v chrootovém prostředí.
for i in $list; do cp -v --parents "$i" "${chr}"; done
Výstup je následující:
Tuto techniku použijeme pro zjištění závislostí každého z ostatních příkazů a následné kopírování. Dobrou zprávou je, že musíme provést jen malou úpravu příkazu, který zjišťuje závislosti.
Příkaz můžeme získat z historie příkazů pomocí opakovaného stisknutí klávesy Šipka nahoru a následné úpravy. Příkaz kopírovacího cyklu se nemusí měnit vůbec.
Zde jsme pomocí klávesy Šipka nahoru nalezli příkaz a upravili ho tak, aby místo „bash“ hledal závislosti pro „touch“.
list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"
Nyní můžeme opakovat přesně stejný cyklus jako předtím:
for i in $list; do cp -v --parents "$i" "${chr}"; done
A soubory se nám zkopírují:
Nyní upravíme příkaz pro „ls“:
list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"
Opět použijeme stejný příkaz cyklu. Nezáleží na tom, jaké soubory jsou v seznamu. Příkaz bez ohledu na to soubory zkopíruje.
for i in $list; do cp -v --parents "$i" "${chr}"; done
A závislosti pro „ls“ se nám zkopírují:
Naposledy upravíme příkaz pro „rm“:
list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"
A naposledy použijeme příkaz kopírovacího cyklu:
for i in $list; do cp -v --parents "$i" "${chr}"; done
Poslední závislosti se zkopírují do našeho chrootového prostředí. Nyní jsme konečně připraveni použít příkaz chroot. Tento příkaz nastaví kořen prostředí chroot a určí, která aplikace se má spustit jako shell.
sudo chroot $chr /bin/bash
Naše chrootové prostředí je nyní aktivní. Výzva terminálu se změnila a náš shell je ovládán Bashem v našem novém prostředí.
Nyní můžeme vyzkoušet příkazy, které jsme do prostředí přidali.
ls
ls /home/dave/Documents
Příkaz ls funguje, jak jsme očekávali. Pokud se pokusíme přistoupit k adresáři mimo prostředí, příkaz selže.
Pomocí „touch“ můžeme vytvořit soubor, pomocí „ls“ jej zobrazit a pomocí „rm“ odstranit.
touch sample_file.txt
ls
rm sample_file.txt
ls
Samozřejmě můžeme používat i vestavěné příkazy, které Bash poskytuje. Pokud zadáte na příkazovém řádku „help“, Bash vám je vypíše.
help
Chcete-li opustit chrootové prostředí, použijte příkaz „exit“:
exit
Pokud chcete odstranit chrootové prostředí, jednoduše ho můžete smazat:
rm -r testroot/
Tímto se rekurzivně odstraní soubory a adresáře v chrootovém prostředí.
Automatizace pro vaše pohodlí
Pokud si myslíte, že by pro vás chrootová prostředí mohla být užitečná, ale jejich nastavení je trochu zdlouhavé, nezapomeňte, že můžete vždy snížit pracnost opakujících se úkolů pomocí aliasů, funkcí a skriptů.