Image-Scanning und Schwachstellenmanagement im Build-Prozess

Die Grundlage jeder robusten Container-Sicherheitsstrategie bildet die Integrität der Container-Images selbst. Ein „Shift-Left“-Ansatz, bei dem Sicherheitsprüfungen so früh wie möglich im Softwareentwicklungszyklus (SDLC) durchgeführt werden, ist hier unerlässlich. Das Scannen von Container-Images auf Schwachstellen und Fehlkonfigurationen noch bevor sie in Produktion gehen, minimiert das Risiko erheblich.

Bedeutung des Image-Scannings

Image-Scanning-Tools analysieren die Schichten eines Container-Images, identifizieren installierte Pakete, Bibliotheken und deren Versionen. Sie gleichen diese Informationen mit bekannten Schwachstellendatenbanken (CVEs) ab. Darüber hinaus können sie auch nach unsicheren Konfigurationen, hartkodierten Secrets oder Lizenzverletzungen suchen. Ein proaktives Scannen hilft,:

  • Bekannte Schwachstellen (CVEs) in Betriebssystempaketen und Anwendungsabhängigkeiten zu finden.
  • Unsichere Konfigurationen oder Best Practices-Verletzungen im Dockerfile zu erkennen.
  • Die Einhaltung von Compliance-Richtlinien sicherzustellen.

Integration in CI/CD-Pipelines

Um maximale Effektivität zu erzielen, muss das Image-Scanning automatisiert und fest in die CI/CD-Pipeline integriert werden. Bei jedem Code-Commit oder Image-Build sollte ein Scan durchgeführt werden. Kritische Schwachstellen oder Compliance-Verstöße sollten den Build-Prozess unterbrechen (als „Quality Gate“), um sicherzustellen, dass nur sichere Images bereitgestellt werden.

# Beispiel: Integration eines Image-Scans in eine CI/CD-Pipeline
stages:
  - build
  - scan
  - deploy

build-image:
  stage: build
  script:
    - docker build -t my-app:$(CI_COMMIT_SHORT_SHA) .

scan-image:
  stage: scan
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL my-app:$(CI_COMMIT_SHORT_SHA)
    - echo "Image-Scan erfolgreich. Keine kritischen Schwachstellen gefunden."
  allow_failure: false # Stoppt die Pipeline bei kritischen Schwachstellen

Auswahl des richtigen Tools

Es gibt eine Vielzahl von Image-Scanning-Tools, sowohl Open Source als auch kommerziell. Zu den beliebtesten Open-Source-Tools gehören:

  • Trivy: Schnell, einfach zu bedienen und deckt Betriebssystempakete, Anwendungsabhängigkeiten, IaC und Kubernetes ab.
  • Clair: Eine Open-Source-API für das statische Scannen von Containern auf Schwachstellen.
  • Anchore Engine: Bietet erweiterte Richtlinien-Engine und tiefere Analysefunktionen.

Bei der Auswahl sollten Sie folgende Kriterien berücksichtigen: Aktualität der Schwachstellendatenbanken, Scan-Geschwindigkeit, Integration in Ihre bestehenden CI/CD-Tools, Unterstützung für verschiedene Paketmanager und Programmiersprachen sowie die Genauigkeit der Ergebnisse (Minimierung von False Positives).

Laufzeitschutz und Verhaltensanalyse von Containern

Selbst perfekt gescannte und gebaute Images können zur Laufzeit Risiken ausgesetzt sein. Ein Angreifer könnte eine Zero-Day-Schwachstelle ausnutzen, eine Fehlkonfiguration zur Eskalation von Privilegien nutzen oder versuchen, den Container für bösartige Zwecke zu missbrauchen. Laufzeitschutz konzentriert sich auf die Überwachung und Kontrolle des Container-Verhaltens während seiner Ausführung.

Minimierung der Angriffsfläche

