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

Steuerung des Zugriffs auf rootless Podman für Benutzer

Kürzlich erhielt das Podman-Team einen Bugzilla-Bericht, in dem behauptet wurde, es gebe keine Möglichkeit, rootless Podman daran zu hindern, Container auszuführen. Der Melder hat ein Nutzerkonto ohne Einträge in /etc/subuid eingerichtet und /etc/subgid und berichtete, dass Podman ohne Root immer noch hello-world ausführen könnte Behälter.

Falsche Annahme

Entfernen der Benutzerinformationen aus /etc/subuid hindert Nutzer nicht daran, Podman zu verwenden. Sehen wir uns genauer an, was passiert, wenn jemand rootless Podman verwendet, um einen Container auszuführen.

Beachten Sie zunächst, dass Container-Images wie hello-world sind nur Tarballs zusammen mit einigen JSON-Inhalten, die sich auf einem Webserver befinden, der als Container-Image-Registrierung bezeichnet wird Jede Anwendung, die mit einem Webserver kommunizieren kann, kann sie mithilfe von Standard-Webprotokollen und -Tools wie curl herunterziehen .

Wenn Podman ein Bild herunterzieht, erstellt es zunächst einen Benutzernamensraum und gibt ihn ein. Dieser Benutzernamensraum bildet normalerweise die UID des Benutzers auf root (UID=0) innerhalb des Benutzernamensraums ab. Es schaut dann in /etc/subuid für den Benutzer und verwendet die dort aufgeführten UIDs, um den Rest der im Benutzernamensraum verfügbaren UIDs zu füllen. Das Gleiche gilt für Gruppen über /etc/subgid . Wenn es keine Einträge in /etc/subuid gibt und /etc/subgid , dann besteht der Benutzernamensraum nur aus der als root zugeordneten UID des Benutzers. Sobald der Benutzernamensraum eingerichtet ist, extrahiert Podman den tar-Inhalt des Bildes. Wenn das Bild Dateien enthält, die anderen Benutzern als UID=0 gehören, dann extrahiert Podman und versucht zu chown den Inhalt an den definierten Benutzer und die Gruppe. Wenn der Benutzer und die Gruppe nicht innerhalb des Benutzernamensraums definiert sind, dann wird der chown schlägt fehl, und Podman schlägt fehl.

Im Bugzilla-Beispiel hat der Reporter versucht, hello-world auszuführen .

$ podman run hello-world
Resolved "hello-world" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/hello-world:latest...
Getting image source signatures
Copying blob b8dfde127a29 done  
Copying config d1165f2212 done  
Writing manifest to image destination
Storing signatures

Hello from Docker!
…

Es funktionierte, obwohl der Benutzer keine Einträge in /etc/subuid hatte und /etc/subgid .

Lassen Sie uns den Benutzernamensraum eingeben und sehen, was los ist.

Podman unshare cat /proc/self/uid_map
         0       3267         

Beachten Sie, dass mein Konto ohne Zugriff in /etc/subuid eingerichtet ist . Podman ordnet meine UID 3267 UID 0 für eine Reihe von UIDs zu. Sehen wir uns nun den Inhalt des Container-Images hello-world an . Geben Sie den Benutzernamensraum ein, hängen Sie hello-world ein Bild, und listen Sie den Inhalt auf.

$ podman unshare
# mnt=$(podman image mount hello-world)
# ls -l $mnt
total 16
-rwxrwxr-x. 1 root root 13336 Mar  5 18:25 hello

Beachten Sie, dass der einzige Inhalt das hello ist Befehl. Dies ist eine statisch gelinkte GO-Binärdatei, die root innerhalb des Benutzernamensraums gehört, und UID=3267 in meinem Home-Verzeichnis.

Deshalb funktionierte der Befehl auch ohne die zusätzlichen UIDs und GIDs.

Lassen Sie uns versuchen, ein Container-Image mit mehr als einer UID auszuführen.

$ podman run fedora echo hi
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.fedoraproject.org/fedora:latest...
Getting image source signatures
Copying blob 7679c09af385 done  
Copying config 3567369c67 done  
Writing manifest to image destination
Storing signatures
Error: Error committing the finished image: error adding layer with blob "sha256:7679c09af3851a1622782c74864351c296a0d1886813862fd7116383aeba9f07": Error processing tar file(exit status 1): potentially insufficient UIDs or GIDs available in user namespace (requested 0:12 for /var/spool/mail): Check /etc/subuid and /etc/subgid: lchown /var/spool/mail: invalid argument

Beachten Sie, dass Podman die Tarballs herunterziehen kann (es bezeichnet sie als Blobs). Wenn es versucht, sie zu extrahieren, schlägt es fehl, wenn es versucht, chown der /var/spool/mail Verzeichnis zu einer GID (12), die nicht im Benutzernamensraum definiert ist, und der Container schlägt fehl.

Unterm Strich

