Die 10 kritischsten Sicherheitsrisiken für Cloud-native Anwendungen und wie man sie entschärfen kann.
Die OWASP Cloud-Native Application Security Top 10 identifiziert die wichtigsten Sicherheitsrisiken für Cloud-Native-Anwendungen, die auf Plattformen wie Kubernetes, Docker und serverlosen Architekturen laufen. Sie deckt Fehlkonfigurationen, Risiken in der Lieferkette, die Verwaltung von Geheimnissen und mehr über den gesamten Cloud-Native-Stack hinweg ab.
Falsch konfigurierte Cloud-Dienste, Container und Orchestratoren sind die Hauptursache für Cloud-native Sicherheitsverletzungen. Dazu gehören die Ausführung von Containern als Root, die Verwendung von Standardkonfigurationen, die Veröffentlichung des Kubernetes-API-Servers und die Nichtaktivierung der Audit-Protokollierung für Cloud-Ressourcen.
Angreifer können Fehlkonfigurationen ausnutzen, um die volle Kontrolle über den Cluster zu erlangen, Container zu entkommen, auf Cloud-Metadatendienste zuzugreifen oder die gesamte Infrastruktur zu manipulieren. Ein einziger falsch konfigurierter S3-Bucket oder ein offenes Kubernetes-Dashboard hat zu massiven Datenverletzungen geführt.
# Running container as root with no resource limits FROM ubuntu:latest RUN apt-get update && apt-get install -y curl wget COPY app /app # No USER directive — runs as root! CMD ["/app/server"]
FROM gcr.io/distroless/static:nonroot COPY --chown=65534:65534 app /app USER 65534:65534 EXPOSE 8080 ENTRYPOINT ["/app/server"]
Cloud-native Anwendungen erhalten Eingaben nicht nur über herkömmliche HTTP-Anfragen, sondern auch über Cloud-Ereignisse (SQS, Pub/Sub, EventBridge), serverlose Auslöser und die Kommunikation zwischen den Diensten. Injektionsfehler in einem dieser Vektoren können zur Befehlsausführung, Datenexfiltration oder Privilegienerweiterung führen.
Serverlose Funktionen, die durch Cloud-Ereignisse ausgelöst werden, können nicht vertrauenswürdige Daten ohne Validierung verarbeiten, was zu OS-Befehlsinjektion, NoSQL-Injektion oder ereignisgesteuerter SSRF führt. Angreifer können Nachrichtenwarteschlangen oder Ereignisbusse vergiften, um nachgelagerte Dienste zu gefährden.
# Lambda function processing S3 event without sanitizing filename import os def handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] # Command injection via crafted filename! os.system(f"aws s3 cp s3://{bucket}/{key} /tmp/{key}")
import boto3, re from urllib.parse import unquote_plus def handler(event, context): s3 = boto3.client('s3') bucket = event['Records'][0]['s3']['bucket']['name'] key = unquote_plus(event['Records'][0]['s3']['object']['key']) # Validate key against allowlist pattern if not re.match(r'^[\w\-./]+$', key): raise ValueError(f"Invalid S3 key: {key}") # Use SDK instead of shell commands s3.download_file(bucket, key, f'/tmp/{key.split("/")[-1]}')
Cloud-native Umgebungen umfassen mehrere Identitätsebenen: Cloud IAM, Kubernetes RBAC, Service Mesh mTLS und Authentifizierung auf Anwendungsebene. Falsch konfigurierte oder zu freizügige Richtlinien auf jeder Ebene können Seitwärtsbewegungen, die Ausweitung von Berechtigungen oder den unbefugten Zugriff auf sensible Ressourcen ermöglichen.
Zu weitreichende IAM-Rollen, die Pods zugewiesen werden, können Workloads Zugriff auf das gesamte Cloud-Konto gewähren. Fehlende Authentifizierung von Dienst zu Dienst ermöglicht es jedem kompromittierten Pod, sich für andere Dienste auszugeben.
# Overly permissive ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: default-admin subjects: - kind: ServiceAccount name: default # Default SA — shared by all pods! namespace: default roleRef: kind: ClusterRole name: cluster-admin # Full cluster access! apiGroup: rbac.authorization.k8s.io
# Dedicated ServiceAccount with minimal Role apiVersion: v1 kind: ServiceAccount metadata: name: order-service namespace: production annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456:role/order-svc --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: order-service-role namespace: production rules: - apiGroups: [""] resources: ["configmaps"] verbs: ["get"]
CI/CD-Pipelines sind hochwertige Ziele, da sie Schreibzugriff auf Produktionsumgebungen haben. Die Kompromittierung einer Build-Pipeline ermöglicht Supply-Chain-Angriffe, die Einschleusung von bösartigem Code und die Bereitstellung von Backdoor-Images. Unsichere Pipeline-Konfigurationen, vergiftete Basis-Images und unsignierte Artefakte tragen alle zu diesem Risiko bei.
Eine kompromittierte CI/CD-Pipeline kann bösartigen Code in allen Umgebungen bereitstellen, in Pipeline-Variablen gespeicherte Geheimnisse stehlen oder Container-Images manipulieren. Angriffe im Stil von SolarWinds zeigen die katastrophalen Auswirkungen einer Kompromittierung der Lieferkette.
# Insecure CI pipeline — unpinned actions, no image signing name: Deploy on: push jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@main # Unpinned — could be compromised! - run: | docker build -t myapp:latest . docker push myregistry/myapp:latest # No signing! kubectl apply -f deploy.yaml # No admission control!
name: Secure Deploy on: push permissions: id-token: write jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # Pinned SHA - run: | docker build -t myregistry/myapp:${{ github.sha }} . cosign sign myregistry/myapp:${{ github.sha }} # Sign image - run: trivy image myregistry/myapp:${{ github.sha }} --exit-code 1 - run: kubectl apply -f deploy.yaml # Admission controller verifies signatures
Geheimnisse wie API-Schlüssel, Datenbankanmeldeinformationen und TLS-Zertifikate sind oft fest im Quellcode kodiert, in ConfigMaps im Klartext gespeichert oder in Container-Images eingebettet. Kubernetes-Geheimnisse sind standardmäßig nur Base64-kodiert und nicht verschlüsselt, was nur minimalen Schutz bietet.
Offengelegte Geheimnisse können Angreifern direkten Zugriff auf Datenbanken, Cloud-Konten und Dienste von Drittanbietern ermöglichen. Geheimnisse im Git-Verlauf, in Containerebenen oder Umgebungsvariablen können leicht entdeckt und ausgenutzt werden.
# Secrets in plaintext environment variables apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app env: - name: DB_PASSWORD value: "SuperSecret123!" # Plaintext in manifest! - name: AWS_SECRET_KEY value: "AKIA..." # Cloud credentials in YAML!
# Use External Secrets Operator with a vault backend apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: my-app-secrets spec: refreshInterval: 1h secretStoreRef: name: vault-backend kind: ClusterSecretStore target: name: my-app-secrets data: - secretKey: db-password remoteRef: key: secret/data/myapp property: db-password
Standardmäßig erlaubt Kubernetes allen Pods, uneingeschränkt miteinander zu kommunizieren. Fehlende oder zu freizügige Netzwerkrichtlinien, Sicherheitsgruppen und Firewall-Regeln ermöglichen laterale Bewegungen innerhalb des Clusters und zwischen Cloud-Diensten.
Ohne Netzwerksegmentierung kann ein kompromittierter Pod jeden anderen Dienst im Cluster erreichen, direkt auf Datenbanken zugreifen oder Daten an externe Endpunkte exfiltrieren. Flache Netzwerke vergrößern den Aktionsradius eines Angriffs.
# No NetworkPolicy — all pods can talk to everything apiVersion: v1 kind: Namespace metadata: name: production # No NetworkPolicy resources defined # All ingress and egress traffic is allowed by default
# Default-deny all traffic, then allow only what's needed apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all namespace: production spec: podSelector: {} policyTypes: ["Ingress", "Egress"] --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend-to-api namespace: production spec: podSelector: matchLabels: app: api-server ingress: - from: - podSelector: matchLabels: app: frontend ports: - port: 8080
Cloud-native Anwendungen stützen sich stark auf Open-Source-Basis-Images, -Bibliotheken und Kubernetes-Operatoren. Die Ausführung veralteter oder ungepatchter Komponenten mit bekannten CVEs setzt die Anwendung gut dokumentierten Exploits aus. Container-Images enthalten oft Hunderte von Paketen, von denen jedes eine potenzielle Sicherheitslücke darstellt.
Bekannte Schwachstellen in Basis-Images (z. B. Log4Shell, OpenSSL-Fehler) können mit öffentlich verfügbaren Tools ausgenutzt werden. Angreifer suchen aktiv nach Containern mit anfälligen Versionen. Eine einzige ungepatchte Bibliothek kann die gesamte Arbeitslast gefährden.
# Using outdated base image with known CVEs FROM node:14 # EOL version with known vulns COPY package.json . RUN npm install # No audit, no lockfile verification COPY . . CMD ["node", "server.js"]
# Use current, slim base image with vulnerability scanning FROM node:22-slim AS build WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --only=production # Reproducible install from lockfile RUN npm audit --audit-level=high # Fail on high+ vulns FROM gcr.io/distroless/nodejs22-debian12 COPY --from=build /app /app CMD ["/app/server.js"]
In Cloud-nativen Umgebungen ist es einfach, Ressourcen aufzusetzen, aber schwer, sie zu verfolgen. Verwaiste Container, vergessene Namespaces, veraltete Cloud-Ressourcen und Schatten-IT-Bereitstellungen schaffen eine unkontrollierte Angriffsfläche. Ohne eine ordnungsgemäße Bestandsaufnahme können Sicherheitsteams nicht schützen, wovon sie nicht wissen, dass es existiert.
Auf vergessenen oder nicht verwalteten Ressourcen läuft oft veraltete Software, es gibt keine Sicherheitsüberwachung und die Anmeldedaten sind veraltet. Angreifer zielen auf diese vernachlässigten Ressourcen als Einstiegspunkte ab, da sie weniger wahrscheinlich überwacht oder gepatcht werden.
# Resources created without tagging or lifecycle management resource "aws_instance" "test_server" { ami = "ami-0abcdef1234567890" instance_type = "t3.medium" # No tags — who owns this? What's it for? # No lifecycle policy — runs forever } resource "aws_s3_bucket" "temp_data" { bucket = "temp-data-2024" # No expiration, no access logging }
resource "aws_instance" "test_server" { ami = "ami-0abcdef1234567890" instance_type = "t3.medium" tags = { Name = "test-server" Owner = "platform-team" Environment = "staging" ManagedBy = "terraform" ExpiresAt = "2026-04-30" } } resource "aws_s3_bucket" "temp_data" { bucket = "temp-data-2024" tags = { Owner = "data-team" ManagedBy = "terraform" } lifecycle_rule { enabled = true expiration { days = 90 } } }
Ohne angemessene Ressourcenkontingente und -begrenzungen kann eine einzelne fehlerhafte oder kompromittierte Arbeitslast die gesamte verfügbare CPU, den gesamten Arbeitsspeicher oder den gesamten Speicherplatz beanspruchen, was zu einem Denial-of-Service für andere Anwendungen führt. Kryptojacking-Angriffe sind in Umgebungen ohne Ressourcenbegrenzung besonders häufig.
Angreifer können Kryptomining-Container oder ressourcenintensive Arbeitslasten einsetzen, die alle Cluster-Ressourcen verbrauchen. Ohne Einschränkungen kann eine Fork-Bombe oder ein Speicherleck in einem Pod den gesamten Knoten zum Absturz bringen, was sich auf alle gleichzeitigen Workloads auswirkt.
# Pod with no resource limits apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app image: myapp:latest # No resources block — can consume unlimited CPU/memory!
apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app image: myapp:1.2.3 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "512Mi" --- # Namespace-level quota apiVersion: v1 kind: ResourceQuota metadata: name: compute-quota namespace: production spec: hard: requests.cpu: "10" requests.memory: "20Gi" limits.cpu: "20" limits.memory: "40Gi"
Cloud-native Umgebungen erzeugen Protokolle auf mehreren Ebenen: Anwendung, Container-Laufzeit, Orchestrator, Service-Mesh und Cloud-Plattform. Ohne zentralisierte Protokollierung, Korrelation über diese Schichten hinweg und Erkennung von Bedrohungen zur Laufzeit bleiben Sicherheitsvorfälle unentdeckt oder werden zu spät entdeckt.
Ephemere Container verlieren ihre Protokolle, wenn sie beendet werden, wodurch forensische Beweise zerstört werden. Ohne Kubernetes-Auditprotokolle und Laufzeitüberwachung können Angreifer Hintertüren einrichten, Privilegien ausweiten oder Daten exfiltrieren, ohne dass dies irgendwelche Alarme auslöst.
# No audit policy, no log forwarding apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app image: myapp:latest # Logs go to stdout only — lost when pod restarts # No audit logging configured on the cluster # No runtime security monitoring
# Kubernetes audit policy for security events apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: RequestResponse resources: - group: "" resources: ["secrets", "configmaps"] - level: Metadata resources: - group: "rbac.authorization.k8s.io" resources: ["clusterroles", "clusterrolebindings"] - level: Metadata verbs: ["create", "delete", "patch"] # Deploy Falco for runtime threat detection # Forward logs to SIEM via Fluent Bit / Fluentd
| ID | Schwachstelle | Schweregrad | Schlüssel Abschwächung |
|---|---|---|---|
| CNAS-1 | Unsichere Cloud/Container/Orchestration-Konfiguration | Critical | Diffusionslose Bilder, Pod-Sicherheitsstandards, IaC-Scanning |
| CNAS-2 | Injektionsfehler (Cloud-Ereignisse) | Critical | Eingabevalidierung, SDK über Shell, Egress-Filterung |
| CNAS-3 | Unsachgemäße Authentifizierung und Autorisierung | Critical | RBAC mit geringsten Privilegien, IRSA, mTLS |
| CNAS-4 | CI/CD-Pipeline und Mängel in der Lieferkette | High | Pinned SHAs, Bildsignierung, SLSA-Provenienz |
| CNAS-5 | Unsichere Speicherung von Geheimnissen | Critical | Vault/Secrets Manager, KMS-Verschlüsselung, Scannen von Geheimnissen |
| CNAS-6 | Zu weit gehende Netzwerkrichtlinien | High | Standard-Verweigerung, Ausreisebeschränkungen, Calico/Cilium |
| CNAS-7 | Komponenten mit bekannten Sicherheitslücken | High | Bildscannen, minimale Basisbilder, SBOM |
| CNAS-8 | Unsachgemäße Vermögensverwaltung | Medium | Kennzeichnung von Ressourcen, automatische Bereinigung, IaC |
| CNAS-9 | Unzureichende Kontingente an Rechenressourcen | Medium | Ressourcenlimits, ResourceQuotas, Nutzungsüberwachung |
| CNAS-10 | Ineffektive Protokollierung und Überwachung | High | Audit-Protokolle, Falco/Sysdig, zentralisiertes SIEM |