Bevor Überwachung ins Spiel kommt, sollte die Angriffsfläche des Containers so klein wie möglich gehalten werden:

  • Prinzip der geringsten Privilegien: Container sollten niemals als Root laufen. Verwenden Sie einen unprivilegierten Benutzer (z.B. USER nobody im Dockerfile).
  • Read-only Dateisysteme: Wenn möglich, konfigurieren Sie Container mit einem schreibgeschützten Root-Dateisystem. Dies erschwert Angreifern, persistente Änderungen vorzunehmen.
  • Ressourcenlimits: Beschränken Sie CPU, Speicher und andere Ressourcen, um DoS-Angriffe oder Ressourcenerschöpfung zu verhindern.
  • Linux Capabilities: Entfernen Sie unnötige Linux Capabilities (z.B. CAP_SYS_ADMIN) und fügen Sie nur die absolut benötigten hinzu.
  • Seccomp, AppArmor, SELinux: Diese Mechanismen bieten Mandatory Access Control (MAC) auf Kernel-Ebene, um Systemaufrufe zu filtern und den Zugriff auf Ressourcen zu beschränken.
# Beispiel: Dockerfile Best Practices für Sicherheit
FROM alpine:3.18
WORKDIR /app
COPY --chown=myuser:myuser . /app
USER myuser # Ausführung als unprivilegierter Benutzer
CMD ["./my-app"]

Echtzeit-Überwachung und Anomalie-Erkennung

Laufzeitschutzlösungen überwachen das Verhalten von Containern in Echtzeit. Sie suchen nach Abweichungen von der erwarteten Baseline oder nach bekannten bösartigen Mustern. Dazu gehören:

  • Unerwartete Prozessstarts oder -beendigungen.
  • Unautorisierte Dateizugriffe oder Änderungen an kritischen Systemdateien.
  • Ungewöhnliche Netzwerkverbindungen (z.B. ausgehende Verbindungen zu unbekannten Zielen).
  • Eskalation von Privilegien.

Tools und Techniken

  • Falco (Sysdig): Ein Open-Source-Tool, das Syscall-Events vom Linux-Kernel abfängt und anhand von Regeln analysiert, um verdächtiges Verhalten in Containern und Hosts zu erkennen.
  • AppArmor/SELinux: Wie oben erwähnt, können diese auch zur Laufzeit durchsetzen, welche Aktionen ein Container ausführen darf. Ein gut definiertes AppArmor-Profil kann beispielsweise den Zugriff auf bestimmte Pfade oder die Ausführung bestimmter Befehle einschränken.
# Beispiel: Falco-Regel zur Erkennung von Shell-Spawning in einem Container
- rule: Spawned shell in container
  desc: A shell was spawned in a container. This could indicate an intrusion.
  condition: >
    spawned_process and container.id != host and proc.name in (bash, sh, zsh, ksh, csh)
  output: >
    Shell spawned in container (user=%user.name container=%container.name process=%proc.name cmdline=%proc.cmdline)
  priority: WARNING
  tags: [container, shell]

Kubernetes-Sicherheitsrichtlinien und Pod Security Standards

Wenn Sie Container in Kubernetes orchestrieren, fügt dies eine weitere Abstraktionsebene und damit auch neue Sicherheitsherausforderungen und -möglichkeiten hinzu. Kubernetes bietet leistungsstarke native Mechanismen, um die Sicherheit Ihrer Workloads zu verbessern.

Pod Security Standards (PSS)

Die Pod Security Standards (PSS) definieren drei vordefinierte Sicherheitsniveaus (Privileged, Baseline, Restricted) für Pods, die von Kubernetes-Clustern erzwungen werden können. Sie ersetzen die veralteten Pod Security Policies (PSPs) und sind als Admission Controller implementiert.

  • Privileged: Unbeschränkt, erlaubt beliebige Privileg-Eskalationen.
  • Baseline: Minimale Restriktionen, um bekannte Privileg-Eskalationen zu verhindern.
  • Restricted: Starke Restriktionen, die Best Practices für Pod-Härtung durchsetzen.

