co je chroot Jail?
chroot v operačních systémech Unix je operace, která mění zdánlivý kořenový adresář pro aktuální běžící proces a jeho děti. Programy, které běží v tomto upraveném prostředí, nemají přístup k souborům mimo určený adresářový strom. To v podstatě omezuje jejich přístup k adresářovému stromu, a tak dostanou název „chroot jail“.
myšlenka je, že vytvoříte adresářový strom, kde zkopírujete nebo propojíte všechny systémové soubory potřebné pro spuštění procesu. Poté pomocí systémového volání chroot změníte kořenový adresář tak, aby byl na základně tohoto nového stromu, a spustíte proces běžící v tomto prostředí. Vzhledem k tomu, že ve skutečnosti nemůže odkazovat na cesty mimo upravený kořen, nemůže na tato místa škodlivě číst ani zapisovat.
proč je to nutné a jak se liší od virtuálních strojů?
jedná se o virtualizaci na úrovni operačního systému a často se používá místo virtuálních strojů k vytvoření více izolovaných instancí hostitelského OS. Jedná se o virtualizaci na úrovni jádra a nemá prakticky žádnou režii ve srovnání s virtuálními stroji, které jsou virtualizací aplikační vrstvy, a proto poskytuje velmi dobrou metodu pro vytváření více izolovaných instancí na stejném hardwaru. Virtuální stroj (VM) je softwarová implementace stroje a často využívají to, co je známé jako hardwarová virtualizace, k vykreslení virtuálních obrazů fungujícího operačního systému.
jak jej mohu použít?
základní příkaz pro vytvoření chroot jail je následující:
chroot /path/to/new/root command OR chroot /path/to/new/root /path/to/server OR chroot /path/to/new/root /path/to/server
Poznámka: Pouze root/privilegovaný uživatel může použít systémové volání chroot. Neprivilegovaný uživatel s přístupem k příkazu může obejít vězení chroot.
kroky k vytvoření mini-vězení pro příkaz‘ bash ‚a‘ ls ‚
1. Vytvořte adresář, který bude fungovat jako kořen příkazu.
$ mkdir jailed $ cd jailed
2. Vytvořte všechny základní adresáře pro spuštění příkazu: v závislosti na vašem operačním systému se mohou požadované adresáře změnit. Logicky vytváříme všechny tyto adresáře, abychom uchovávali kopii požadovaných knihoven. Chcete-li zjistit, jaké jsou všechny adresáře vyžadovány, viz krok 4.
$ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu
3.Spusťte příkaz „který“: Spusťte příkaz „který“ a vyhledejte umístění příkazu ls a bash. Po spuštění příkazu zkopírujte tyto binární soubory do adresáře “ bin “ našeho vězení. Ujistěte se, že nemáte žádný z těchto příkazů aliased. Od této chvíle bychom odkazovali na náš adresář jako „uvězněný“ adresář pro pohodlí.
$ unalias ls # Required only if you have aliased ls command $ unalias bash # Required only if you have aliased bash command $ cp $(which ls) ./bin/ $ cp $(which bash) ./bin/
4. Kopírovat příslušné knihovny / Objekty : aby spustitelné soubory v našem uvězněném adresáři fungovaly, musíme zkopírovat příslušné knihovny / Objekty v uvězněném adresáři. Ve výchozím nastavení se spustitelný soubor dívá na umístění začínající na ‚/‘. K nalezení závislostí použijeme příkaz ‚ldd‘
$ ldd $(which bash) linux-vdso.so.1 => (0x00007ffc75dd4000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000) /lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)
Spusťte následující příkazy a vytvořte příslušné adresáře.
$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/$ cp /lib64/ld-linux-x86-64.so.2 lib64/
podobně pro ls,
$ ldd $(which ls) linux-vdso.so.1 => (0x00007fff4f05d000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000) /lib64/ld-liux-x86-64.so.2 (0x000055e836c69000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/$ cp /lib64/ld-linux-x86-64.so.2 lib64/$ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/
konečná adresářová struktura musí být podobná této,
5. Sudo chroot: spusťte tento příkaz pro změnu kořenového adresáře do uvězněného adresáře spolu s cestou k shellu. Ve výchozím nastavení se pokusí načíst shell‘ /bin/sh‘.
$ cd .. $ sudo chroot jailed /bin/bash
při spuštění příkazu chroot můžete čelit této chybě,
chroot: failed to run command `/bin/bash': No such file or directory
to může být způsobeno 2 důvody, buď soubor neexistuje (což je zřejmé), nebo když načítání knihovny selže nebo není k dispozici. Zkontrolujte, zda jsou libary na správném místě.
6. Musí se objevit nová skořápka: je to náš uvězněný bash. V současné době máme nainstalovány pouze příkazy 2, bash a ls. Naštěstí cd a pwd jsou vestavěné příkazy v bash shellu, a tak je můžete také použít.
Toulejte se po adresáři, zkuste přistupovat k ‚cd /../ ‚nebo něco podobného. Pokuste se zlomit vězení, pravděpodobně nebudete moci. 🙂
k odchodu z vězení,
$ exit
nejdůležitější a nejzajímavější částí je, že při spuštění,
$ ps aux
a najděte proces, zjistíte, že existuje pouze jeden proces,
root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash
zajímavé je, že procesy v uvězněném shellu běží jako jednoduchý podřízený proces tohoto shellu. Všechny procesy uvnitř vězněného prostředí, jsou jen jednoduchý proces na uživatelské úrovni v hostitelském OS a jsou izolovány jmennými prostory poskytovanými jádrem, takže je zde minimální režie a jako další výhodu získáme izolaci.
kopii zde vysvětleného adresáře jailed-bash si můžete stáhnout zde.
podobně můžete do virtuálního vězněného prostředí přidat další příkazy. Chcete-li přidat složitější programy, možná budete muset vytvořit více adresářů, například ‚/proc‘ a ‚/dev‘. Ty zvyšují složitost procesu. Doufejme, že to pro náš účel nevyžadujeme.
to je vše, co potřebujete vědět o chrootu a uvěznění adresářů. Naším konečným cílem je pochopit, co jsou kontejnery a jak jsou služby jako AWS (Amazon Web Services), Google Cloud a Docker schopny poskytnout tolik virtuálních instancí operačních systémů na vyžádání. Také, jak sys-admin spustit více webových serverů pro více domén na jednom fyzickém počítači. To byl jen jeden krok k jeho pochopení 🙂
- https://help.ubuntu.com/community/DebootstrapChroot
- https://wiki.archlinux.org/index.php/Install_from_existing_Linux
- http://serverfault.com/questions/162362/chroot-fails-cannot-run-command-bin-bash-no-such-file-or-directory
- https://wiki.archlinux.org/index.php/change_root
o autorovi:
Pinkesh Badjatiya pochází z IIIT Hyderabad. Je to geek v srdci s dostatkem projektů, které stojí za to hledat. Jeho projektovou práci si můžete prohlédnout zde.
pokud si také přejete předvést svůj blog zde, viz GBlog pro psaní blogu pro hosty na GeeksforGeeks.