Als ich über Podman las, habe ich mir immer die Frage gestellt, wieso hat Redhat ihr eigenes Projekt gemacht, das ähnlich wie Docker ist, anstatt Pull Requests mit Verbesserungen an Docker zu schicken? Die Antwort kam mit der Geschichte von Skopeo.

Skopeo :

Skopeo ist die Inspiration und der Anfang von Podman. Skopeo bedeutet “Remote-Suchen” in griechischer Sprache. Das Redhat-Team hat sich gefragt, wieso zuerst ein Image mit hunderten von MB von der Registery gezogen werden muss, um nachschauen zu können, ob man das gewollte Image hat? Wenn ja, behält man es und wenn nein, schmeißt man es weg. Aufgrund dessen hat Redhat ein Pull Request an Docker-Project geschickt. Das Docker-Team hat verweigert die Pull Request anzunehmen und hat gemeint, das schadet dem API und dem CLI von Docker. Deshalb soll das Redhat-Team sein eigenes Tool entwickeln. So kamen Skopeo und die nachträglichen Gedanken von Podam-Project zur Welt. Skopeo bot am Anfang die Möglichkeit die JSON Datei von einem Image herunterzuladen. Scopeo kann mittlerweile folgendes: Images pullen, pushen, Kopieren zwischen Registerys ohne dazwischen lokal pullen zu müssen. Alles passiert ohne Root-Rechte.

$ mkdir fedora-24
$ skopeo copy docker://fedora:24 dir:fedora-24
$ tree fedora-24
fedora-24
├── 7c91a140e7a1025c3bc3aace4c80c0d9933ac4ee24b8630a6b0b5d8b9ce6b9d4.tar
├── f9873d530588316311ac1d3d15e95487b947f5d8b560e72bdd6eb73a7831b2c4.tar
└── manifest.json

Woher kommt der Name

Der Name Podman ist ein Kürzel für Pod Manager. Die Container-Orchestrierung Kubernetes hat den Begriff Pod geprägt. Er beschreibt eine Gruppe von Containern, die sich bestimmte Ressourcen teilen und nicht völlig isoliert voneinander laufen. Während Docker Pods nur indirekt über Kubernetes unterstützt wird, sind sie ein integraler Bestandteil von Podman. Eine Gruppe von Robben bedeutet “pod”, deshalb hat sich Redhat für drei Robben als Logo für Podman entschieden.

Ein Infra-Container verrichtet keine Arbeit, sorgt aber dafür, dass bestimmte Ressourcen des Pods wie Namespaces, CGroups und Netzwerk-Ports am Leben bleiben. Obwohl Podman dem Fork-Exec-Modell folgt und damit nicht als Server läuft, benötigen wir dennoch einen Prozess, der Container überwacht, um etwa Logs und Exit-Codes zu sichern. Dies ist die Aufgabe von Conmon, ein kleines, in C geschriebenes Monitoring-Werkzeug, dass jedem Container angehängt wird. Neben dem Monitoring hält Conmon das Terminal des Containers offen, um per podman exec zu einem späteren Zeitpunkt das Terminal verwenden zu können.

Aus der Grafik ist ebenfalls die runc zu entnehmen. Runc ist für die Ausführung eines Container-Prozesses zuständig und implementiert die Runtime-Spezifikation der OCI (Open Containers Initiative). Redhat, IBM, Google, Microsoft, Docker und andere Unternehmen haben sich 2015 ausgetauscht und definiert ” was ein Image eines Containers bedeutet und wie dies ausschauen soll”. Die Einigung haben sie als Standards für den Image-Aufbau für die Industrie genommen und OCI (Open Containers Initiative) genannt.

# yum install podman
$ sudo podman pod create --name podtest
$ sudo podman pod ps
$ sudo podman create --pod podtest -d fedora sleep 600
$ sudo podman create --pod podtest -d fedora  sleep 600
$ sudo podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

$ sudo podman pod start podtest
$ sudo podman ps -ap
CONTAINER ID  IMAGE                            COMMAND    CREATED        STATUS             PORTS  NAMES               POD
5f41beccf4d7  docker.io/library/fedora:latest  sleep 600  3 minutes ago  Up 34 seconds ago         awesome_sinoussi    74b9151c37cc
657ce4a71207  docker.io/library/fedora:latest  sleep 600  3 minutes ago  Up 34 seconds ago         romantic_bell       74b9151c37cc
f0d8ce498347  k8s.gcr.io/pause:3.1                        3 minutes ago  Up 3 minutes ago          74b9151c37cc-infra  74b9151c37cc
## Löschen
$ sudo podman stop Container1 Container2 .....
$ sudo podman rm Container1 Container2 .....
$ sudo podman rm podtest

Wie unterscheidet sich Podman von Docker ?

 01- Mehr Sicherheit mit rootless-Feature:

