GNU/Linux >> Znalost Linux >  >> Linux

Používání souborů a zařízení v kontejnerech Podman rootless

Jedním z klíčových problémů, se kterými se uživatelé Podman potýkají, je přístup k souborům a zařízením, které mohou používat z hostitele, ale nemohou je používat, když jsou v kontejneru, i když do kontejneru připojují objekty.

V tomto případě se podíváme na doplňkový skupinový přístup. Systémy jsou často nastaveny se soubory a zařízeními, která jsou přístupná pouze určitým skupinám uživatelů. Například jsem v kole skupina v mém systému, což mému uživateli umožňuje přístup k některým administrativním ovládacím prvkům. Správci mohou vytvořit adresář, který bude sdílet více uživatelů v systému, vytvořením eng skupinu, přidávání uživatelů do eng a poté povolte eng skupinu, aby měl adresář rwx oprávnění. Nyní všichni uživatelé v eng může číst a zapisovat adresář.

Nedávno jsme zaznamenali problém, kdy se uživatel snažil poskytnout přístup k zařízení GPU ve svém systému.

Přidával zařízení pomocí příkazu jako:

$ podman run --device /dev/video0 …

Poznámka :V kontejnerech bez root nemohou uživatelé bez root vytvářet nová zařízení při přidávání zařízení do kontejneru. Podman tedy jednoduše připojí zařízení z kontejneru do hostitele. V režimu rootfull se vytvoří nové zařízení, ke kterému mají přístup procesy uvnitř kontejneru.

Svazek Podman se připojí v /dev/video0 , ale pokaždé, když se uživatel pokusí použít zařízení v kontejneru, selže s Oprávnění odepřeno . Když však zkontroloval zařízení na hostiteli a skupinách, kterých byl členem, vše vypadalo správně. Například:

$ ls -l /dev/video0
crw-rw----+ 1 root video 81, 0 May  3 14:06 /dev/video0
$ groups
dwalsh video

Zařízení může plně využívat i mimo kontejnery. Uvědomte si, že proces kontejneru není ve videu skupiny, pak ho napadlo přidat video seskupit do kontejneru, abyste získali přístup. Zkusil tento příkaz:

$ podman run --group-add video --device /dev/video0 …

Stále se to však nezdařilo s Oprávnění odepřeno .

Co se stalo?

Když použijete --group-add video , přidá video skupina definovaná uvnitř obrazu kontejneru k primárnímu procesu kontejneru, takto:

$ grep video /etc/group
video: 39:  

$ podman run --group-add video fedora id
uid=0(root) gid=0(root) groups=0(root),39(video)


Uvnitř kontejneru má proces skupinu 39 , ale to není stejné jako skupina 39 na hostiteli. Při spouštění kontejnerů bez kořenů používáte uživatelský jmenný prostor, takže skupina je kompenzována uživatelským jmenným prostorem, ke kterému jste se připojili. Zde je jmenný prostor:

$ podman unshare cat /proc/self/gid_map
0 3267 1
1 100000 65536


To znamená, že video skupina uvnitř kontejneru bude GID 100038 na hostiteli. Podívejte se na tento příklad:

$ ctr=$(podman run -d --group-add video fedora sleep 100)
$ pid=$(podman top -l hpid | tail -1)
$ grep Groups /proc/$pid/status
 Groups:    100038

Aby bylo možné získat přístup k videozařízení na hostiteli, proces potřebuje skutečný GID=39 , tak to selže. Uživatelé bez root nemohou vynutit přístup ke skutečnému GID=39 na hostiteli, protože to blokují standardní ochrany Linuxu.

Podman na záchranu

Od verze Podman 3.2 jsme přidali novou funkci --group-add keep-groups , který pracuje s OCI runtime crun . Obvykle, když spustíte kontejner Podman, běhové prostředí OCI spustí setgroups systémové volání; to změní hlavní proces uvnitř kontejneru, aby získal skupiny definované v kontejneru, a také zruší přístup ke skupinám nadřazených procesů. Obvykle to je to, co chcete, aby se stalo, protože nechcete, aby proces uniklý z kontejneru získal přístup k vašemu kolu například skupina.

Když spustíte s --group-add keep-groups , běhové prostředí kontejneru OCI (crun ) nevolá setgroups , takže nový proces kontejneru zachovává skupiny svého nadřazeného procesu. Pokud má nadřazený proces přístup k GID=39 , procesy uvnitř kontejneru budou mít stále tuto skupinu a mohou zařízení používat.


$ podman run --device /dev/video0 --group-add keep-group …

A všechno funguje!

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

Dodatek

Všimněte si, že uvnitř kontejneru je GID 39 není namapován, takže procesy v kontejneru to uvidí jako nikdo skupina. Vypadá to takto:

$ ./bin/podman run --group-add keep-groups fedora groups
root nobody

Starší verze Podmana mají méně uživatelsky přívětivé rozhraní pro spouštění tohoto chování v crun . Přidáním --annotation run.oci.keep_original_groups=1 , crun neprovede setgroups .

$ podman run --annotation run.oci.keep_original_groups=1 --device /dev/video0

Pokud použijete --group-add keep-groups volání, nemůžete v kontejneru nastavit další skupiny. Místo toho může kontejner zdědit pouze nadřazené skupiny. Důvodem je, že Podman vyžaduje setgroups volání pro nastavení dalších skupin v kontejneru, což by ztratilo přístup k nadřazeným skupinám. Giuseppe Scrivano navrhl dva patche umožňující setgroups v této situaci. Tento přístup je stále předmětem diskuse. Giuseppe také otevřel problém s runtime-spec aby se to stalo formální součástí specifikace a dostalo se do jiných oci-runtime, jako je runc , ale také ještě nebyl sloučen.

Sbalit

Uživatelé aplikace Podman mají problém s přístupem k souborům a zařízením v kontejneru, i když uživatelé mají přístup k těmto zdrojům na hostiteli. Podívali jsme se na případy použití, kde je tento problém odhalen, a diskutovali jsme o některých navrhovaných opravách k vyřešení problému.

[ Stáhnout nyní:Průvodce systémového administrátora skriptováním v Bash. ]


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

  2. Sdílení doplňkových skupin s kontejnery Podman

  3. Odstranění souborů pomocí rm pomocí find a xargs

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

  2. Prozkoumání Podman RESTful API pomocí Pythonu a Bash

  3. wget vs curl:Jak stahovat soubory pomocí wget a curl

  1. Hledání spustitelných souborů pomocí ls a grep

  2. tcpdump – rotace zachycených souborů pomocí -G, -W a -C

  3. LXD kontejnery a sítě se statickou IP