Kommerzielle Software von der Stange oder quelloffene Produkte, die lizenzkostenfrei und flexibler sind, dafür aber oft entsprechendes Know-how voraussetzen? ... (mehr)

Container ohne root-Rechte starten

Ein weiteres interessantes Feature von Podman ist, dass auch nicht privilegierte Benutzer Container starten können. Prozesse, die als root innerhalb des Containers laufen, werden auf dem Host auf die UID des Benutzers gewandelt, der den Container gestartet hat. Andere IDs müssen Sie im Vorfeld auf einen bestimmten ID-Bereich mappen. Das Ganze funktioniert deshalb, da Podman den User-Namespace des Linux-Kernels verwendet. Benutzer, die mit Containern arbeiten wollen, benötigen hierfür in den Dateien "/etc/subuid" und "/etc/subgid" einen Eintrag, der die in den Containern verwendeten IDs auf diejenigen des Hosts mappt. Hierbei ist Sorgfalt gefragt, damit Sie nicht bereits bestehende IDs auf dem Host überschreiben:

echo tscherf:100000:65536 > /etc/subuid

 

 

echo tscherf:100000:65536 > /etc/subgid

In diesem Beispiel wird also die erste UID innerhalb eines Containers auf die UID "100000" auf dem Host gemappt. Die letzte UID innerhalb eines Containers lautet "65536" und somit auf dem Host "165535". Das Mapping für die GIDs funktioniert entsprechend: Die ID "0" (root) wird standardmäßig immer auf die UID des Benutzers gemappt, der den Container gestartet hat. Der folgende Podman-Aufruf bestätigt das korrekte Mapping der UIDs und GIDs:

podman run fedora cat /proc/self/uid_map /proc/self/gid_map
0   1000       1
1   100000   65536
0   1000       1
1   100000   65536

Starten Sie nun einen neuen Container, wird der Prozess innerhalb des Containers wie in Listing 1 ersichtlich als root ausgeführt. Auf dem Host-System (Listing 2) läuft der Prozess allerdings unter der ID des Benutzers, der den Container gestartet hat.

Listing 1: Prozess im Container



$ podman run -d fedora sleep 1000
$ podman exec 291ee2dda43e ps -ef
UID          PID           PPID           C           STIME           TTY           TIME           CMD
Root         1                0                  0            19:05             ?               00:00:00      sleep 1000

Listing 2: Prozess auf dem Host



$ ps -ef|grep sleep
Tscherf    30328        29757           0             20:44           ?                00:00:00      sleep 1000
Tscherf    30396        3353             0             20:44           pts/8           00:00:00      grep --color sleep

Anwender können somit innerhalb eines Containers problemfrei Software unter dem Benutzerkontext von root ablaufen lassen, ohne gleichzeitig der Software auch root-Rechte auf dem eigentlichen Host-System geben zu müssen. An dieser Stelle sei aber auch erwähnt, dass rootless-Container manchmal auch gewisse Probleme mit sich bringen. Das betrifft beispielsweise alle Aktionen, bei denen auf dem Host-System root-Rechte notwendig sind.

Wollen Sie beispielsweise ein Netzwerk-Port des Containers auf einen privilegierten Port (<1024) des Hosts mappen, so funktioniert dies nicht, wenn Sie den Container nur mit den Rechten eines Benutzers gestartet haben. In einem solchen Fall ist es dann notwendig, den Container mit root-Rechten auszuführen, da sich anson­s­ten der notwendige Systemaufruf (CAP_NET_BIND_SERVICE) auf dem Host nicht ausführen lässt.

Umgang mit Container-Images

Standardmäßig speichert Podman Container-Images im Verzeichnis "/var/lib/ containers". Dies ist im Standard der Open Container Initiative (OCI) so definiert. Da aber auch nicht privilegierte Benutzer mit Containern arbeiten können, existiert mit "~/.local/share/containers/" ein Speicherort im Home-Verzeichnis eines Benutzers, in dem sich ebenfalls Container-Images hinterlegen lassen.

Die Konfiguration der Storage-Komponente von Podman erfolgt in der Datei "/etc/containers/storage.conf". Ob Sie ein Image mit Docker oder Podman erzeugt haben, spielt keine Rolle, da beide Container-Engines dem OCI-Standard für Container-Images entsprechen und somit auch der Import eines Docker-Images auf einem Podman-Host problemfrei funktioniert. Welche Registries standardmäßig zum Einsatz kommen, zeigt folgender Aufruf an:

podman info --format={{".registries"}}
map[registries:[docker.io registry. fedoraproject.org quay.io registry.access.redhat.com registry.centos.org]]

Mittels »podman pull« holen Sie sich das gewünschte Image auf das lokale System und starten den Container dann mittels »podman run« :

podman pull docker.io/library/httpd

Alternativ dazu können Sie auch direkt einen Container auf Basis des gewünschten Images starten. Sollte es lokal noch nicht vorhanden sein, so lädt podman dieses aus einer der Registries herunter. Sie können die gewünschte Registry auch direkt im Image-Namen mit angeben:

sudo podman run -dt -p 80:80 docker.io/library/httpd httpd -D FOREGROUND

In diesem Fall wird der Container mit root-Rechten gestartet, da der Container-Port 80 an den gleichen Port auf dem Host-System gebunden wird. Dass nun innerhalb des Containers ein Webserver auf dem Port 80 lauscht, zeigt der folgende Aufruf:

links -dump http://localhost
It works!

Der Aufruf von »podman images« beziehungsweise »podman ps« zeigt die vorhandenen Images respektive aktiven Container des Benutzers an. Wie von Docker gewohnt, können Sie Container beziehungsweise Images mit den folgenden beiden Kommandos auch wieder löschen:

podman rmi image

 

podman rm container ID
comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023