Rootless Podman

  Lioh Möller   Lesezeit: 5 Minuten  🗪 3 Kommentare

Mit etwas Vorbereitung ist es möglich Podman Container als regulärer Benutzer auszuführen.

rootless podman

Um Podman Container ohne Root-Rechte nutzen zu können, ist je nach Distributionsstand einiges an Vorarbeit notwendig. Voraussetzung ist cgroups-v2.

Prüfen, ob dies aktiviert ist, kann man mit folgendem Befehl:

mount -l | grep cgroup

cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate)

Sollte dies nicht der Fall sein, kann die Bootloader Konfiguration entsprechend angepasst werden.

Dazu muss in der Datei /etc/default/grub der Parameter GRUB_CMDLINE_LINUX erweitert werden:

systemd.unified_cgroup_hierarchy=1

Daraufhin kann die Grub-Konfiguration neu erstellt werden:

# MBR (BIOS)
grub2-mkconfig -o /boot/grub2/grub.cfg

# GPT (UEFI):
# Der Pfad zur grub.cfg muss dabei an die eigenen Gegebenheiten angepasst werden.
grub2-mkconfig -o /boot/efi/EFI/$DISTRIBUTION/grub.cfg

Nach einem Neustart des Systems kann, wie eingangs beschrieben, geprüft werden, ob die Änderungen aktiviert wurden.

Des Weiteren werden folgende Pakete benötigt:

dnf -y install slirp4netns fuse-overlayfs crun podman shadow-utils

Je nach Umgebung kann es ausserdem notwendig sein, die Anzahl der User Namespaces zu erhöhen:

echo "user.max_user_namespaces=28633" > /etc/sysctl.d/userns.conf
sysctl -p /etc/sysctl.d/userns.conf

Nun kann definiert werden, welche Ressourcen dem Benutzer verfügbar gemacht werden sollen:

mkdir -p /etc/systemd/system/user@.service.d

cat << EOF > /etc/systemd/system/user@.service.d/delegate.conf
[Service]
Delegate=cpu cpuset io memory pids
EOF

Nach dem nächsten Login mit einem regulären Benutzerkonto kann geprüft werden, ob dies erfolgreich war:

cat "/sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers"

cpuset cpu memory pids

Bei älteren Distributionen wie EL8 können noch einige zusätzliche Anpassungen notwendig sein. Dies muss nur durchgeführt werden, sofern die Delegation nicht erfolgreich war:

sudo vi /etc/systemd/system/user-0.slice

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target

sudo mkdir /etc/systemd/system/user-.slice.d/

sudo vi /etc/systemd/system/user-.slice.d/override.conf

[Slice]
Slice=user.slice

CPUAccounting=yes
MemoryAccounting=yes
IOAccounting=yes
TasksAccounting=yes

sudo systemctl daemon-reload

Nach einem Neustart sollte nun auch auf diesen Systemen die Konfiguration erfolgreich appliziert werden.

Damit wurden bereits die wichtigsten Vorbereitungen getroffen, um Podman Container ohne Root-Rechte auszuführen.

Das Benutzerkonto muss allerdings noch eine UID- und GID-Range in den Dateien /etc/subuid und /etc/subgid zugewiesen bekommen:

sudo vi /etc/subuid

lioh:200000:65536

sudo vi /etc/subgid

lioh:200000:65536

Der Benutzername muss dabei an die persönlichen Gegebenheiten angepasst werden. Es muss darauf geachtet werden, dass es zu keinen Überlappungen mit vorhandenen uids kommt.

Prüfen lässt sich die Änderung als regulärer Benutzer wie folgt:

podman run  --rm --cpus=0.42 --memory=42m --pids-limit 42 -w /sys/fs/cgroup docker.io/library/alpine cat cpu.max memory.max pids.max

42000 100000
44040192
42

Nun sollte es möglich sein, als unpriviligierter Benutzer Container mit Podman zu starten:

podman run --rm -ti alpine echo hi

Troubleshooting: https://github.com/containers/podman/blob/main/troubleshooting.md

Tags

Podman, Rootless, cgroups, Container

Reto
Geschrieben von Reto am 10. April 2023 um 21:34

"Mit etwas Vorbereitung ist es möglich Podman Container als regulärer Benutzer auszuführen." Dabei stellt sich mir unweigerlich die Frage, wozu? Ich gehe davon aus, dass Lioh durchaus einen Grund hat aber ich kenne den nicht.

Rene
Geschrieben von Rene am 21. April 2023 um 08:00

Der Grund ist Dockers größter Kritikpunkt. Die Container Engine läuft mit Root. Wenn nun eine Container Anwendung kompromitiert wird, kann diese Anwendung am Ende Root auf den Host sein. Ansonsten ist die Anwendung einfach nur ein Benutzer, ohne viel Rechte. Es geht einfach um Sicherheit.

Lioh
Geschrieben von Lioh am 21. April 2023 um 08:08

Docker kann auch ohne Root-Rechte betrieben werden: https://docs.docker.com/engine/security/rootless/