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.