Designprinzipien
Die Container in der compose.yml folgen einigen wiederkehrenden technischen Prinzipien.
Die einzelnen Services (Container) unterscheiden sich später hauptsächlich darin, welche dieser Prinzipien angewendet werden und wo bewusst Ausnahmen gemacht werden.
Read-only Root Filesystem
Abschnitt betitelt „Read-only Root Filesystem“Container werden nach Möglichkeit mit einem read-only Root Filesystem betrieben. Dadurch können nur explizit freigegebene Pfade beschrieben werden.
compose.yml
read_only: trueSchreibzugriffe erfolgen ausschließlich über definierte Mounts wie Volumes oder tmpfs.
So wird verhindert, dass Container unbeabsichtigt Zustand außerhalb der vorgesehenen Bereiche innerhalb des Containers erzeugen.
Read-only Workspace in nicht-interaktiven Containern
Abschnitt betitelt „Read-only Workspace in nicht-interaktiven Containern“Container, die den Sourcecode nicht verändern sollen, erhalten den Workspace read-only (:ro).
compose.yml
- ..:/workspaces/security-oriented-dev-container-project:roDadurch können beispielsweise
deps- oderapp-Container den Code verwenden, ohne ihn zu verändern.
Der dev-Container bildet hier eine bewusste Ausnahme und erhält Schreibzugriff auf den Workspace.
Beschreibbare Bereiche über explizite Mounts
Abschnitt betitelt „Beschreibbare Bereiche über explizite Mounts“Schreibzugriff wird gezielt über Volumes oder Bind Mounts erlaubt. Typische Beispiele sind Dependency-Verzeichnisse oder Tool-State.
compose.yml
volumes: - root_node_modules:/workspaces/security-oriented-dev-container-project/node_modulesDamit wird klar definiert, welche Pfade persistente Änderungen enthalten dürfen.
Temporäre Laufzeitdaten unter /tmp
Abschnitt betitelt „Temporäre Laufzeitdaten unter /tmp“Caches und temporäre Laufzeitdaten werden bewusst nicht persistent gespeichert, sondern im Container unter /tmp abgelegt.
compose.yml
environment: HOME: /tmp NPM_CONFIG_CACHE: /tmp/npm-cacheDieses Muster reduziert Seiteneffekte und verhindert, dass Container dauerhafte Zustände im Workspace oder in Volumes erzeugen.
Ausblenden von Workspace-Verzeichnissen
Abschnitt betitelt „Ausblenden von Workspace-Verzeichnissen“Nicht benötigte Projektverzeichnisse werden innerhalb einzelner Container per tmpfs1 überdeckt.
compose.yml
tmpfs: - /workspaces/security-oriented-dev-container-project/.git:rw,nosuid,nodevDies ist relevant wenn das Projektverzeichnis in den Container gemountet wird, einzelne Verzeichnisse wie Secret-Dateien, Repository-Metadaten, Git-Historie oder IDE-Konfigurationen jedoch im Container nicht sichtbar sein sollen.
Minimale Container-Rechte
Abschnitt betitelt „Minimale Container-Rechte“Container erhalten nur die minimal notwendigen Berechtigungen.
compose.yml
cap_drop: - ALLsecurity_opt: - no-new-privileges=truepids_limit: 512Diese Einschränkungen reduzieren die Angriffsfläche und verhindern unerwartete Privileg-Erweiterungen.
Lokale Port-Freigaben
Abschnitt betitelt „Lokale Port-Freigaben“Services werden ausschließlich lokal auf 127.0.0.1 unter z.B. Port 3000 bereitgestellt.
compose.yml
ports: - "127.0.0.1:3000:3000"Dadurch sind Entwicklungsservices nicht im gesamten Netzwerk erreichbar.