Jmenné prostory jsou vlastností linuxového jádra, která umožňuje rozdělovat prostředky jádra tak, aby různé procesy nebo skupiny procesů viděly jiné sady prostředků. Vlastnost funguje tak, že má stejný prostor jmen pro sadu prostředků a procesů, ale různé prostory jmen se odkazují na jiné prostředky. Daný prostředek může patřit do několika jmenných prostorů. Jmenné prostory existují pro ID procesů, jména strojů (hostitelů), ID uživatelů, jména souborů, některé jména související s přístupem k síti a s meziprocesovou komunikací.
Jmenné prostory jsou nutnou podmínkou pro používání kontejnerů v Linuxu. Slovní spojení „jmenný prostor“ se používá jak pro označení určitého druhu jmenného prostoru (např. proces ID), tak pro konkrétní prostor jmen.
Linuxový systém začíná s jedním jmenným prostorem od každého druhu, který používají všechny procesy. Procesy mohou vytvářet další jmenné prostory a mohou se připojovat k jiným jmenným prostorům.
Historie
Základní principy jmenných prostorů se objevovaly ve starších operačních systémech; v systému Unix bylo v roce 1979 pouze zavedeno systémové volání chroot() („změna kořenového adresáře“) s cílem zajistit izolaci části souborového systému a poskytnout „testovací prostředí“ oddělené od hlavního systému. Linuxové jmenné prostory byly inspirovány rozsáhlejší funkčností jmenných prostorů používaných intenzivně v Plan 9 from Bell Labs.
První implementace jmenných prostorů v Linuxu se objevila v roce 2002 ve verzi jádra 2.4.19. Další jmenné prostory byly přidány v roce 2006 a přidávaly se i v následujících verzích. Dostatečná funkčnost pro úplnou izolaci a bezpečný provoz kontejnerů byla implementována v jádře verze 3.8 se zavedením jmenných prostorů uživatelů. S podporou izolace jmenných prostorů pro kontrolní skupiny ve verzi 4.6 jsou zajištěny maximální možnosti izolace:
+ Uvedení jmenných prostorů Jmenný prostor Verze jádra Rok Systém souborů (Mount)2.4.192002 Používání jmen počítačů (UTS)2.6.192006 ID procesů (PID)2.6.242008 Sítě (Network) (net)2.6.292009 Meziprocesová komunikace (IPC)2.6.302009 ID uživatelů (User)3.82013 Řídicí skupiny4.62016 Čas5.62020
Druhy jmenných prostorů Od verze 5.6 jádra Linuxu existuje 8 druhů jmenných prostorů. Jejich funkce je u všech druhů stejná: každému procesu je přiřazen jeden jmenný prostor a proces může vidět nebo používat pouze prostředky přiřazené k tomuto jmennému prostoru případně k jemu podřízeným jmenným prostorům. Tímto způsobem může každý proces (nebo skupina procesů z nich) mít jedinečný pohled na prostředky. Který prostředek je izolován, závisí na druhu jmenného prostoru, který byl vytvořen pro danou skupinu procesů.
Mount (mnt) Pro řízení bodů připojení nejen diskových svazků je určen jmenný prostor mount (mnt). Při vytvoření jsou body připojení z aktuálního jmenného prostoru mount zkopírovány do nového jmenného prostoru, ale později vytvořené body připojení se do jiných jmenných prostorů nepropagují (je však možné je propagovat sdílením adresářových podstromů).
Příznak používaný pro vytváření nových jmenných prostorů tohoto druhu je CLONE_NEWNS - zkratka pro „NEW NameSpace“. Tento název není deskriptivní (neříká, jaký druh jmenného prostoru má být vytvořen), protože jmenné prostory mount byly prvním druhem jmenných prostorů a návrháři nepředpokládali, že budou jiné druhy.
Proces ID (pid) Jmenný prostor PID poskytuje procesům množinu hodnot PID (process ID) nezávislou na jiných jmenných prostorech. Jmenné prostory PID jsou vnořované, což znamená, že když je vytvořen nový proces, bude mít PID pro každý z jeho aktuálních jmenných prostorů až po jmenný prostor s počátečním PID. Počáteční jmenný prostor PID je tedy schopen vidět všechny procesy, i když s jinými čísly PID, než v jiných jmenných prostorech.
Prvnímu procesu vytvořenému ve jmenném prostoru PID je přiřazen PID 1 a získává většina stejného speciální pojetí jako normální proces init, především mu jsou přiřazeny osiřelé (orphaned) procesy v daném jmenném prostoru. To také znamená, že ukončením tohoto procesu s PID 1 budou všechny procesy v jeho jmenném prostoru PID okamžitě ukončeny.
Network (net) Jmenný prostor network virtualizuje síťový zásobník. Při vytvoření jmenného prostor network obsahuje pouze rozhraní loopback. Každé síťové rozhraní (fyzické nebo virtuální) je přítomné právě v 1 jmenném prostoru a lze jej přemisťovat mezi jmennými prostory.
Každý jmenný prostor má vlastní sadu IP adres, vlastní směrovací tabulku, seznam soketů, seznam spojení, firewall a další síťové prostředky.
Zrušení síťového jmenného prostoru zruší všechna virtuální rozhraní v něm a přemístí všechna fyzická rozhraní z něj do počátečního síťového jmenného prostoru.
Inter-process Communication (ipc) Jmenné prostory IPC izolují procesy při meziprocesové komunikaci ve stylu SysV. Tím se zabraňuje, aby procesy v různých jmenných prostorech IPC používaly např. rodinu funkcí SHM pro vytvoření oblasti sdílené paměti mezi dvěma procesy. Místo toho může každý proces použít stejné identifikátory pro oblast sdílené paměti, ale vzniknou dvě různé oblasti.
UTS Jmenné prostory UTS (unixové sdílení času) umožňují, aby jeden systém měl pro různé procesy různá jména počítače a doménová jména NIS. Když proces vytváří nový UTS jmenný prostor, jméno počítače () a NIS doména se do nového jmenného prostoru UTS zkopírují z odpovídající hodnoty ze jmenného prostoru UTS volajícího.
User ID (user) Jmenné prostory User ID poskytují izolaci oprávnění a oddělení identifikace uživatelů pro různé sady procesů. Jsou dostupné od jádra verze 3.8. Umožňují vytvářet kontejnery, které zdánlivě mají oprávnění správce bez toho, že by uživatelským procesům skutečně dávaly zvýšená oprávnění. Stejně jako jmenné prostory PID lze jmenné prostory uživatelů vnořovat, a každý nový jmenný prostor uživatelů je považován za potomka jmenného prostoru uživatelů, který jej vytvořil.
Jmenný prostor uživatelů obsahuje tabulku pro převod ID uživatelů z pohledu kontejneru na systémové ID. To umožňuje např. aby uživatel root měl v kontejneru uživatelské ID 0, ale systém jej pro účely kontroly vlastnictví považuje za uživatele s ID 1400000. Podobná tabulka se používá pro mapování ID skupin a kontrolu vlastnictví.
Jmenný prostor kontrolních skupin (cgroup) Jmenný prostor cgroup skrývá identitu řídicí skupiny, jíž je proces členem. Když proces v takovém jmenném prostoru zjišťuje, do jaké řídicí skupiny jednotlivé procesy patří, vidí cestu, které je ve skutečnosti relativní vůči řídicí skupině nastavené při vytvoření procesu, čímž se skrývá skutečná pozice a identita řídicí skupiny. Tento jmenný prostor je dostupný od Linuxu verze 4.6 uvedené v březnu 2016.
Čas Jmenný prostor time umožňuje procesy vidět různý čas podobným způsobem jako ve jmenném prostoru UTS. Byl navržen v roce 2018 a implementován v Linuxu 5.6 v březnu 2020.
Navrhované jmenné prostory Jmenný prostor syslog Jmenný prostor syslog navrhl inženýr společnosti Huawei Rui Xiang, ale do linuxového jádra nebyl začleněn. Systemd implementuje podobný rys nazývaný jmenný prostor „journal” od února 2020.
Administrativní hierarchie Aby se usnadnila izolace oprávnění pro správu systému, předpokládá se, že každý druh jmenného prostoru je vlastněn jmenným prostorem, který byl aktivní v okamžiku jeho vytvoření. Uživatel s oprávněními správce v příslušném uživatelském jmenném prostoru bude moci provádět správu v jiném druhu jmenného prostoru. Pokud například proces má správcovské oprávnění měnit IP adresu síťových rozhraní, může tak učinit, pokud je jeho vlastní uživatelský jmenný prostor je stejný jako uživatelský jmenný prostor, který vlastní síťový jmenný prostor (nebo pokud je jeho potomkem). Počáteční jmenný prostor uživatelů tedy má správcovsá oprávnění ve všech druzích jmenných prostorů v systému.
Implementační detaily Jmenný prostor je v jádře reprezentován objektem virtuálního souboru. Pro propojení procesu s odpovídajícím jmenným prostorem se používá otevřený popisovač souboru na takový soubor.
Viditelnost v /proc Jádro zpřístupňuje jmenné prostory každého procesu v adresáři /proc/pid/ns/kind. Stejně jako jiné prostředky v /proc, které nejsou soubory, je lze číst jako symbolické odkazy, což dává kind:[inode_number]nebo k nim přistupovat jako k obyčejným souborům. (Tyto soubory nejsou čitelné, ale jsou užitečné jiným způsobem. Jejich inode čísla odpovídají textovým číslům vráceným příkazem readlink.) Tyto soubory odpovídají 1:1 jmenným prostorům v jádře, takže inode čísla slouží jako jedinečné identifikátory.
Od Linuxu verze 6.1.0 může druh být cgroup, ipc, mnt, net, pid, time, user nebo uts. U některých jmenných prostorů lze dědění procesům-potomkům ovládat nezávisle na efektivním jmenném prostoru samotného procesu, což je viditelné jako /proc/pid/ns/druh_for_children.
Syscalls Se jmennými prostory mohou přímo manipulovat tři systémová volání: clone s příznaky pro určení, do kterého nového jmenného prostoru má být nový proces umístěn unshare pro odpojení části kontextu provádění procesu nebo vlákna, které jsou aktuálně sdíleny s jinými procesy (nebo vlákny) setns pro umístění aktuálního procesu do jmenného prostoru určeného popisovačem souboru.
Rušení Jmenný prostor který již není referencován, bude zrušen, přičemž zacházení s obsaženými prostředky závisí na druhu jmenného prostoru. Jmenný prostor je považován za referencovaný, pokud: má alespoň jeden členský proces; má alespoň jeden referencovaný podřízený jmenný prostor; nebo jeho virtuální soubor (/proc/pid/ns/kind) je používán, a to: prostřednictvím otevřeného popisovače souboru; jako aktuální adresář procesu; jako kořenový adresář procesu; nebo jako podklad pro bod připojení.
Přijetí Různé kontejnerizační systémy, jako Docker, Podman a LXC, používají linuxové jmenné prostory v kombinaci s cgroup pro oddělení svých procesů.
Další aplikace, jako Google Chrome využívají jmenné prostory pro oddělení vlastních procesů, které jsou ohroženy útokem na internet.
Existuje také unshare wrapper v Util-linux. Příklad jeho použití: SHELL=/bin/sh unshare --map-root-user --fork --pid chroot "${chrootdir}" "$@"
Odkazy Reference
Externí odkazy namespaces manpage Namespaces — The Linux Kernel documentation Linux kernel Namespaces and cgroups by Rami Rosen Namespaces and cgroups, the basis of Linux containers (including cgroups v2) - slides of a talk by Rami Rosen, Netdev 1.1, Seville, Spain (2016) Containers and Namespaces in the Linux Kernel by Kir Kolyshkin
Kategorie:Jádro Linuxu