CSP für AWS CloudFront konfigurieren

Content Security Policy auf CloudFront einrichten: Statische CSP per Response Headers Policy, dynamische Nonces per CloudFront Function — von Report-Only bis Enforcement.

AWS CloudFront · Schritt für Schritt

Content Security Policy auf AWS CloudFront

Content Security Policy (CSP) ist der wichtigste HTTP-Security-Header gegen Cross-Site Scripting (XSS). Er teilt dem Browser mit, welche Ressourcen geladen werden dürfen — und blockiert alles andere. CSP ist mit 35 von 166 Punkten der einflussreichste Header im Wolf-Agents Web Security Check.

AWS CloudFront bietet zwei Wege für CSP: Eine statische CSP über die Response Headers Policy für einfache Setups ohne Nonces. Oder eine dynamische CSP mit Nonces über CloudFront Functions im Viewer-Response Event. Die Function generiert pro Request einen zufälligen Nonce und fügt ihn in den CSP-Header ein.

Wichtig: Die AWS-Managed SecurityHeadersPolicy enthält keine CSP. Sie müssen CSP immer manuell konfigurieren — entweder als Custom Header in der Policy oder per CloudFront Function.

1 Schritt 1 von 4

Statische CSP per Terraform (Report-Only)

Beginnen Sie immer im Report-Only-Modus. Der Browser meldet CSP-Verstöße in der Konsole und an Ihren Reporting-Endpoint, blockiert aber keine Ressourcen. Für einfache Setups ohne Nonces genügt ein Custom Header in der Response Headers Policy.

terraform/csp-report-only.tf Report-Only
# terraform/csp-report-only.tf — Statische CSP
resource "aws_cloudfront_response_headers_policy" "csp_policy" {
  name = "csp-report-only-policy"

  custom_headers_config {
    items {
      header   = "Content-Security-Policy-Report-Only"
      value    = "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; report-uri /api/csp-report"
      override = true
    }
  }
}
Statische CSP vs. dynamische Nonces

Eine statische CSP ohne Nonces erfordert 'unsafe-inline' für Inline-Scripts, was den XSS-Schutz reduziert. Für maximale Sicherheit nutzen Sie CloudFront Functions mit dynamischen Nonces (Schritt 2).

2 Schritt 2 von 4

CloudFront Function für dynamische Nonces

Für maximale Sicherheit generieren Sie pro Request einen zufälligen Nonce. CloudFront Functions laufen auf allen Edge Locations, kosten ein Sechstel von Lambda@Edge und haben ein 10-KB-Code-Limit — für CSP-Nonces mehr als ausreichend.

cloudfront-function.js CloudFront Function
// CloudFront Function — CSP mit dynamischem Nonce
// Event: Viewer Response
function handler(event) {
  var response = event.response;
  var headers = response.headers;

  // Zufälligen Nonce generieren (24 Zeichen)
  var nonce = crypto.randomUUID().replace(/-/g, '').substring(0, 24);

  // CSP mit Nonce + strict-dynamic
  headers['content-security-policy'] = {
    value: "default-src 'self'; "
      + "script-src 'self' 'nonce-" + nonce + "' 'strict-dynamic'; "
      + "style-src 'self' 'unsafe-inline'; "
      + "img-src 'self' data: https:; "
      + "font-src 'self'; "
      + "connect-src 'self'; "
      + "object-src 'none'; "
      + "base-uri 'self'; "
      + "form-action 'self'; "
      + "frame-ancestors 'self'"
  };

  return response;
}
terraform/cloudfront-function-csp.tf Terraform
# terraform/cloudfront-function-csp.tf
resource "aws_cloudfront_function" "csp_nonce" {
  name    = "csp-nonce-injection"
  runtime = "cloudfront-js-2.0"
  comment = "CSP mit dynamischem Nonce"
  publish = true
  code    = file("cloudfront-function.js")
}

# Function an Distribution anhängen
resource "aws_cloudfront_distribution" "main" {
  default_cache_behavior {
    function_association {
      event_type   = "viewer-response"
      function_arn = aws_cloudfront_function.csp_nonce.arn
    }
  }
}
CloudFront Functions haben ein 10-KB-Code-Limit. Eine komplexe CSP mit vielen Domains kann dieses Limit überschreiten. In diesem Fall nutzen Sie Lambda@Edge — beachten Sie aber die DSGVO-Implikation: Lambda@Edge wird ausschließlich in us-east-1 bereitgestellt.
3 Schritt 3 von 4

Verifizierung

Prüfen Sie den CSP-Header per curl. Bei dynamischen Nonces ändert sich der Nonce-Wert bei jedem Request. Erstellen Sie bei Bedarf eine CloudFront-Invalidierung, um gecachte Responses ohne CSP zu entfernen.

Terminal Verifizieren
# CSP-Header prüfen
curl -sI https://ihre-domain.de | grep -i content-security-policy

# Erwartete Ausgabe (mit Nonce):
content-security-policy: default-src 'self'; script-src 'self' 'nonce-a1b2c3d4e5f6g7h8i9j0k1l2' 'strict-dynamic'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'

# Nonce ändert sich bei jedem Request
curl -sI https://ihre-domain.de | grep -i content-security-policy
content-security-policy: ... 'nonce-m3n4o5p6q7r8s9t0u1v2w3x4' ...

Häufige Fehler

CSP in Policy UND Function gesetzt

Wenn sowohl die Response Headers Policy als auch die CloudFront Function den CSP-Header setzen, werden zwei CSP-Header gesendet. Der Browser wendet beide an — die restriktivere gewinnt. Setzen Sie CSP nur an einer Stelle.

Nonce stimmt nicht mit HTML überein

Die CloudFront Function setzt den Nonce im HTTP-Header, aber das HTML enthält keinen passenden nonce-Attribut. Lösung: Entweder SSR-Rendering mit Nonce-Injection oder 'strict-dynamic' nutzen, das die Nonce-Vererbung aktiviert.

10-KB-Limit der CloudFront Function überschritten

Komplexe CSPs mit vielen Domain-Allowlists können das 10-KB-Limit sprengen. Konsolidieren Sie Domains oder wechseln Sie zu Lambda@Edge (beachten Sie: nur in us-east-1).

Viewer-Response statt Origin-Response gewählt

CloudFront Functions unterstützen nur Viewer-Request und Viewer-Response Events. Für CSP-Nonces benötigen Sie das Viewer-Response Event. Origin-Response ist nur für Lambda@Edge verfügbar.

Compliance-Relevanz

CSP ist seit PCI DSS 4.0 (Requirement 6.4.3, Deadline März 2025) eine explizite Anforderung für alle Websites, die Kreditkartendaten verarbeiten. OWASP Top 10 empfiehlt CSP als Mitigation gegen A03:2021 Injection. NIS2 fordert technische Maßnahmen zum Schutz vor Cyberangriffen — CSP ist eine der wirksamsten. Der Wolf-Agents Web Security Check prüft CSP-Konfigurationen inklusive Nonce-Validierung und strict-dynamic-Support.

Wie steht Ihre Domain bei CSP?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.