GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von Dateien und Geräten in Podman-Containern ohne Root

Ein Hauptproblem, das Podman-Benutzer haben, ist der Zugriff auf Dateien und Geräte, die sie vom Host aus verwenden, aber nicht verwenden können, während sie sich in einem Container befinden, selbst wenn sie die Objekte per Volume in den Container einhängen.

In diesem Fall betrachten wir den zusätzlichen Gruppenzugriff. Häufig werden Systeme mit Dateien und Geräten eingerichtet, die nur bestimmten Benutzergruppen zugänglich sind. Zum Beispiel bin ich im Rad Gruppe auf meinem System, die meinem Benutzer den Zugriff auf einige administrative Kontrollen ermöglicht. Administratoren können ein Verzeichnis einrichten, das von mehreren Benutzern im System gemeinsam genutzt werden soll, indem sie die Datei eng erstellen Gruppe, indem Sie Benutzer zu eng hinzufügen Gruppe und dann eng zulassen Gruppe das Verzeichnis rwx haben Berechtigungen. Jetzt alle Benutzer in eng kann das Verzeichnis lesen und schreiben.

Kürzlich haben wir ein Problem erhalten, bei dem ein Benutzer Schwierigkeiten hatte, Zugriff auf ein GPU-Gerät auf seinem System zu gewähren.

Er fügte das Gerät mit einem Befehl hinzu wie:

$ podman run --device /dev/video0 …

Hinweis :In Rootless-Containern können Rootless-Benutzer keine neuen Geräte erstellen, wenn sie einem Container ein Gerät hinzufügen. Podman bindet also einfach das Gerät aus dem Container in den Host ein. Im Rootfull-Modus wird ein neues Gerät erstellt, auf das Prozesse innerhalb des Containers Zugriff haben.

Podman-Volume wird in /dev/video0 bereitgestellt , aber jedes Mal, wenn der Benutzer versucht, das Gerät innerhalb des Containers zu verwenden, schlägt dies mit Berechtigung verweigert fehl . Als er jedoch das Gerät auf dem Host und den Gruppen, denen er angehörte, überprüfte, sah alles richtig aus. Zum Beispiel:

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

Er kann das Gerät außerhalb der Container voll nutzen. Erkennen, dass der Containerprozess nicht im Video enthalten ist Gruppe, dachte er dann daran, das Video hinzuzufügen Gruppe zum Container, um Zugriff zu erhalten. Er versuchte diesen Befehl:

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

Aber es ist immer noch fehlgeschlagen mit Berechtigung verweigert .

Was ist passiert?

Wenn Sie --group-add video verwenden , fügt es das Video hinzu -Gruppe, die innerhalb des Container-Images definiert ist, an den primären Prozess des Containers wie folgt:

$ grep video /etc/group
video: 39:  

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


Innerhalb des Containers hat der Prozess die Gruppe 39 , aber das ist nicht das gleiche wie Gruppe 39 auf dem Host. Wenn Sie Container ohne Root ausführen, verwenden Sie den Benutzernamensraum, sodass die Gruppe durch den Benutzernamensraum versetzt wird, dem Sie beigetreten sind. Hier ist der Namespace:

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


Das bedeutet, dass das Video Gruppe innerhalb des Containers hat die GID 100038 auf dem Host. Schauen Sie sich dieses Beispiel an:

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

Um auf das Videogerät auf dem Host zuzugreifen, benötigt der Prozess echte GID=39 , also schlägt es fehl. Rootless-Benutzer können den Zugriff auf die echte GID=39 nicht erzwingen auf dem Host, da Standard-Linux-Schutzmaßnahmen ihn blockieren.

Podman zur Rettung

Ab Podman 3.2 haben wir eine neue Funktion hinzugefügt, --group-add keep-groups , die mit der OCI-Laufzeit crun arbeitet . Wenn Sie einen Podman-Container starten, führt die OCI-Laufzeit normalerweise die setgroups aus Systemaufruf; Dadurch wird der Hauptprozess innerhalb des Containers geändert, um die im Container definierten Gruppen abzurufen, und der Zugriff auf die übergeordneten Prozessgruppen wird ebenfalls aufgehoben. Normalerweise ist dies das, was Sie tun möchten, da Sie nicht möchten, dass ein entkommener Prozess aus einem Container Zugriff auf Ihr Wheel erhält Gruppe, zum Beispiel.

Wenn Sie mit --group-add keep-groups ausführen , die OCI-Container-Laufzeit (crun ) ruft die setgroups nicht auf , sodass der neue Containerprozess die Gruppen seines übergeordneten Prozesses beibehält. Wenn der übergeordnete Prozess Zugriff auf GID=39 hat , haben die Prozesse innerhalb des Containers immer noch diese Gruppe und können das Gerät verwenden.


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

Und alles funktioniert!

[ Erste Schritte mit Containern? Schauen Sie sich diesen kostenlosen Kurs an. Containerisierte Anwendungen bereitstellen:Eine technische Übersicht. ]

Nachtrag

Beachten Sie, dass innerhalb des Containers die GID 39 ist wird nicht zugeordnet, daher sehen die Prozesse innerhalb des Containers dies als nobody Gruppe. Es sieht so aus:

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

Ältere Versionen von Podman haben eine weniger benutzerfreundliche Oberfläche, um dieses Verhalten in crun auszulösen . Durch Hinzufügen der --annotation run.oci.keep_original_groups=1 , crun führt setgroups nicht aus .

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

Wenn Sie die --group-add keep-groups verwenden aufrufen, können Sie keine anderen Gruppen innerhalb des Containers festlegen. Stattdessen kann der Container nur die Gruppen des übergeordneten Elements erben. Der Grund dafür ist, dass Podman die setgroups benötigt aufrufen, um zusätzliche Gruppen innerhalb des Containers festzulegen, und dies würde den Zugriff auf die übergeordneten Gruppen verlieren. Giuseppe Scrivano hat zwei Patches vorgeschlagen, um setgroups zuzulassen in dieser Situation. Dieser Ansatz wird noch diskutiert. Giuseppe hat auch ein Problem mit der runtime-spec eröffnet um dies zu einem formellen Teil der Spezifikation zu machen und es in andere Oci-Laufzeiten wie runc zu bringen , aber auch noch nicht zusammengeführt.

Abschluss

Podman-Benutzer haben ein Problem beim Zugriff auf Dateien und Geräte in einem Container, selbst wenn die Benutzer Zugriff auf diese Ressourcen auf dem Host haben. Wir haben uns Anwendungsfälle angesehen, in denen dieses Problem auftaucht, und einige der vorgeschlagenen Patches zur Behebung des Problems besprochen.

[ Jetzt herunterladen:Eine Anleitung für Systemadministratoren zum Bash-Skripting. ]


Linux
  1. So analysieren und vergleichen Sie Container-Images mit Container-Diff

  2. Was ist Podman und wie installiere ich Podman unter Linux?

  3. Warum kann Podman mein Image nicht ziehen?

  4. Rootless Podman als Nicht-Root-Benutzer ausführen

  5. Erkundung der Podman RESTful API mit Python und Bash

So ordnen und ändern Sie PDF-Dateien mit PDF Arranger

Übertragen Sie Dateien zwischen beliebigen Geräten mit Piping Server

So sichern Sie Dateien und Verzeichnisse mit Rsync unter Linux

So installieren und verwalten Sie Podman-Container in RHEL-Systemen

So verwenden Sie Docker Cp zum Kopieren von Dateien zwischen Host und Containern

So löschen Sie Dateien und Verzeichnisse mit der Linux-Befehlszeile