GNU/Linux >> Znalost Linux >  >> Linux

Jak provést Chroot s jmennými prostory Linuxu?

Po přečtení o jmenných prostorech Linuxu jsem měl dojem, že jsou, mezi mnoha dalšími funkcemi, alternativou k chrootu. Například v tomto článku:

Mezi další použití [jmenných prostorů] patří […] izolace procesu ve stylu chroot() do části hierarchie jednoho adresáře.

Když však naklonuji jmenný prostor mount, například pomocí následujícího příkazu, stále vidím celý původní kořenový strom.

unshare --mount -- /bin/bash

Chápu, že jsem nyní schopen provádět další připojení v novém jmenném prostoru, která nejsou sdílena s původním jmenným prostorem, což poskytuje izolaci, ale stále je to stejný kořen, např. /etc je stále stejný pro oba jmenné prostory. Stále potřebuji chroot změnit kořenový adresář nebo existuje alternativa?

Očekával jsem, že tato otázka poskytne odpověď, ale odpověď používá pouze chroot , znovu.

UPRAVIT #1

Byl zde nyní smazaný komentář, který zmiňoval pivot_root . Protože toto je ve skutečnosti součástí linux/fs/namespace.c , ve skutečnosti je součástí implementace jmenných prostorů. To naznačuje, že změna kořenového adresáře pouze pomocí unshare a mount není možné, ale jmenné prostory poskytují vlastní – chytřejší – verzi chroot . Stále nechápu hlavní myšlenku tohoto přístupu, která jej zásadně odlišuje od chroot , a to i po přečtení zdrojového kódu (ve smyslu např. bezpečnosti nebo lepší izolace).

UPRAVIT #2

Toto není duplikát této otázky. Po provedení všech příkazů z odpovědi mám samostatné /tmp/tmp.vyM9IwnKuY (nebo podobné), ale kořenový adresář je stále stejný!

Přijatá odpověď:

Zadání jmenného prostoru připojení před nastavením chroot , vám umožní vyhnout se zahlcení jmenného prostoru hostitele dalšími připojeními, např. pro /proc . Můžete použít chroot uvnitř jmenného prostoru připojení jako pěkný a jednoduchý hack.

Myslím, že pochopení pivot_root má své výhody , ale má to trochu křivku učení. Dokumentace nevysvětluje úplně vše... ačkoli existuje příklad použití v man 8 pivot_root (pro příkaz shell). man 2 pivot_root (pro systémové volání) by mohlo být jasnější, kdyby to udělalo totéž a obsahovalo příklad programu C.

Jak používat pivot_root

Ihned po zadání jmenného prostoru mount potřebujete také mount --make-rslave / nebo ekvivalent. V opačném případě se všechny změny připojení přenesou do připojení v původním jmenném prostoru, včetně pivot_root . To nechceš :).

Pokud jste použili unshare --mount Všimněte si, že je zdokumentováno použití mount --make-rprivate ve výchozím stavu. AFAICS toto je špatné výchozí nastavení a nechcete to v produkčním kódu. Např. v tomto okamžiku by se zastavilo eject od práce na připojeném DVD nebo USB v hostitelském jmenném prostoru. DVD nebo USB by zůstaly připojeny v soukromém stromu připojení a jádro by vám nedovolilo DVD vysunout.

Jakmile to uděláte, můžete namontovat např. /proc adresář, který budete používat. Stejným způsobem jako u chroot .

Na rozdíl od použití chroot , pivot_root vyžaduje, aby váš nový kořenový souborový systém byl přípojný bod. Pokud ještě není, můžete to splnit jednoduše použitím připojení připojení:mount --rbind new_root new_root .

Použijte pivot_root – a poté umount starý kořenový souborový systém s -l / MNT_DETACH volba. (Nepotřebujete umount -R , což může trvat déle.).

Související:AT+CSQ bez odpojení PPP připojení v ARCH Linuxu?

Technicky pomocí pivot_root obecně musí zahrnovat použití chroot také; není to „buď-nebo“.

Podle man 2 pivot_root , je definován pouze jako výměna kořene jmenného prostoru připojení. Není definováno pro změnu, na který fyzický adresář ukazuje kořen procesu. Nebo aktuální pracovní adresář (/proc/self/cwd ). Stává se, že dělá udělejte to, ale toto je hack pro zpracování jaderných vláken. Manuál říká, že se to v budoucnu může změnit.

Obvykle chcete tuto sekvenci:

chdir(new_root);            // cd new_root
pivot_root(".", put_old);   // pivot_root . put_old
chroot(".");                // chroot .

Pozice chroot v této sekvenci je další jemný detail. Ačkoli bod pivot_root je změnit uspořádání jmenného prostoru připojení, zdá se, že kód jádra najde kořenový souborový systém, který se má přesunout, pohledem na kořenový adresář jednotlivých procesů, což je chroot sady.

Proč používat pivot_root

V zásadě má smysl používat pivot_root pro bezpečnost a izolaci. Rád přemýšlím o teorii bezpečnosti založené na schopnostech. Předáte seznam konkrétních potřebných zdrojů a proces nemá přístup k žádným dalším zdrojům. V tomto případě mluvíme o souborových systémech předávaných do jmenného prostoru připojení. Tato myšlenka se obecně vztahuje na funkci „namespaces“ Linuxu, i když ji pravděpodobně nevyjadřuji příliš dobře.

chroot pouze nastaví kořen procesu, ale proces stále odkazuje na úplný jmenný prostor připojení. Pokud si proces zachová oprávnění provádět chroot , pak může procházet zpět jmenným prostorem souborového systému. Jak je podrobně popsáno v man 2 chroot , „superuživatel může uniknout z ‚chroot vězení‘...“

Další podnětný způsob, jak vrátit zpět chroot je nsenter --mount=/proc/self/ns/mnt . To je možná silnější argument pro princip. nsenter / setns() nutně znovu načte kořen procesu z kořene jmenného prostoru připojení... ačkoli skutečnost, že to funguje, když dva odkazují na různé fyzické adresáře, může být považováno za chybu jádra. (Technická poznámka:v kořenovém adresáři může být několik souborových systémů připojených na sebe; setns() používá horní, naposledy namontovaný).

To ilustruje jednu výhodu kombinace jmenného prostoru připojení s „jmenným prostorem PID“. Být uvnitř jmenného prostoru PID by vám zabránilo vstoupit do jmenného prostoru připojení neomezeného procesu. Také vám to zabrání vstoupit do kořenového adresáře neomezeného procesu (/proc/$PID/root ). A samozřejmě jmenný prostor PID vám také brání zabít jakýkoli proces, který je mimo něj :-).


Linux
  1. Jak připojit vzdálené sdílení Windows v systému Linux

  2. Jak připojit soubor iso v Linuxu

  3. Jak připojit soubor ISO v Linuxu?

  1. Jak používám Vagrant s libvirt

  2. Jak připojit zařízení v Linuxu?

  3. Jak zkontrolovat heslo v Linuxu?

  1. Jak šifrovat soubory pomocí gocryptfs na Linuxu

  2. Jak nastavit linuxové chroot vězení

  3. Linux – Jak připojit vzdálený souborový systém se zadáním čísla portu?