Sie können PSS auf Namespace-Ebene aktivieren und so definieren, welche Pod Security Level für Pods in diesem Namespace erzwungen, gewarnt oder auditiert werden soll.

# Beispiel: Namespace mit 'restricted' Pod Security Standard
apiVersion: v1
kind: Namespace
metadata:
  name: my-secure-app-namespace
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/audit: restricted

Network Policies

Kubernetes Network Policies fungieren als Firewall für Pods und steuern den Netzwerkverkehr zwischen ihnen sowie zu und von externen Endpunkten. Sie sind entscheidend für die Mikrosegmentierung und die Implementierung des Prinzips der geringsten Privilegien im Netzwerk.

# Beispiel: Kubernetes Network Policy
# Erlaubt nur Ingress-Verkehr von Pods mit Label 'app: frontend'
# zu Pods mit Label 'app: backend' auf Port 8080.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 8080

Role-Based Access Control (RBAC)

RBAC steuert, wer (Benutzer oder Service Accounts) welche Aktionen auf welche Ressourcen im Kubernetes-Cluster ausführen darf. Es ist entscheidend, das Prinzip der geringsten Privilegien auch hier anzuwenden, indem Sie nur die minimal notwendigen Berechtigungen vergeben.

Admission Controllers

Admission Controller sind ein mächtiger Mechanismus, um Anfragen an den Kubernetes API-Server abzufangen, bevor Objekte persistent gespeichert werden. Sie können Anfragen validieren oder sogar mutieren. Sie sind die Grundlage für PSS, aber auch für eigene, maßgeschneiderte Sicherheitsrichtlinien, die mit Tools wie Open Policy Agent (OPA) Gatekeeper umgesetzt werden können.

Sicheres Secrets Management in Container-Umgebungen

Der Umgang mit sensiblen Daten wie API-Schlüsseln, Datenbank-Zugangsdaten oder privaten Zertifikaten – oft als „Secrets“ bezeichnet – ist eine der größten Herausforderungen in Container-Umgebungen. Ein Kompromittierung von Secrets kann verheerende Folgen haben.

Warum Secrets Management kritisch ist

Secrets sind die Schlüssel zu Ihren kritischen Systemen. Werden sie offengelegt, können Angreifer Zugriff auf Datenbanken, Cloud-Ressourcen oder andere Dienste erhalten. Häufige Fehler sind:

  • Hartkodierte Secrets in Quellcode oder Container-Images.
  • Secrets in Umgebungsvariablen, die leicht über Prozesslisten (ps aux) einsehbar sind.
  • Unverschlüsselte Secrets in Konfigurationsdateien.

Vermeidung von Hardcodierten Secrets

Das absolute Grundprinzip lautet: Niemals Secrets direkt in Container-Images, Dockerfiles oder Versionskontrollsystemen (wie Git) speichern. Auch die Verwendung von Umgebungsvariablen ist, obwohl besser als Hardcoding, nicht ideal, da sie in der Regel unverschlüsselt sind und von anderen Prozessen auf dem Host ausgelesen werden können.

Tools und Ansätze

Für ein sicheres Secrets Management sind dedizierte Lösungen erforderlich:

  • Kubernetes Secrets: Kubernetes bietet ein natives Secret-Objekt. Diese sind standardmäßig Base64-kodiert, nicht verschlüsselt im etcd-Datenspeicher (es sei denn, die etcd-Verschlüsselung ist konfiguriert). Sie sind gut für die interne Nutzung innerhalb von Kubernetes, sollten aber mit Vorsicht behandelt und idealerweise durch eine externe Lösung ergänzt werden.
  • Externe Secret Stores: Dies ist der bevorzugte Ansatz für hochsensible Secrets. Lösungen wie HashiCorp Vault, AWS Secrets Manager, Azure Key Vault oder Google Secret Manager bieten zentralisierte, verschlüsselte Speicherung, feingranulare Zugriffssteuerung, Audit-Trails und die Möglichkeit, Secrets dynamisch zu generieren oder zu rotieren.
  • CSI Secrets Store Driver: Dieser Kubernetes-Erweiterung ermöglicht es, Secrets aus externen Stores als Volume in Pods zu mounten. Die Secrets werden dann als normale Dateien im Container verfügbar gemacht, ohne dass der Container selbst die Logik zur Interaktion mit dem Secret Store implementieren muss.
