GNU/Linux >> Znalost Linux >  >> Linux

Jak Cirrus CLI používá Podman k dosažení sestavení bez kořenů

Co je Cirrus CLI? Následující popis je převzat z popisu stránky Cirrus CLI GitHub:

Cirrus CLI je nástroj pro spouštění kontejnerizovaných úloh reprodukovatelně v jakémkoli prostředí. Úlohy Cirrus se nejčastěji používají jako součást kontinuálních integračních pracovních postupů, ale mohou být také použity jako součást procesu místního vývoje jako hermetické nahrazení pomocných skriptů/Makefiles. Cirrus CLI spouští vaše úlohy lokálně stejným způsobem, jakým se provádějí v CI nebo na počítači vašeho kolegy. Neměnnost kontejnerů zajišťuje, že úkoly budou prováděny stejným způsobem za několik let bez ohledu na to, jaké verze balíčků budete mít lokálně.

Cirrus CLI podporoval Docker od jeho počátku, ale vyžadovat kontejnerového démona, který běží jako root a poskytuje přístup méně privilegovaným uživatelům, někdy není možné:Například při stavění na sdíleném počítači, izolaci vnořených kontejnerů nebo prostě jako zabezpečení. -vědomí o tom, co běží na vaší ploše.

A i když Docker představil rootless režim asi před rokem, jeho uživatelská zkušenost podle našeho názoru v současné době chybí, většinou kvůli chybějícímu balení a historii Dockeru jako démona. Na druhé straně Podman začal jako kontejnerový engine bez démonů a jeho instalační proces pokrývá prakticky všechna distribuce.

Navíc, když jsme zkoumali Podman jako další možnost pro spouštění úloh Cirrus, uvědomili jsme si, že je to malý krok k narušení softwarové monokultury, protože v konečném důsledku se kvalita jejího softwaru zvyšuje. Objevují se nové standardy a stavební bloky, jako je projekt Rootless Containers, které dláždí cestu pro budoucnost softwaru.

Kontejnery bez kořenů využívají... jmenné prostory?

Jmenné prostory Linuxu jsou nejdůležitějším základním kamenem toho, co umožňuje fungování kontejnerů na Linuxu. Jsou vysoce specifické pro Linux až do té míry, že se při spuštění kontejnerů na Windows a macOS vytvoří samostatný virtuální počítač s Linuxem.

Jmenné prostory umožňují podrobné oddělení zdrojů. Pokud je například proces připojen ke konkrétnímu jmennému prostoru PID, vidí pouze další procesy připojené ke stejnému jmennému prostoru. Nebo pokud je souborový systém FUSE připojen ke kořenovému adresáři (/ ), i když je hostitel v samostatném jmenném prostoru připojení, nedojde k náhlému zhroucení kvůli chybějícím binárním souborům.

Jedním z nejobtížnějších jmenných prostorů jsou jmenné prostory uživatelů. Uživatelské jmenné prostory v podstatě umožňují být kořenem uvnitř jmenného prostoru, ale zvenčí se jevit jako normální uživatel. Vzhledem k tomu, že většina obrázků kontejnerů očekává, že se budou pro určité operace spouštět jako root, je implementace uživatelských jmenných prostorů pro kontejnery bez kořenů zásadní.

Podívejme se, co se stane, když více uživatelů spustí své příkazy sestavení pomocí Dockeru bez uživatelské jmenné prostory povoleny:

Při sledování těchto ID procesů z hostitele kontejneru se všechny úlohy spouštějí pod rootem, přestože je spouštějí různí uživatelé. Totéž platí pro containerd . A i když jste to ve skutečnosti mohli předat --userns-remap příznak, kontejner bude stále běžet jako root a bude jediným bodem selhání.

Ve výchozím režimu věci běží takto, protože implementace kontejnerů bez kořenů není triviální.

Samotné uživatelské jmenné prostory jsou pravděpodobně jednou z nejsložitějších konfigurací pro implementaci a produkci mnoha chyb souvisejících se zabezpečením. Některé distribuce jako Debian se dokonce před časem rozhodly je ve výchozím nastavení zakázat.

