Containervirtualisierung
Containervirtualisierung
Grundlagen
Durch Containerisierungkönnen auf einer Maschine mehrere unterschiedliche Umgebungen, sogenannte Container mit zumeist einzelnen Applikationen laufen. Logische Gruppen von Applikationen (z.B. Webserver und Datenbank) werden in separaten Containern ausgeführt undübervirtuelle Netzwerke miteinander verbunden. Im Vergleich zur Virtualisierung ist der Ansatz derContainerisierungleichtgewichtiger, weil nicht für jede Umgebung ein vollständiger Computer virtualisiert wird, sondern lediglich das Betriebssystem, sowie die darauf laufende Applikation.Dader Kerneldes Hostsystems verwendet wird und ein Container immer Applikationsspezifisch konfiguriert wird, können einzelne Container minimale Betriebssystemumgebungen enthaltenund dadurchsehr klein sein. So benötigen Container mit einer Linux Alpine-Installation in der Grundinstallation nur wenige Megabyte Speicherplatz. Containerisierung zähltzwarim Allgemeinen zurVirtualisierung, da es eine ähnliche Aufgabe erfüllt, unterscheidet sich jedoch technisch sehr stark von klassischer Virtualisierung auf Hypervisor-Ebene. Die Abtrennung der Prozesse innerhalb eines Containers vom restlichen System basiert auf Linux-Kernel-Funktionen wienamespacesundcgroups[1][2]. Eines der Kernelemente der Containerisierung ist das Lösen des Abhängigkeitsproblems von Applikationen, ohne dabei das hohe Gewicht einer vollständigen Virtualisierungmitzubringen. So können problemlos mehrere unterschiedliche OS-Versionen auf dem gleichen Host-System laufen und damit auch Applikation,die unterschiedliche Versionenvon Systembibliotheken benötigen.
Sicherheit und Forensik
Datensicherung
Container sind oftmals noch weniger auf Persistenz ausgelegt als Virtuelle Maschinen. BeiBedarfwerden bestehende Container vom Systemneugestartet oderverworfen, beispielsweise, wenndieseabstürzenoder durch Aktualisierungneuerstelltwerden. Die Daten,die nicht persistent außerhalb des Containers gespeichert werden,gehen bei diesemVorgangverloren. Im forensischen Prozess sind,aus diesem Grund, laufende Container besonders zu beachten und frühzeitig zu sichern. Zwar werden die Änderung zur Laufzeit normalerweise nicht persistent gespeichert, jedoch liegen diese in Form von gelöschtenlayerFS-images auf dem Hostsystem vor.Überfilecarvingkönnen daher unter Umständen Daten von gestoppten Containern wiederhergestellt werden.
Root-Rechte
Häufigwerden Container-Imagesmit root-Rechten konfiguriert, da dieBetriebssystem-Basisimages ebenfalls mit root eingerichtet werden. Unerfahrene Entwickler verwenden oft weiterhin den root-User zur Konfiguration der eigenen Anwendung, anstatt zur Ausführung der Applikation im Container einen User mit geringeren Rechtenanzulegen. Dank der Isolation des Prozesses innerhalb des Containers erzeugt dies häufig keine Sicherheitsprobleme,einefehlerhafte Konfigurationdes Containers (z.B. durch mounten von /dev/ oder anderensystemrelevanten Verzeichnissenin den Container hinein) kannjedochSicherheitslücken zur Folge haben die dem Forensiker hilfreich sein können.
Updates
Da jeder Container seine eigene Basisinstallation enthält und damit auch Systembibliotheken, müssen Container in regelmäßigen Abständen mit den Pakettools des jeweiligen OS aktualisiert werden, um sicherheitsrelevante Patches zu erhalten. Die Aktualisierung des Host-Systems ist in keinem Fall ausreichend.
Anwendungsbeispiel
In folgendem kurzen Beispiel soll verdeutlicht werden, wie ein Container (fehl-)konfiguriert wird. Auf dem Hostsystem läuft Ubuntu 20.04 LTS. Auf die Installation vondockerals Container-Umgebung soll hier nicht im Detail eingegangen werden. Siehe dazu [3] Als Grundlage wird eindebian10 minimal Image verwendet. In diesem Container soll einenginx-Installation eine Webseite über https bereitstellen, welche vorher bereits ohne Container auf demselben Rechner lief. Auf dem Hostsystem läuftdie vorherigelet’s-encrypt-Installation(certbot), so dass auf dem Hostsystem unter /etc/letsencryptdie notwendigen Zertifikate installiert sind. Die Konfiguration vonnginxist ebenfalls auf dem Hostsystem vorhanden.(unter /etc/nginx/). Der Ersteller des Images möchte sich die Arbeit vereinfachen und mountet das /etc/-Verzeichnis des Hostsystems in den Container hinein, so dass sowohl dielets-encrypt-Zertifikate, als auch dienginx-Installation vorkonfiguriert sind. Das gleiche passiert mit dem /var/www/html/-Verzeichnis des Hostsystems in dem die statischen Dateien des Webservers liegen. Bei der Installation hat der Ersteller nicht darauf geachtet, dass der root-User standardmäßig zur Ausführung des Container-Prozesses verwendet wird.Nginxläuft demnach mit root-Rechten und hat Zugriff auf das gesamte /etc/-Verzeichnis des Hostsystems. Zusätzlich wird das Betriebssystem-Image nach der Installation über längere Zeiträume nicht mehr aktualisiert, so dass wichtige Patches fehlen. Ein Angreifer kann so leicht unter Verwendung von alten Sicherheitslücken in das System eindringen und beispielsweise die Konfiguration desssh-daemonsunter /etc/ssh/ verändern, um eigenen Zugang zum Hostsystem zu erlangen.
Recovery von Dateien
Aus Sicht der digitalen Forensik ist es von Interesse zu wissen, wie Container Daten speichern und Protokolle exportieren. [4] Container verwenden Union-Dateisysteme, um gemeinsam genutzte untere Image-Schichten zu verwalten und die Plattennutzung zu reduzieren. Das bedeutet, dass alle Schichten innerhalb der Kette gemountet werden müssen, um eine vollständige Ansicht des Dateisystems eines Containers zu erhalten. Dies kann manuell erfolgen. Der Docker Explorer kann diesen Vorgang beschleunigen denn er verfügt über Funktionen zum Mounten aller Ebenen in einer Kette mit einer Container-ID. In der Regel exportiert Docker die Logs einer containerisierten Anwendung auf dem Container-Host in Form einer JSON-Datei im Docker-Verzeichnis. Container können jederzeit angehalten werden. Die Containerausführung wird vollständig ausgesetzt, Speicher bleibt zugewiesen, Volumes bleiben bereitgestellt usw. Container können unter Quarantäne gestellt werden, indem Netzwerkzugriffs- oder Systemaufrufberechtigungen entfernt werden. Die Containerprozesse werden weiterhin ausgeführt, können jedoch keine Daten senden, empfangen, lesen oder schreiben oder sogar vorhandenen Speicher aufheben. Das kann jedoch zu Fehlern führen und je nachdem, wie die Prozesse mit diesen Fehlern umgehen, kann dies den Container stoppen.
Referenzen:
[1] https://docs.docker.com/get-started/#what-is-a-container
[2] https://medium.com/@saschagrunert/demystifying-containers-part-i-kernel-space-2c53d6979504
[3] https://docs.docker.com/engine/install/ubuntu/
[4] https://www.openshift.com/blog/docker-forensics-for-containers-how-to-conduct-investigations
[5] https://osdfir.blogspot.com/2021/01/container-forensics-with-docker-explorer.html
[6] https://github.com/search?q=container+forensic
[7] PC-FORENSIK, Christoph Willer, 1. Auflage, 2012 by C&L Computer und Literaturverlag