# Beispiel: Verwendung eines Kubernetes Secrets (vereinfacht und nur zur Illustration)
# Beachten Sie: Base64-Kodierung ist KEINE Verschlüsselung.
apiVersion: v1
kind: Secret
metadata:
  name: my-app-db-credentials
type: Opaque
data:
  username: YWRtaW4= # base64('admin')
  password: c3VwZXJzZWNyZXQ= # base64('supersecret')
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
        - name: my-app-container
          image: my-app:latest
          env:
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: my-app-db-credentials
                  key: username
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: my-app-db-credentials
                  key: password

Für eine robustere Lösung, insbesondere in Produktionsumgebungen, wird die Integration mit einem externen Secret Store über den CSI Secrets Store Driver dringend empfohlen.

Netzwerksicherheit für Container und Microservices

In einer Microservices-Architektur, die auf Containern basiert, ist das Netzwerk der primäre Vektor für Angriffe und die Kommunikation zwischen Diensten. Eine robuste Netzwerksicherheit ist daher von entscheidender Bedeutung.

Segmentierung und Mikrosegmentierung

Jeder Dienst sollte nur mit den Diensten kommunizieren dürfen, die er unbedingt benötigt. Dies wird als Mikrosegmentierung bezeichnet und verhindert, dass ein kompromittierter Container sich lateral im Netzwerk bewegen und andere Dienste angreifen kann.

  • Kubernetes Network Policies: Wie bereits erwähnt, sind diese der Schlüssel zur Implementierung der Mikrosegmentierung in Kubernetes.
  • Cloud-native Firewalls: Nutzen Sie Sicherheitsgruppen oder Netzwerksicherheitsgruppen Ihrer Cloud-Anbieter, um den Nord-Süd-Verkehr (in den und aus dem Cluster) zu kontrollieren.

Egress-Kontrolle

Oft wird der Fokus auf den eingehenden (Ingress) Verkehr gelegt, aber der ausgehende (Egress) Verkehr ist ebenso wichtig. Beschränken Sie die Fähigkeit von Containern, Verbindungen zu externen Zielen aufzubauen. Dies verhindert:

  • Datenexfiltration zu externen C2-Servern (Command and Control).
  • Das Herunterladen von bösartigem Code.
  • DDoS-Angriffe, die von kompromittierten Containern ausgehen.
# Beispiel: Kubernetes Network Policy für Egress-Kontrolle
# Erlaubt Pods mit Label 'app: backend' nur ausgehenden TCP-Verkehr
# auf Port 5432 zu einer spezifischen externen IP-Adresse.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-egress-to-db
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Egress
  egress:
    - to:
        - ipBlock:
            cidr: 192.0.2.1/32 # Beispiel: IP der externen Datenbank
      ports:
        - protocol: TCP
          port: 5432

DNS-Sicherheit

Stellen Sie sicher, dass Ihre Container nur vertrauenswürdige DNS-Server verwenden und dass die Namensauflösung nicht manipuliert werden kann. DNS-Poisoning oder die Umleitung zu bösartigen Zielen ist eine gängige Angriffsmethode.

Service Meshes und ihre Sicherheitsvorteile

