Zum Inhalt springen

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.


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: true

Schreibzugriffe 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:ro

Dadurch können beispielsweise deps- oder app-Container den Code verwenden, ohne ihn zu verändern.

Der dev-Container bildet hier eine bewusste Ausnahme und erhält Schreibzugriff auf den Workspace.


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_modules

Damit wird klar definiert, welche Pfade persistente Änderungen enthalten dürfen.


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-cache

Dieses Muster reduziert Seiteneffekte und verhindert, dass Container dauerhafte Zustände im Workspace oder in Volumes erzeugen.


Nicht benötigte Projektverzeichnisse werden innerhalb einzelner Container per tmpfs1 überdeckt.

compose.yml

tmpfs:
- /workspaces/security-oriented-dev-container-project/.git:rw,nosuid,nodev

Dies 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.


Container erhalten nur die minimal notwendigen Berechtigungen.

compose.yml

cap_drop:
- ALL
security_opt:
- no-new-privileges=true
pids_limit: 512

Diese Einschränkungen reduzieren die Angriffsfläche und verhindern unerwartete Privileg-Erweiterungen.


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.

  1. Informationen zu rw,nosuid,nodev können der dem FAQ entnommen werden.