{"id":26254,"date":"2024-03-21T18:17:38","date_gmt":"2024-03-21T17:17:38","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=26254"},"modified":"2024-03-21T18:17:38","modified_gmt":"2024-03-21T17:17:38","slug":"docker-security-hands-on-guide","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/03\/21\/docker-security-hands-on-guide\/","title":{"rendered":"Docker security: Hands-on guide"},"content":{"rendered":"\n<h1 class=\"wp-block-heading has-medium-font-size\">Absichern von Docker Containern, durch die Nutzung von Best Practices in DockerFiles und Docker Compose.<\/h1>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">Einf\u00fchrung<\/h2>\n\n\n\n<p>Es ist sehr wahrscheinlich im Alltag mit containerisierten Anwendungen in Ber\u00fchrung zu kommen, ohne sich dessen bewusst zu sein. In einer Zeit, in der sich der Trend der Unternehmen weiterhin stark in Richtung Cloud bewegt, gewinnen Container immer mehr an Bedeutung. Es ist von hoher Relevanz, diese meist containerisierten Anwendungen mit Best Practices abzusichern, um ein gewisses Ma\u00df an Grundsicherheit zu erreichen. Container bieten einen gro\u00dfen Mehrwert, vor allem in Bezug auf Isolation, Skalierung, Kontrolle und Nutzung der Ressourcen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">Methoden zur Bereitstellung von Anwendungen<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Installation der Anwendung auf einem neuen System und Anpassung an die Umgebung.<\/li>\n\n\n\n<li>Bereitstellung der Anwendung in einem Container, der die Umgebung mit sich bringt.<\/li>\n<\/ol>\n\n\n\n<p>Viele Anwendungen bieten entweder selbst oder durch von der Community entwickelte Container-L\u00f6sungen an, die einfach einzurichten sind und minimale Anstrengungen f\u00fcr die Installation erfordern. Dies ist jedoch nicht immer der Fall oder durch die Individualisierung einer Applikation, muss diese selbst in einem Container verpackt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">Best Practices f\u00fcr den sicheren Build Prozess von Docker Containern<\/h2>\n\n\n\n<p>Um Fl\u00fcchtigkeitsfehler bei der Entwicklung zu vermeiden, ist es wichtig, alle Dateien, die im Container verwendet werden sollen, in einem separaten Verzeichnis zu speichern. Dadurch wird sichergestellt, dass bei der Arbeit mit relativen Pfaden die ben\u00f6tigten Dateien verf\u00fcgbar sind und versehentliche Fehler vermieden werden.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Updated Images<br>Die Aktualisierung der Images ist eine der wichtigsten Ma\u00dfnahmen, die getroffen werden k\u00f6nnen. Es sollte darauf geachtet werden, dass die Images f\u00fcr den produktiven Betrieb geeignet sind. Dazu geh\u00f6rt auch, dass Long-Term-Support (LTS) Images gegen\u00fcber Bleeding Edge Versionen bevorzugt werden sollten.<\/li>\n\n\n\n<li>Trusted Images<br>Der <code class=\"\" data-line=\"\">FROM<\/code> Befehl in einer Dockerfile beschreibt, welches Image f\u00fcr den Docker Container verwendet werden soll. Es gibt keine Garantie daf\u00fcr, dass diese Images weiterhin maintained und zu 100\u00a0% frei von Sicherheitsl\u00fccken sind. Es ist ebenfalls wichtig, signierte Images durch den Docker Content Trust zu verwenden, da so garantiert wird, dass diese nicht durch Dritte ver\u00e4ndert wurden. Empfehlenswert ist auch, die Images zuvor auf Docker Hub zu pr\u00fcfen, da dort aktuelle Sicherheitsl\u00fccken aufgelistet werden. Als Beispiel hier die Analyse des GCC Containers auf <a href=\"https:\/\/hub.docker.com\/layers\/library\/gcc\/9.5.0-bullseye\/images\/sha256-44a9e26a95ca57839a1ac37106f9d93025d508072aa6ea84fcda696737a80bc1?context=explore\">Docker Hub<\/a>.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">FROM alpine:3.19<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Image Version festsetzten<br>Docker Tags sind ver\u00e4nderbar, was nicht garantiert, dass der Tag <code class=\"\" data-line=\"\">IMAGE:1.0<\/code> immer <code class=\"\" data-line=\"\">1.0<\/code> ist. Die Version <code class=\"\" data-line=\"\">1.0<\/code> k\u00f6nnte zum Beispiel ein Alias f\u00fcr die Patch-Version <code class=\"\" data-line=\"\">1.1<\/code> sein. Dies ist ein valider Ansatz, da er es erm\u00f6glicht, Sicherheits-Patches auf ein Image anzuwenden, ohne dass der IT-Administrator die Imageversion f\u00fcr jeden Container \u00e4ndern muss. Dennoch zeigt sich hier das Problem, dass wenn man eine bestimmte Version eines Images verwenden m\u00f6chte, noch weitere Ma\u00dfnahmen ergreifen muss. F\u00fcr jeden Release eines Images wird ein entsprechender Hash generiert, mit dem ein Container eindeutig identifiziert werden kann. Die Verwendung des Hashes im Dockerfile kann dem <code class=\"\" data-line=\"\">FROM<\/code> Befehl hinzugef\u00fcgt werden. Diese Hash kann direkt \u00fcber die <a href=\"https:\/\/hub.docker.com\/layers\/library\/alpine\/3.19\/images\/sha256-6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0?context=explore\">Docker Hub<\/a> eingesehen werden.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">FROM alpine:3.19@sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Minimal Images<br>Das Grundprinzip der Containerisierung besteht darin, nur das in den Container aufzunehmen, was die Anwendung ben\u00f6tigt. Dies bezieht sich nicht nur auf Binaries, sondern auch auf Bibliotheken. Lightweight Linux Distributionen wie <code class=\"\" data-line=\"\">Alpine<\/code> sollten hier das Minimum sein. Images k\u00f6nnen auch durch die Verwendung von distroless-Images wie <code class=\"\" data-line=\"\">gcr.io\/distroless\/base-debian12<\/code> gesichert werden. Diese enthalten nur die Basispakete und nur die Bibliotheken, die zur Ausf\u00fchrung eines Programms ben\u00f6tigt werden, das dynamische Bibliotheken erfordert. Wenn auch diese nicht notwendig sind und die Anwendung statisch gebaut wurde, kann auch das Image <code class=\"\" data-line=\"\">gcr.io\/distroless\/static-debian12<\/code> verwendet werden, welches dann auch diese &#8220;\u00fcberfl\u00fcssigen&#8221; dynamische Bibliotheken entfernt.<\/li>\n\n\n\n<li>Multistage builds<br>Im Sinne des minimal Image Ansatzes wird auch empfohlen, mehrstufige Images zu verwenden, wenn eine Kompilierung von Dateien erforderlich ist. Diese sind n\u00fctzlich, da sie es erm\u00f6glichen, den Build Prozess vom ver\u00f6ffentlichten Docker Container zu trennen. So sollten beispielsweise Build Tools wie GCC nicht in den endg\u00fcltigen Container aufgenommen werden.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\"># &quot;builder&quot; stage\nFROM gcc:9.5.0-bullseye@sha256:44a9e26a95ca57839a1ac37106f9d93025d508072aa6ea84fcda696737a80bc1 as builder\nWORKDIR \/my-app\nCOPY app-src .\/host-path\nRUN |BUILD COMMAND|\n\n# Final stage were we copy artifacts from &quot;builder&quot;\nFROM alpine:3.19@sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0\nCOPY --from=builder |BUILD PATH| |CONTAINER PATH|\nENTRYPOINT &#091;|CONTAINER PATH|]<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rootless containers<br>Das Ausf\u00fchren der Anwendung unter root ist nur in bestimmten F\u00e4llen notwendig und meistens ein Edge Case. Deshalb sollten im Container unterschiedliche Benutzer, UIDs und GIDs verwendet werden.<br>Es sollte darauf geachtet werden, dass der Benutzer Zugriff auf die zu auszuf\u00fchrenden Anwendungsdateien hat.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\"># Create user and set owner and permissions\nRUN adduser -D drunner &amp;&amp; chown -R drunner |APP CONTAINER PATH|\nUSER drunner<\/code><\/pre>\n\n\n\n<p>Optional kann auch der Root Benutzer deaktiviert werden.<br><code class=\"\" data-line=\"\">RUN chsh -s \/usr\/sbin\/nologin root<\/code><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>File read \/ write permissions<br>Es ist zu beachten, dass nur die Dateien und Pfade Schreibrechte haben sollten, die f\u00fcr die Ausf\u00fchrung der Anwendung notwendig sind. In jedem Fall sollte darauf geachtet werden, dass alle ausf\u00fchrbaren Dateien schreibgesch\u00fctzt sind, um eine gewisse Grundsicherheit im Anwendungsablauf zu schaffen.<\/li>\n\n\n\n<li>Ports<br>Damit der Container sicher l\u00e4uft, ist es wichtig, dass nur die Ports ge\u00f6ffnet werden, die f\u00fcr die Nutzung der Anwendung notwendig sind. Bei einer Webanwendung w\u00e4ren dies in diesem Fall 80 (HTTP) und 443 (HTTPS). Idealerweise sollte auch das entsprechende Kommunikationsprotokoll angegeben werden.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\"># Expose ports\nEXPOSE 80\/tcp\nEXPOSE 443\/tcp<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Linting<br>Tools wie <a href=\"https:\/\/github.com\/hadolint\/hadolint\">hadolint<\/a> helfen dabei, einige Best Practices in der Dockerfile zu \u00fcberpr\u00fcfen.<\/li>\n<\/ul>\n\n\n\n<p>Ein Beispiel einer Dockerfile, welche diese Best Practices umsetzt, k\u00f6nnte wie folgt aussehen:<\/p>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\"># &quot;builder&quot; stage\nFROM gcc:9.5.0-bullseye@sha256:44a9e26a95ca57839a1ac37106f9d93025d508072aa6ea84fcda696737a80bc1 as builder\nWORKDIR \/my-app\nCOPY app-src .\nRUN |BUILD COMMAND|\n\n# Final stage were we copy artifacts from &quot;builder&quot;\nFROM alpine:3.19@sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0\nCOPY --from=builder |BUILD PATH| |APP CONTAINER PATH|\n\n# Create user and set owner and permissions\nRUN adduser -D drunner &amp;&amp; chown -R drunner |APP CONTAINER PATH|\nUSER drunner\nENTRYPOINT &#091;|APP CONTAINER PATH|]\n\n# Expose ports\nEXPOSE 80\/tcp\nEXPOSE 443\/tcp<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\">Nutzung von Docker Compose zum bauen von Images<\/h3>\n\n\n\n<p>Um sicherzustellen, dass der Build Prozess immer reproduzierbar bleibt, ist es von Vorteil, den Build in der Docker Compose Datei zu sichern. Der gro\u00dfe Mehrwert dabei ist, dass durch die Versionierung nachvollzogen werden kann, welcher Build Prozess zu welcher Version der Container Images passt. Eine vollst\u00e4ndige Liste der Optionen findet sich unter <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/build\/\">Docker Docs<\/a>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Docker bietet Argument und Environment Variablen zur Verwendung externer Parameter. Es ist zu beachten, dass Argumente nur w\u00e4hrend des Build Prozesses existieren und ab der Laufzeit des Containers nicht mehr verf\u00fcgbar sind.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">build:\n    context: .\n    dockerfile: linux-prod.Dockerfile\n    platforms:\n        - &quot;linux\/amd64&quot;\n    privileged: false\n    network: none\n    args:\n        - VAR_XXX=foobar<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\">Container sicher starten<\/h2>\n\n\n\n<p>An dieser Stelle sei erw\u00e4hnt, dass im Folgenden nur Beispiele mit Docker Compose aufgef\u00fchrt sind. Diese Einstellungen k\u00f6nnen jedoch mit Hilfe der Docker Dokumentation 1 zu 1 in Docker-CLI Kommandos \u00fcbersetzt werden. Der optimale Ansatz, um vergessene Argumente und Fehlverhalten fr\u00fcherer Instanzen zu vermeiden, ist die Verwendung von Docker Compose.<\/p>\n\n\n\n<p>Anhand des folgenden Beispiels werden nun Best Practices in die Konstruktion von Docker Compose Dateien integriert. In diesem Beispiel wird eine Webanwendung erstellt und ausgef\u00fchrt, die sensible Dokumente generiert, um sie f\u00fcr Benutzer zum Herunterladen bereitzustellen.<\/p>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">services:\n  secure-app:\n    build:\n      context: .\n      dockerfile: app.DockerFile\n    ports:\n        - 80<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Temporary mounts<br>Beim Umgang mit sensiblen Dateien ist es wichtig, dass sie nicht f\u00fcr jedermann zug\u00e4nglich sind und nicht dauerhaft gespeichert werden sollten. Unter Linux ist es m\u00f6glich, <code class=\"\" data-line=\"\">tmpfs<\/code> zu verwenden, das daf\u00fcr sorgt, dass Dateien nur im fl\u00fcchtigen Speicher des Hosts gespeichert werden. Nach dem Herunterfahren oder Neustart des Containers werden diese Dateien einfach verworfen.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">tmpfs:\n    - \/app\/sensitiv_data<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ports<br>Die Optionen f\u00fcr die Portfreigabe innerhalb von Docker Compose bieten mehrere M\u00f6glichkeiten. So k\u00f6nnen Ports im Container Netzwerk, Docker Netzwerk oder im Host Netzwerk ge\u00f6ffnet werden. Dies ist jedoch teilweise davon abh\u00e4ngig, welches Netzwerk dem Container zugewiesen wurde und welche Capabilities (Berechtigungen) dem Container zu gewissen sind.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">ports:\n    - &quot;127.0.0.1:8080:80&quot;<\/code><\/pre>\n\n\n\n<p>Anwendungen, die aus dem Internet erreichbar sind, sollten immer nur \u00fcber eine sichere Verbindung zug\u00e4nglich sein. Um den Verwaltungsaufwand zu reduzieren, empfiehlt sich der Einsatz einer Reverse Proxy, \u00fcber die die entsprechenden Zertifikate zentral ausgestellt werden und bestimmte Regeln bez\u00fcglich der Allow- und Blocklist gepflegt werden. Um Ports nur innerhalb des Docker Netzwerks zu \u00f6ffnen, sollte der keywoard expose verwendet werden. Normalerweise befinden sich die Anwendungen in separaten Containernetzen, was zur Isolation beitr\u00e4gt. Um die Dienste jedoch zug\u00e4nglich zu machen, sollte man darauf achten, wie die Ports ge\u00f6ffnet werden.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Capabilities<br>Berechtigungen sollten immer sorgf\u00e4ltig gehandhabt werden, wobei der Allowlist Ansatz verfolgt werden sollte. Es besteht auch die M\u00f6glichkeit, mit den Schl\u00fcsselw\u00f6rtern <code class=\"\" data-line=\"\">cap_drop<\/code> Berechtigungen zu entfernen und <code class=\"\" data-line=\"\">cap_add<\/code> Berechtigungen hinzuzuf\u00fcgen.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">cap_drop:\n    - ALL\ncap_add:\n    - CHOWN<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>UID und GID remapping<br>Um sicherzustellen, dass der interne Benutzer des Containers dem Host im Falle eines Breakouts keinen Schaden zuf\u00fcgen kann, muss die verwendete ID des Containers einem nicht privilegierten Benutzer des Hosts zugeordnet werden. Dadurch wird die Anwendung nicht beeintr\u00e4chtigt, auch wenn der interne Benutzer des Containers der Benutzer &#8220;Root&#8221; sein muss.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">cap_add:\n    - SETGID\n    - SETUID\nuser: 1000:1000<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Permission lock<br>Um zu verhindern, dass der Container weitere Berechtigungen erh\u00e4lt, ist die Verwendung von <code class=\"\" data-line=\"\">opt-securty<\/code> relevant. Dies kann mit der Option <code class=\"\" data-line=\"\">no-new-privileges<\/code> erreicht werden. Weiter Details k\u00f6nnen auf den <a href=\"https:\/\/docs.docker.com\/engine\/security\/seccomp\/\">Docker Docs<\/a> eingesehen werden.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">security_opt:\n    - no-new-privileges:true<\/code><\/pre>\n\n\n\n<p>Eine beispielhafte Docker Compose Datei, die diese Best Practices umsetzt, k\u00f6nnte wie folgt aussehen:<\/p>\n\n\n\n<pre class=\"wp-block-code has-base-color has-secondary-background-color has-text-color has-background\"><code class=\"\" data-line=\"\">services:\n    secure-app:\n        build:\n            context: .\n            dockerfile: app.DockerFile\n        ports:\n            - &quot;127.0.0.1:8080:80&quot;\n        tmpfs:\n            - \/app\/sensitiv_data\n        volumes:\n            - secure-data:\/app\/persistant_storage\n        cap_drop:\n            - ALL\n        cap_add:\n            - CHOWN\n            - SETGID\n            - SETUID\n        user: 1000:1000\n        security_opt:\n            - no-new-privileges:true\n\nvolumes:\n  secure-data:<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Absichern von Docker Containern, durch die Nutzung von Best Practices in DockerFiles und Docker Compose. Einf\u00fchrung Es ist sehr wahrscheinlich im Alltag mit containerisierten Anwendungen in Ber\u00fchrung zu kommen, ohne sich dessen bewusst zu sein. In einer Zeit, in der sich der Trend der Unternehmen weiterhin stark in Richtung Cloud bewegt, gewinnen Container immer mehr [&hellip;]<\/p>\n","protected":false},"author":1194,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[3,342,1020],"ppma_author":[1018],"class_list":["post-26254","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-docker","tag-docker-compose","tag-docker-security"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":26208,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/02\/29\/die-meere-der-systemtechnik-navigieren-eine-reise-durch-die-bereitstellung-einer-aktien-webanwendung-in-der-cloud\/","url_meta":{"origin":26254,"position":0},"title":"Die Meere der Systemtechnik navigieren: Eine Reise durch die Bereitstellung einer Aktien-Webanwendung in der Cloud","author":"mk306","date":"29. February 2024","format":false,"excerpt":"Auf zu neuen Ufern: Einleitung Die Cloud-Computing-Technologie hat die Art und Weise, wie Unternehmen Anwendungen entwickeln, bereitstellen und skalieren, revolutioniert. In diesem Beitrag, der im Rahmen der Vorlesung \u201c143101a System Engineering und Management\u201d entstanden ist, werden wir uns darauf konzentrieren, wie eine bereits bestehende Webanwendung zur Visualisierung und Filterung von\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":22623,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/30\/webassembly-das-neue-docker-und-noch-mehr\/","url_meta":{"origin":26254,"position":1},"title":"WebAssembly: Das neue Docker und noch mehr?","author":"Raphael Wettinger","date":"30. March 2022","format":false,"excerpt":"If WASM+WASI existed in 2008, we wouldn't have needed to created Docker. That's how important it is. Webassembly on the server is the future of computing. A standardized system interface was the missing link. Let's hope WASI is up to the task! Tweet, Solomon Hykes (Erfinder von Docker), 2019 Dieser\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":22187,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/","url_meta":{"origin":26254,"position":2},"title":"Software Dependencies &#8211; Die Gefahr aus der Tiefe","author":"Eric Prytulla","date":"25. February 2022","format":false,"excerpt":"\"Unbekannte infiltrieren Paketmanager npm und verseuchen Tools mit Schadcode\" hei\u00dft es am 08.11.2021 auf heise online. Die Nutzeraccounts der Maintainer von coa und rc wurden gehackt und neue Versionen dieser Pakete hochgeladen (inklusive Malware). Zwar denken sich bestimmt viele bei coa und rc: \"Aha toll\", aber sp\u00e4testens bei React oder\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":23412,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/22\/migration-einer-rest-api-in-die-cloud\/","url_meta":{"origin":26254,"position":3},"title":"Migration einer REST API in die Cloud","author":"Raphael Kienh\u00f6fer","date":"22. August 2022","format":false,"excerpt":"Im Rahmen der Vorlesung \"Software Development f\u00fcr Cloud Computing\" haben wir uns zum Ziel gesetzt, eine bereits bestehende REST API in die Cloud zu migrieren.","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":28654,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/28\/multiplayer-arena-dynamische-game-sessions-mit-docker-fastapi\/","url_meta":{"origin":26254,"position":4},"title":"Multiplayer-Arena: Dynamische Game-Sessions mit Docker &amp; FastAPI","author":"Emre Kalkan","date":"28. February 2026","format":false,"excerpt":"Game: https:\/\/46.101.127.20.sslip.io\/ (online bis 31. M\u00e4rz 2026) (beachte Readme im Git!) Git Repo: https:\/\/github.com\/ek101-collab\/ArenaGame-with-ContainerSessions Einleitung und Motivation Im Rahmen der Vorlesung \"System Engineering und Management\" bestand die Kernaufgabe darin, ein Projekt zu konzipieren und umzusetzen, das moderne Web- und Cloud-Technologien nutzt. Zu Beginn der Projektphase lag mein Fokus auf einer\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":28084,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/09\/14\/springboot-zu-serverless-probleme-und-paradigmen\/","url_meta":{"origin":26254,"position":5},"title":"Springboot zu Serverless: Probleme und Paradigmen","author":"Julian Schniepp","date":"14. September 2025","format":false,"excerpt":"Im Rahmen der Vorlesung \u201eSoftware Development for Cloud\u00a0Computing\u201c sollte jedes Team ein eigenes Cloud\u2011Projekt umsetzen. Unser Projekt Taskflow sollte dabei ein serverloses Todo\u2011Management\u2011System werden. Ziel war es dabei, neue und vor allem industrierelevante Cloud\u2011Technologien praktisch zu erlernen. Der Backend\u2011Teil ist mit Spring\u2011Boot realisiert, welcher \u00fcber AWS\u00a0Lambda und API\u00a0Gateway bereitgestellt modular\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":1018,"user_id":1194,"is_guest":0,"slug":"maximilian_tellmann","display_name":"Maximilian Tellmann","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/c50c5c72d3917abd292ee893cd012b2e903fdd7dcd909a6a41517a8ef59a5c76?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1194"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=26254"}],"version-history":[{"count":2,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26254\/revisions"}],"predecessor-version":[{"id":26256,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/26254\/revisions\/26256"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=26254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=26254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=26254"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=26254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}