Zum Hauptinhalt springen

Maßnahmen

Implementierung von Best Practices für die Container- und Image-Sicherheit

Nicht-Wurzel-Behälter

Maßnahme: Konfigurieren Sie Container immer so, dass sie als Nicht-Root-Benutzer laufen, um den Zugriff auf sensible Host-Ressourcen einzuschränken. Stellen Sie sicher, dass der Benutzer innerhalb des Containers nicht mit einem Host-Benutzer identisch ist.

Vorteil: Die Minimierung der Privilegien in Containern verhindert, dass Angreifer auf sensible Host-Ressourcen zugreifen können, selbst wenn der Container kompromittiert wurde.

Example in Dockerfile:

RUN useradd -d /home/appuser -m -s /bin/bash appuser

USER appuser

Verwendung von vertrauenswürdigen und geprüften Images

Maßnahmen: Verwenden Sie immer Container-Images aus vertrauenswürdigen Repositories, vorzugsweise offizielle Images. Scannen Sie Images regelmäßig auf Schwachstellen mit Tools wie Trivy, Clair usw.

Vorteil: Die Verwendung verifizierter Images verringert das Risiko, Schwachstellen oder bösartigen Code in den Cluster einzuschleusen.

 

Unveränderlichkeit von Containern

Maßnahme: Stellen Sie sicher, dass Container unveränderbar bleiben, indem Sie den Schreibzugriff auf kritische Verzeichnisse deaktivieren und Container so konfigurieren, dass sie mit einem schreibgeschützten Dateisystem laufen. Erlauben Sie Schreibzugriff nur auf notwendige Verzeichnisse.

Vorteil: Die Aufrechterhaltung der Unveränderbarkeit von Containern verringert das Risiko von Manipulationen oder unbefugten Änderungen und stellt sicher, dass die Container wie erwartet laufen.

Dockerfile-Befehl:

RUN chmod 0444 /* && chmod 0755 /writable-dir

Microservices-Architektur

Aktion: Halten Sie sich an das Prinzip der Microservices, indem Sie eine Anwendung oder einen Prozess pro Container ausführen. Vermeiden Sie die Verwendung von Containern, die mehrere Prozesse oder Dienste beherbergen.

Vorteil: Die Isolierung von Diensten in einzelnen Containern ermöglicht eine einfachere Überwachung und verringert die Angriffsfläche.

 

Schreibgeschütztes Dateisystem für Container

Maßnahme: Konfigurieren Sie Container so, dass sie mit einem schreibgeschützten Dateisystem arbeiten und nur bei Bedarf Schreibzugriff auf bestimmte Verzeichnisse ermöglichen.

Vorteil: Verhindert unautorisierte Änderungen am Dateisystem und schränkt die Möglichkeiten von Angreifern ein, Dateien innerhalb des Containers zu installieren oder zu verändern.

 

Beispiel für eine Kubernetes-Pod-Definition mit schreibgeschütztem Dateisystem:

apiVersion: v1

kind: Pod

metadata:

  name: secure-pod

spec:

  containers:

  - name: myapp

    image: myapp:latest

    securityContext:

      readOnlyRootFilesystem: true

Vermeiden von privilegierten Containern

Maßnahme: Verwenden Sie bei der Ausführung von Containern nicht die Option --privileged. Wenn zusätzliche Fähigkeiten benötigt werden, gewähren Sie selektiv bestimmte Fähigkeiten, anstatt volle Privilegien zu gewähren.

Vorteil: Die Vermeidung von privilegierten Containern begrenzt den potenziellen Schaden im Falle eines Sicherheitsverstoßes und verringert die Möglichkeiten des Angreifers, den Host zu kompromittieren.


Vermeiden Sie das Mounten sensibler Host-Verzeichnisse

Maßnahme: Hängen Sie keine sensiblen Host-Verzeichnisse (z. B. /etc, /root oder /var/run/containerd.sock) in Container ein. Verwenden Sie Kubernetes ConfigMaps und Secrets für die Verwaltung von Konfiguration und sensiblen Daten.

Vorteil: Verhindert den unbefugten Zugriff auf sensible Hostdateien und -verzeichnisse und verringert so das Risiko einer Datenpreisgabe oder Systemgefährdung.


Beispiel für eine Kubernetes-ConfigMap für vertrauliche Daten:

apiVersion: v1

kind: ConfigMap

metadata:

  name: app-config

data:

  config.yaml: |

    key: value

Versionskontrolle von Images

Maßnahme: Geben Sie in Dockerdateien immer die Version oder das Tag von Basis-Images und Abhängigkeiten an. Vermeiden Sie die Verwendung des neuesten Tags, um Reproduzierbarkeit und Sicherheit zu gewährleisten.

Vorteil: Es wird sichergestellt, dass die exakte Version des Abbilds verwendet wird, wodurch verhindert wird, dass unerwartete Änderungen oder Schwachstellen während des Builds eingeführt werden.

Beispiel in Dockerfile:

Dockerfile

FROM ubuntu:20.04

Paketverwaltung und -entfernung

Aktion: Installieren Sie nur notwendige Pakete während der Image-Erstellung und entfernen Sie Paketmanager nach der Verwendung, um Installationen in laufenden Containern zu verhindern.

Nutzen: Verringert die Angriffsfläche und verhindert die Installation nicht autorisierter Software in Containern.

Example in Dockerfile:

RUN apt-get install -y <package> && apt-get purge -y apt-get

Persistente Volume-Nutzung

Aktion: Verwenden Sie Kubernetes Persistent Volumes (PVs) zum Speichern persistenter Daten, um sicherzustellen, dass Benutzerdaten, Konfigurationsdateien und Protokolle außerhalb des Containers gespeichert werden.

Vorteil: Container-Images bleiben schlank und zustandslos, was die Skalierbarkeit und Ausfallsicherheit verbessert.

 


Beispiel für eine Kubernetes-PVC-Definition:

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: app-pvc

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 1Gi

Die Einhaltung der Best Practices für Container- und Image-Sicherheit gewährleistet, dass Ihre Kubernetes-Umgebung sicher und effizient bleibt. Durch die Implementierung von Containern ohne Root-Rechte, die Verwendung von vertrauenswürdigen Images, die Aufrechterhaltung der Unveränderlichkeit und die sichere Konfiguration von Containern verringern Sie die Risiken von unbefugtem Zugriff, Privilegienerweiterung und Systemkompromittierung. Aktualisieren und scannen Sie Images regelmäßig, um sie an die sich entwickelnden Sicherheitsbedrohungen anzupassen, und nutzen Sie Kubernetes-eigene Mechanismen wie ConfigMaps, Secrets und PersistentVolumes, um die Sicherheit weiter zu erhöhen.


Folgende Risiken sind hier enthalten