Was ist die Top 10 der Cloud-nativen Anwendungssicherheit?

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.

1️⃣ CNAS-1 - Unsichere Cloud-, Container- oder Orchestrierungskonfiguration

Critical

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

Dockerfile ❌ Bad
# 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"]

Beispiel für sicheren Code

Dockerfile ✅ Good
FROM gcr.io/distroless/static:nonroot
COPY --chown=65534:65534 app /app
USER 65534:65534
EXPOSE 8080
ENTRYPOINT ["/app/server"]

Checkliste zur Schadensbegrenzung

2️⃣ CNAS-2 - Schwachstellen bei der Injektion (Anwendungsschicht, Cloud-Ereignisse, Cloud-Dienste)

Critical

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

Python ❌ Bad
# 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}")

Beispiel für sicheren Code

Python ✅ Good
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]}')

Checkliste zur Schadensbegrenzung

3️⃣ CNAS-3 - Unzulässige Authentifizierung und Autorisierung

Critical

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

YAML (Kubernetes) ❌ Bad
# 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

Beispiel für sicheren Code

YAML (Kubernetes) ✅ Good
# 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"]

Checkliste zur Schadensbegrenzung

4️⃣ CNAS-4 - CI/CD-Pipeline und Schwachstellen in der Software-Lieferkette

High

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

YAML (GitHub Actions) ❌ Bad
# 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!

Beispiel für sicheren Code

YAML (GitHub Actions) ✅ Good
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

Checkliste zur Schadensbegrenzung

5️⃣ CNAS-5 - Unsichere Geheimnisspeicherung

Critical

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

YAML (Kubernetes) ❌ Bad
# 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!

Beispiel für sicheren Code

YAML (Kubernetes) ✅ Good
# 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

Checkliste zur Schadensbegrenzung

6️⃣ CNAS-6 - Zu weit gehende oder unsichere Netzwerkrichtlinien

High

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

YAML (Kubernetes) ❌ Bad
# 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

Beispiel für sicheren Code

YAML (Kubernetes) ✅ Good
# 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

Checkliste zur Schadensbegrenzung

7️⃣ CNAS-7 - Verwendung von Komponenten mit bekannten Sicherheitslücken

High

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

Dockerfile ❌ Bad
# 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"]

Beispiel für sicheren Code

Dockerfile ✅ Good
# 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"]

Checkliste zur Schadensbegrenzung

8️⃣ CNAS-8 - Unsachgemäße Vermögensverwaltung

Medium

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

Terraform ❌ Bad
# 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
}

Beispiel für sicheren Code

Terraform ✅ Good
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 }
  }
}

Checkliste zur Schadensbegrenzung

9️⃣ CNAS-9 - Unzureichende Kontingentierung von Rechenressourcen

Medium

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

YAML (Kubernetes) ❌ Bad
# 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!

Beispiel für sicheren Code

YAML (Kubernetes) ✅ Good
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"

Checkliste zur Schadensbegrenzung

🔟 CNAS-10 - Ineffektive Protokollierung und Überwachung

High

Übersicht

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.

Risiko

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.

Beispiel für anfälligen Code

YAML (Kubernetes) ❌ Bad
# 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

Beispiel für sicheren Code

YAML (Kubernetes) ✅ Good
# 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

Checkliste zur Schadensbegrenzung

📊 Zusammenfassende Tabelle

ID Schwachstelle Schweregrad Schlüssel Abschwächung
CNAS-1Unsichere Cloud/Container/Orchestration-KonfigurationCriticalDiffusionslose Bilder, Pod-Sicherheitsstandards, IaC-Scanning
CNAS-2Injektionsfehler (Cloud-Ereignisse)CriticalEingabevalidierung, SDK über Shell, Egress-Filterung
CNAS-3Unsachgemäße Authentifizierung und AutorisierungCriticalRBAC mit geringsten Privilegien, IRSA, mTLS
CNAS-4CI/CD-Pipeline und Mängel in der LieferketteHighPinned SHAs, Bildsignierung, SLSA-Provenienz
CNAS-5Unsichere Speicherung von GeheimnissenCriticalVault/Secrets Manager, KMS-Verschlüsselung, Scannen von Geheimnissen
CNAS-6Zu weit gehende NetzwerkrichtlinienHighStandard-Verweigerung, Ausreisebeschränkungen, Calico/Cilium
CNAS-7Komponenten mit bekannten SicherheitslückenHighBildscannen, minimale Basisbilder, SBOM
CNAS-8Unsachgemäße VermögensverwaltungMediumKennzeichnung von Ressourcen, automatische Bereinigung, IaC
CNAS-9Unzureichende Kontingente an RechenressourcenMediumRessourcenlimits, ResourceQuotas, Nutzungsüberwachung
CNAS-10Ineffektive Protokollierung und ÜberwachungHighAudit-Protokolle, Falco/Sysdig, zentralisiertes SIEM