X-Content-Type-Options für AWS CloudFront

MIME-Sniffing per Response Headers Policy verhindern — ein Klick im Dashboard oder eine Zeile Terraform. Inklusive S3 Content-Type-Best-Practices.

AWS CloudFront · Schritt für Schritt

X-Content-Type-Options auf AWS CloudFront

X-Content-Type-Options: nosniff verhindert, dass Browser den MIME-Type von Ressourcen erraten (MIME-Sniffing). Ohne diesen Header können Angreifer harmlose Dateien als ausführbare Scripts interpretieren lassen — etwa eine Text-Datei als JavaScript. X-Content-Type-Options ist mit 10 von 166 Punkten ein relevanter Faktor im Wolf-Agents Web Security Check.

CloudFront bietet einen dedizierten content_type_options-Block in der Response Headers Policy. Es gibt nur einen gültigen Wert: nosniff. Die AWS-Managed SecurityHeadersPolicy setzt diesen Header bereits — aber nur wenn Sie die Managed Policy auch aktiv der Distribution zuweisen. Bei einer Custom Policy müssen Sie den Block explizit aktivieren.

Wichtig: Wenn nosniff aktiv ist, verlässt sich der Browser ausschließlich auf den Content-Type-Header. Stellen Sie sicher, dass alle S3-Objekte den korrekten MIME-Type haben — andernfalls werden CSS-Dateien nicht als Stylesheets und JS-Dateien nicht als Scripts erkannt.

1 Schritt 1 von 4

X-Content-Type-Options per Terraform aktivieren

Aktivieren Sie den content_type_options-Block in der Response Headers Policy. CloudFront setzt automatisch den Wert nosniff — es gibt keinen anderen gültigen Wert. Mit override = true wird der Header auch dann gesetzt, wenn der Origin bereits einen eigenen X-Content-Type-Options-Header sendet.

terraform/x-content-type-options.tf Terraform
# terraform/x-content-type-options.tf
resource "aws_cloudfront_response_headers_policy" "xcto" {
  name = "xcto-policy"

  security_headers_config {
    content_type_options {
      override = true
    }
    # CloudFront setzt automatisch: X-Content-Type-Options: nosniff
    # Es gibt nur diesen einen gültigen Wert.
  }
}

# Distribution mit XCTO Policy
resource "aws_cloudfront_distribution" "main" {
  default_cache_behavior {
    response_headers_policy_id = aws_cloudfront_response_headers_policy.xcto.id
  }
}
2 Schritt 2 von 4

Konfiguration über die AWS Console

Im CloudFront Dashboard ist X-Content-Type-Options ein einfacher Toggle unter Security Headers. Die Managed SecurityHeadersPolicy setzt den Header ebenfalls, bietet aber keine Konfiguration für CSP, Cross-Origin Headers und andere wichtige Header — eine Custom Policy ist daher in den meisten Fällen die bessere Wahl.

AWS Console Dashboard
# AWS Console — Schritt für Schritt:
# 1. CloudFront → Distributions → [ID] → Behaviors → Edit
# 2. Response Headers Policy → Create/Edit Custom Policy
# 3. Security Headers → X-Content-Type-Options:
#    - Enabled: Yes
#    - Override Origin: Yes
# 4. Save Changes
# Der Wert "nosniff" wird automatisch gesetzt.
#
# Alternative: Managed Policy verwenden
# Die AWS-Managed "SecurityHeadersPolicy" setzt nosniff bereits.
# Aber sie fehlt CSP, Cross-Origin Headers und andere Header.
3 Schritt 3 von 4

S3-Objekte mit korrektem Content-Type hochladen

Mit nosniff aktiv verlässt sich der Browser auf den Content-Type-Header. Stellen Sie sicher, dass alle S3-Objekte den korrekten MIME-Type haben. Die AWS CLI erkennt gängige Dateitypen automatisch, aber prüfen Sie trotzdem — besonders bei SVG, WebP und anderen weniger gängigen Formaten.

