Cross-Origin Headers auf Hetzner konfigurieren
Schritt-für-Schritt-Anleitung: CORP, COOP und COEP auf Ihrem Hetzner Cloud Server einrichten — Spectre-Schutz aktivieren, Cross-Origin Isolation erreichen und SharedArrayBuffer freischalten.
Cross-Origin Headers auf Hetzner
Die drei Cross-Origin Headers — Cross-Origin-Resource-Policy (CORP), Cross-Origin-Opener-Policy (COOP) und Cross-Origin-Embedder-Policy (COEP) — schützen gegen Spectre-Seitenkanalangriffe und aktivieren die Browser-eigene Cross-Origin Isolation. Zusammen bilden sie mit 30 von 166 Punkten den höchstgewichteten Multi-Header-Bereich im Wolf-Agents Web Security Check.
Erst wenn alle drei Header korrekt gesetzt sind, meldet der Browser self.crossOriginIsolated === true. Das schaltet leistungskritische APIs wie SharedArrayBuffer und hochauflösendes performance.now() frei — und verhindert gleichzeitig, dass Angreifer per Spectre-Timing sensitive Daten aus dem Prozessspeicher lesen.
Cross-Origin-Resource-Policy setzen
CORP definiert, welche Origins Ihre Ressourcen (Bilder, Scripts, Fonts) einbetten dürfen. Der Wert same-origin ist die sicherste Option: Nur Ihre eigene Domain darf Ressourcen laden. Wenn Sie Assets von Subdomains oder CDNs ausliefern, verwenden Sie same-site oder cross-origin.
Cross-Origin-Opener-Policy setzen
COOP isoliert den Browsing Context. Mit same-origin kann ein Fenster, das von einer fremden Domain geöffnet wurde, nicht per window.opener auf Ihr Fenster zugreifen. Das unterbindet eine ganze Klasse von Angriffen, bei denen ein Popup die Elternseite manipuliert.
same-origin bricht window.opener-Patterns. Wenn Ihre Anwendung OAuth-Popups oder Payment-Fenster nutzt, die per window.opener.postMessage() kommunizieren, müssen Sie diese Flows vorher auf window.postMessage() mit MessageChannel umstellen. Cross-Origin-Embedder-Policy setzen und konfigurieren
COEP mit dem Wert require-corp erzwingt, dass alle eingebetteten Cross-Origin-Ressourcen entweder CORS-Header oder einen passenden CORP-Header setzen. Das ist die strikteste Variante. Alternativ steht credentialless zur Verfügung — hier werden Cross-Origin-Requests ohne Credentials (Cookies, HTTP-Auth) durchgelassen.
# /etc/nginx/snippets/cross-origin-headers.conf
# Include in jedem server{}-Block:
# include snippets/cross-origin-headers.conf;
# 1. Cross-Origin-Resource-Policy
add_header Cross-Origin-Resource-Policy "same-origin" always;
# 2. Cross-Origin-Opener-Policy
add_header Cross-Origin-Opener-Policy "same-origin" always;
# 3. Cross-Origin-Embedder-Policy
add_header Cross-Origin-Embedder-Policy "require-corp" always; # /etc/apache2/conf-available/cross-origin-headers.conf
<IfModule mod_headers.c>
# 1. Cross-Origin-Resource-Policy
Header always set Cross-Origin-Resource-Policy "same-origin"
# 2. Cross-Origin-Opener-Policy
Header always set Cross-Origin-Opener-Policy "same-origin"
# 3. Cross-Origin-Embedder-Policy
Header always set Cross-Origin-Embedder-Policy "require-corp"
</IfModule> # Alternative: credentialless statt require-corp
# Erlaubt Cross-Origin-Ressourcen ohne CORS,
# aber ohne Credentials (Cookies, Auth)
add_header Cross-Origin-Embedder-Policy "credentialless" always; require-corp blockiert alle Cross-Origin-Ressourcen ohne explizite CORS/CORP-Freigabe — ideal für geschlossene Anwendungen. credentialless ist pragmatischer: Es erlaubt Cross-Origin-Ressourcen, sendet aber keine Cookies mit — gut für Seiten mit externen Bildern oder Fonts, die kein CORS unterstützen.
Cross-Origin Isolation verifizieren
Prüfen Sie alle drei Header per curl und bestätigen Sie im Browser, dass crossOriginIsolated auf true steht. Nur wenn alle drei Header korrekt gesetzt sind, ist die Isolation aktiv.
# Alle drei Header auf einmal prüfen
curl -sI https://ihre-domain.de | grep -i cross-origin
# Erwartete Ausgabe:
# cross-origin-resource-policy: same-origin
# cross-origin-opener-policy: same-origin
# cross-origin-embedder-policy: require-corp
# Cross-Origin Isolation im Browser prüfen
# DevTools Console:
# > self.crossOriginIsolated
# → true Häufige Fehler auf Hetzner-Servern
COEP blockiert Cross-Origin-Bilder
Mit require-corp werden alle Cross-Origin-Bilder ohne CORS-Header blockiert. Wenn Sie Bilder von externen Quellen laden (z.B. Gravatar, Unsplash), müssen diese Access-Control-Allow-Origin: * senden — oder Sie verwenden credentialless als COEP-Wert.
COOP bricht window.opener-Patterns
OAuth-Login-Popups, die per window.opener.postMessage() Tokens zurücksenden, funktionieren mit COOP same-origin nicht mehr. Lösung: Stellen Sie auf Redirect-basierte OAuth-Flows um oder verwenden Sie same-origin-allow-popups als Zwischenschritt.
credentialless vs. require-corp verwechselt
credentialless ist kein schwächeres require-corp — es ändert das Verhalten grundlegend: Cross-Origin-Requests werden ohne Cookies gesendet. Das kann Authentifizierte APIs brechen, die auf Cookie-Auth angewiesen sind.
Hetzner Load Balancer reicht Header nicht durch
Der Hetzner Load Balancer in der Standard-Konfiguration reicht Backend-Header durch. Wenn Sie jedoch eigene Header im LB setzen, können Backend-Header überschrieben werden. Prüfen Sie die LB-Konfiguration in der Hetzner Cloud Console unter Load Balancer > Konfiguration.
Compliance-Relevanz
Cross-Origin Isolation ist eine technische Maßnahme gegen Spectre-Seitenkanalangriffe — eine der schwerwiegendsten Hardware-Schwachstellen der letzten Jahre. NIS2 Art. 21(e) fordert die Absicherung bei Beschaffung, Entwicklung und Wartung von IT-Systemen, einschließlich Schwachstellenmanagement. Die Browser-eigene Cross-Origin Isolation adressiert Spectre direkt auf Anwendungsebene. Der Wolf-Agents Web Security Check bewertet die drei Cross-Origin Headers mit bis zu 30 Punkten.
Wie steht Ihre Domain bei Cross-Origin Headers?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.