Das Ausführen von nicht privilegierten Containern ist sicher und kann das System nicht wirklich mehr beeinträchtigen, als nur ein Login auf dem System zu haben. Der Podman-Benutzer führt Aufgaben aus, die normale Benutzer ausführen können:Inhalte von Webservern abrufen und sie entpacken. Schließlich können Benutzer den Inhalt sogar ausführen. Die einzigen Fehler treten auf, wenn der Benutzer versucht, über Befehle wie chown zu UIDs zu wechseln, die dem Benutzer nicht erlaubt sind oder su .

Im obigen Beispiel hat Podman nichts getan, was zusätzliche Berechtigungen erfordert. Alle vom Benutzer über Podman ausgeführten Prozesse unterlagen denselben Einschränkungen wie jeder andere Benutzerprozess. Tatsächlich sind sie eingeschränkter, da sie mit SELinux, SECCOMP und anderen Sicherheitsmechanismen verpackt sind.

Die Verwendung von rootless Podman zum Ausführen eines Container-Images ist nicht weniger sicher, als Benutzern zu erlauben, ausführbare Dateien von einem Webserver herunterzuladen und sie in ihrem Home-Verzeichnis auszuführen.

Wenn Sie dennoch verhindern möchten, dass bestimmte Benutzer auf einem System Podman ausführen, müssen Sie die Berechtigungen auf Podman selbst ändern.

# chmod 750 /usr/bin/podman
# groupadd podman
# chown root:podman /usr/bin/podman

Fügen Sie der Podman-Gruppe Benutzer hinzu, denen Sie Zugriff auf Podman gewähren möchten. Denken Sie nur daran, dass Sie chmod ausführen müssen, wenn Podman aktualisiert wird und chown Befehle erneut und rpm -qV podman wird Probleme mit der Installation melden.

Zusätzliches Guthaben

Für fortgeschrittene Benutzer, insbesondere Personen im High-Performance Computing (HPC), haben wir ein spezielles Flag hinzugefügt, ignore_chown_errors , in den Speicher des Containers.

man storage.conf
…
       ignore_chown_errors = "false"
         ignore_chown_errors can be set to allow a non privileged user running with a  single UID within a user namespace to run containers. The user can pull and use any image, even those with multiple uids.  Note multiple UIDs will be squashed down to the default uid in the container.  These images will have no separation between the users in the container. (default: false)

Durch Setzen dieses Flags in /etc/containers/storage.conf von $HOME/.config/containers/storage.conf auf true, Podman kann den Fedora-Container erfolgreich ausführen.

$ grep ignore_chown_err /etc/containers/storage.conf
# ignore_chown_errors can be set to allow a non privileged user running with
ignore_chown_errors = "true"
$ podman unshare cat /proc/self/uid_map
         0        3267          1


$ podman run fedora echo hi
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.fedoraproject.org/fedora:latest...
Getting image source signatures
Copying blob 7679c09af385 done  
Copying config 3567369c67 done  
Writing manifest to image destination
Storing signatures
hi

Diesmal versuchte Podman zu chown der /var/spool/mail Verzeichnis und erhielt einen Fehler, ignorierte es und fuhr fort. HPC möchte nicht, dass Benutzer mehr als eine UID haben, sodass ihre Benutzer Standard-OCI-Images ausführen können, ohne ihre Sicherheitseinstellungen überhaupt lockern zu müssen. Beachten Sie, dass dies gut funktioniert, solange die einzige UID, die Sie innerhalb des Containers ausführen, das Stammverzeichnis des Containers ist. Wenn der Prozess aus irgendeinem Grund versucht, die UID in eine UID zu ändern, die nicht im Container definiert ist, schlägt dies fehl. Außerdem gehören in den meisten Fällen alle Dateien im Image dem Benutzer. Dieser Benutzer des Containers hat volle Lese-/Schreibberechtigungen für alle Inhalte.

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

Abschluss

Podman-Administratoren müssen wissen, welche Zugriffsebenen gewährt werden. Stellen Sie sicher, dass Sie die Absicht und Funktion von /etc/subuid verstehen und /etc/subgid , und wie sie sich auf die Containersicherheit auswirken.

Verwenden Sie schließlich die ignore_chown_errors Option mit Sorgfalt. Es wurde für HPC-Szenarien entwickelt.


Linux
  1. So beschränken Sie den SSH-Zugriff für Benutzer mit LShell (Limited Shell)

  2. Wie lege ich Desktop-Standardeinstellungen für neue Benutzer fest?

  3. Warum ist es riskant, normalen Benutzern Sudo Vim Zugriff zu gewähren?

  4. Rackspace Cloud Essentials – Konfigurieren Sie einen Benutzer in vsftpd für CentOS

  5. So beschränken Sie den su-Zugriff auf einen Benutzer nur durch PAM in Linux

So lösen Sie den MySQL-Fehler:Zugriff für Benutzer verweigert [email protected]

Wie Cirrus CLI Podman verwendet, um rootless Builds zu erreichen

So beschränken Sie den SSH-Zugriff auf bestimmte Benutzer in Linux

Webmin-Benutzer

X Display-Zugriff für lokalen Benutzer aktivieren?

Der SSH-Zugriff für einen neuen Benutzer kann nicht abgerufen werden