Terminal AWS CLI
# S3-Objekte mit korrektem Content-Type hochladen
aws s3 cp dist/ s3://ihr-bucket/ --recursive \
  --exclude "*" \
  --include "*.html" --content-type "text/html; charset=utf-8"

aws s3 cp dist/ s3://ihr-bucket/ --recursive \
  --exclude "*" \
  --include "*.css" --content-type "text/css"

aws s3 cp dist/ s3://ihr-bucket/ --recursive \
  --exclude "*" \
  --include "*.js" --content-type "text/javascript"

aws s3 cp dist/ s3://ihr-bucket/ --recursive \
  --exclude "*" \
  --include "*.json" --content-type "application/json"

aws s3 cp dist/ s3://ihr-bucket/ --recursive \
  --exclude "*" \
  --include "*.svg" --content-type "image/svg+xml"

# Tipp: aws s3 sync erkennt Content-Types automatisch
# für gängige Dateitypen — prüfen Sie trotzdem!
4 Schritt 4 von 4

Verifizierung

Prüfen Sie den nosniff-Header und die Content-Types aller Ressourcen per curl. Öffnen Sie die Seite in den Browser DevTools und prüfen Sie im Network-Tab, ob alle Ressourcen den korrekten Content-Type haben. Der Wolf-Agents Web Security Check prüft X-Content-Type-Options automatisch.

Terminal Verifizieren
# X-Content-Type-Options prüfen
curl -sI https://ihre-domain.de | grep -i x-content-type-options

# Erwartete Ausgabe:
x-content-type-options: nosniff

# Content-Type von S3-Objekten prüfen
curl -sI https://ihre-domain.de/style.css | grep -i content-type

# Erwartete Ausgabe:
content-type: text/css

# JavaScript Content-Type prüfen
curl -sI https://ihre-domain.de/app.js | grep -i content-type

# Erwartete Ausgabe:
content-type: text/javascript

Häufige Fehler

S3-Objekte ohne Content-Type

Wenn S3-Objekte keinen korrekten Content-Type haben und nosniff aktiv ist, werden CSS- und JS-Dateien vom Browser blockiert. Setzen Sie Content-Type beim Upload: aws s3 cp style.css s3://bucket/ --content-type text/css.

Doppelter Header durch Origin und Policy

Wenn der Origin bereits nosniff setzt und die Policy ebenfalls, wird der Header doppelt gesendet. Setzen Sie override = true, damit CloudFront den Origin-Header überschreibt statt zu ergänzen.

Content-Type application/octet-stream

S3 setzt standardmäßig application/octet-stream für unbekannte Dateitypen. Mit nosniff wird dieser Type exakt verwendet — Dateien werden heruntergeladen statt angezeigt. Setzen Sie explizite Content-Types für alle Dateitypen.

SVG-Dateien als application/octet-stream

SVG-Dateien müssen den Content-Type image/svg+xml haben. Ohne korrekten Type werden SVGs mit nosniff nicht als Bilder dargestellt. Achten Sie besonders bei SVG, WOFF2 und WebP auf korrekte MIME-Types.

Compliance-Relevanz

OWASP Top 10 empfiehlt nosniff als Basismaßnahme gegen MIME-Type-Confusion-Angriffe, bei denen harmlose Dateien als ausführbare Scripts interpretiert werden. PCI DSS fordert Schutz vor bekannten Angriffsvektoren — MIME-Sniffing ist ein bekannter Vektor. BSI IT-Grundschutz listet X-Content-Type-Options als empfohlenen Security Header in den Maßnahmenkatalogen. NIS2 erfordert technische Sicherheitsmaßnahmen auf dem Stand der Technik. Der Wolf-Agents Web Security Check prüft den Header automatisch bei jedem Scan.

Wie steht Ihre Domain bei X-Content-Type-Options?

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