Der Container kann ohne root-Rechte ausgeführt werden, allerdings werden Befehle innerhalb des Containers vom root-Benutzer gesteuert. Das heißt im Enddefekt, einem Benutzer bzw. Entwickler müssen keine root-Rechte vergeben werden,um ein Container starten oder ein Image aufbauen zu können. Das schützt den Host vor Angriffen. Ohne dies können Angriffe durch Ausführen der Container-Images gelingen. Es könnte aus dem Container ausgebrochen und beliebiger Code auf dem Host als Root-Benutzer ausgeführt werden.

$ sudo podman pull docker.io/library/alpine:latest
$ sudo podman run -d alpine top
$ sudo podman exec b53c74f9d2d7 ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 top
   35 root      0:00 ps -ef
$ ps -ef | grep top
root      3859  3850  0 10:05 ?        00:00:00 top
training  4514  3551  0 10:30 pts/0    00:00:00 grep --color=auto top

02- Podman folgt dem Ausführenden einer Aktion nach dem Fork-Exec-Modell ,Docker jedoch nicht

Bei Podman bleibt die UID das glieche auch innerhalb des Containers. Dies ermöglicht dem Benutzer zu folgen.

[training@agent ~]$ cat /proc/self/loginuid
1000
[training@agent ~]$ sudo -i
[root@agent ~]# cat /proc/self/loginuid
1000						 
[training@agent ~]$ sudo podman run -ti fedora bash -c "cat /proc/self/loginuid; echo"
1000
[training@agent ~]$ sudo docker run -ti fedora bash -c "cat /proc/self/loginuid; echo"
4294967295                                  
[training@agent ~]$ sudo auditctl -w /etc/shadow      
[training@agent ~]$ sudo podman run --privileged -v /:/host fedora touch /host/etc/shadow
[training@agent ~]$ sudo ausearch -m path -ts recent -i | grep touch | grep --color=auto 'auid=[^ ]*'
type=SYSCALL msg=audit(05/23/2019 08:46:33.174:1189) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7ffd3963ef3a 
a2=O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK a3=0x1b6 items=2 ppid=15917 pid=15926 auid=training uid=root gid=root euid=root suid=root
fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=21 comm=touch exe=/usr/bin/touch subj=unconfined_u:system_r:spc_t:s0 key=(null)

[training@agent ~]$ sudo docker run --privileged -v /:/host fedora touch /host/etc/shadow
[training@agent ~]$ sudo ausearch -m path -ts recent -i | grep touch | grep --color=auto 'auid=[^ ]*'
type=SYSCALL msg=audit(05/23/2019 08:55:51.905:1224) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7ffe3699ef56
a2=O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK a3=0x1b6 items=2 ppid=16023 pid=16036 auid=unset uid=root gid=root euid=root suid=root
fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=touch exe=/usr/bin/touch subj=system_u:system_r:spc_t:s0 key=(null) 

Fazit: Wenn ein Benutzer mit Sudo-Rechten irgendetwas auf dem System macht, wird dies vom auditd-System aufgezeichnet. Mit einem Zugang zu Docker-Socket, ist dies nicht der Fall.

03- Steuerung und Struktur:

Der Docker-Seite: In der Tat wird alles von daemon gemanaged z.B registries, images, containers, und kernel. Der Docker command-line interface (CLI) schickt die Befehle zum daemon zur Bearbeitung und bekommt eine Antwort zurück.

Von dem Modell können wir entnehmen, dass wenn ein Fehler den Daemon trifft, funktioniert Docker nicht mehr plus wird verwaiste Prozesse hinuntergelassen.

Von Podman Seite: alles wird von runc gestuert anstatt daemon, welche oben schon erklärt ist

04 – Intigration mit systemd

  •  Podman kann Sytemd innterhalb des Contaainers am laufen bringen
  • Ünterstutzt sd_notify
  • Socket aktivation

Remote Api für Podman

  • Ünterstutzt Varlink
  • Sockt Aktivation für den podman-API
[Unit]
Description=Podman Remote Api Service
Requires=io.podman.socket
After=io.podman.socket
Documentation=man:podman-varlink(1)

[Service]
Type=simple
ExecStart=/usr/bin/podman varlink unix:/run/podman/io.podman

[Install]
WantedBy=multi-user.target
Also=io.podman.socket
Afeef Ghannam
Afeef Ghannam
Junior Consultant

Afeef macht seit September 2017 eine Ausbildung zum Fachinformatiker für Systemintegration bei NETWAYS. Nachdem der gebürtige Syrer erfolgreich Deutsch gelernt hat, stellt er sich jetzt der Herausforderung Programmiersprache. Neben der IT schätzt er vielfältiges Essen. Sein Motto lautet يد واحدة لا تصفق لوحدها , was so viel bedeutet wie „Eine Hand wird nie allein klatschen“.