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
"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.
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.
Docker kann auch ohne Root-Rechte betrieben werden: https://docs.docker.com/engine/security/rootless/