[ V případě, že jste to přehlédli: Základní principy zabezpečení pro kontejnery a běhová prostředí kontejnerů ]

Jak Podman řeší potíže s prováděním bez root

Spuštění kontejneru bez oprávnění root zahrnuje určité kompromisy a řešení.

Když například jako uživatel vytvoříte síťový jmenný prostor (který by měl obsahovat uživatelský jmenný prostor), dostanete pouze lo rozhraní. Normálně kontejnerový engine také vytváří veth pár zařízení a přesune jeden z jeho konců zpět k hostiteli, aby jej připojil ke skutečnému síťovému rozhraní nebo mostu (pro mezikontejnerovou komunikaci).

Připojení rozhraní na hostiteli však vyžaduje, abyste byli kořenem v oboru názvů hostitele, takže to není možné. Podman to řeší pomocí slirp4netns, síťového zásobníku, který směruje pakety mezi kontejnerem a samotným monitorem, namísto použití zařízení jádra. Nevyžaduje tedy žádná oprávnění superuživatele.

Kvůli složitosti spojené s uživatelskými jmennými prostory také nemůžete používat určité souborové systémy běžně dostupné kořenovému adresáři hostitele. Jedním z těchto souborových systémů je OverlayFS, který výrazně pomáhá s deduplikací vrstev obrazu kontejneru a zlepšuje prostředí kontejneru. Stále však lze použít FUSE. Tým Podman implementoval fuse-overlayfs , který se používá, je-li nainstalován, uchýlí se k jednoduchému extrahování obsahu obrazu do adresáře na úkor výkonu.

Nyní, pokud spustíme stejné úlohy, které jsme spouštěli dříve, ale s Podmanem, výsledek vypadá takto:

Všimněte si, že nyní nic neběží jako root a neexistuje jediný bod selhání, pokud z nějakého důvodu selže kontejnerový engine.

Integrace s Podmanem

Když spustíte nové sestavení pomocí cirrus run , vytváří proces Podman pod kapotou a komunikuje s ním prostřednictvím REST API, které bylo nedávno představeno jako nástupce starého Varlink API.

Samotné API se velmi podobá Docker Engine API, které umožňuje čistou abstrakci pro obě API ve stejné kódové základně.

Ve skutečnosti stejný koncový bod Podman nabízí vrstvu kompatibility rozhraní API Docker Engine, ale v době psaní tohoto článku se na něm stále nepracuje.

Povolení aplikace Podman v rozhraní CLI

Pokud ještě nemáte nainstalovaný Podman, postupujte podle pokynů pro vaši distribuci Linuxu a poté si přečtěte tutoriál bez rootu.

CLI podporuje Podman verze 0.17.0 a novější. Můžete to povolit předáním --container-backend=podman příznak:

cirrus run --container-backend=podman Lint

Všimněte si, že pokud nemáte na svém systému nainstalovaný Docker, nemusíte ani nic specifikovat – vše funguje automaticky.

[ Začínáte s kontejnery? Podívejte se na tento bezplatný kurz. Nasazení kontejnerových aplikací:technický přehled. ]

Sbalit

Sestavení bez rootu jsou důležitou součástí nasazení kontejnerů. Cirrus CLI spolupracuje s Podmanem na poskytování této funkce. Tyto dva nástroje použijte k lepší správě a zabezpečení prostředí kontejnerů.


Linux
  1. Jak GNOME používá Git

  2. Jak opustit kontejner Docker

  3. Jak změnit heslo uživatelského účtu kontejneru LXC

  1. Jak změnit uživatelské jméno v Linuxu

  2. Proč nemůže bezkořenový Podman vytáhnout můj obrázek?

  3. Co se děje v zákulisí kontejneru Podman bez kořenů?

  1. Spuštění rootless Podman jako uživatel bez root

  2. Jak používat Podman uvnitř Kubernetes

  3. Jak používat Podman uvnitř kontejneru