Ein Service Mesh (z.B. Istio, Linkerd) ist eine dedizierte Infrastrukturschicht für die Handhabung der Dienst-zu-Dienst-Kommunikation in Microservices-Architekturen. Es bietet erhebliche Sicherheitsvorteile:

  • Mutual TLS (mTLS): Automatische Verschlüsselung und gegenseitige Authentifizierung des gesamten Dienst-zu-Dienst-Verkehrs, wodurch Man-in-the-Middle-Angriffe verhindert werden.
  • Feingranulare Zugriffsrichtlinien: Erweiterte Richtlinien zur Steuerung, welche Dienste miteinander kommunizieren dürfen, basierend auf Identität statt IP-Adressen.
  • Observability: Umfassende Protokollierung, Metriken und Tracing des Netzwerkverkehrs, was die Erkennung von Anomalien erleichtert.
# Beispiel: Istio PeerAuthentication zur Erzwingung von mTLS
# Stellt sicher, dass die Kommunikation zwischen Diensten im Namespace
# mit mTLS verschlüsselt und authentifiziert wird.
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: default # Oder der spezifische Namespace
spec:
  mtls:
    mode: STRICT

Kontinuierliche Überwachung und Auditing

Sicherheit ist kein einmaliges Projekt, sondern ein kontinuierlicher Prozess. Selbst die besten initialen Konfigurationen können im Laufe der Zeit durch neue Bedrohungen oder Fehlkonfigurationen untergraben werden. Eine durchgängige Überwachung und regelmäßige Audits sind unerlässlich.

Protokollierung und Zentralisierung

Sammeln Sie Logs von allen Containern, Kubernetes-Komponenten (API-Server, Kubelet, Controller Manager), Host-Systemen und Netzwerkinfrastrukturen. Zentralisieren Sie diese Logs in einem System wie Elastic Stack (ELK), Splunk oder einem anderen SIEM (Security Information and Event Management). Dies ermöglicht eine schnelle Korrelation von Ereignissen und die Erkennung von Angriffen, die sich über mehrere Komponenten erstrecken.

Metriken und Alarme

Überwachen Sie nicht nur Logs, sondern auch Leistungs- und Sicherheitsmetriken. Achten Sie auf ungewöhnliche Spitzen in der CPU-Auslastung, im Netzwerkverkehr, bei Fehlerraten oder bei der Anzahl der erzeugten Prozesse. Richten Sie Alarme für kritische Schwellenwerte oder ungewöhnliche Verhaltensmuster ein, um schnell auf potenzielle Sicherheitsvorfälle reagieren zu können.

Regelmäßige Sicherheitsaudits

Führen Sie regelmäßig interne und externe Sicherheitsaudits durch. Dazu gehören:

  • Konfigurationsprüfungen: Überprüfen Sie Kubernetes-Konfigurationen, Dockerfiles, Netzwerkrichtlinien und RBAC-Einstellungen auf Einhaltung der Best Practices.
  • Schwachstellenscans: Wiederholen Sie Image-Scans und führen Sie Cluster-weite Schwachstellenscans durch.
  • Penetrationstests: Simulieren Sie Angriffe, um Schwachstellen in Ihrer Container-Infrastruktur und Ihren Anwendungen aufzudecken.
  • Compliance-Audits: Stellen Sie sicher, dass Ihre Container-Umgebung den relevanten Compliance-Standards (z.B. GDPR, ISO 27001) entspricht.

Die Implementierung dieser Best Practices erfordert einen ganzheitlichen Ansatz und kontinuierliche Anstrengungen. Durch die Kombination von Sicherheit im Build-Prozess, zur Laufzeit, auf der Orchestrierungsebene, im Secrets Management und im Netzwerk können Unternehmen eine robuste und widerstandsfähige Container-Infrastruktur aufbauen, die den heutigen Bedrohungen standhält.

Benötigen Sie Cybersecurity-Beratung?

Unser Team hilft Ihnen, Ihre IT-Infrastruktur zu sichern und Bedrohungen proaktiv zu erkennen.

Kontakt aufnehmen