Reporting API auf Hetzner konfigurieren

Automatische Sicherheits-Reports auf Ihrem Hetzner Cloud Server einrichten — mit Reporting-Endpoints, Network Error Logging und einem einfachen Report-Collector für CSP-Violations und Netzwerkfehler.

Hetzner · Schritt für Schritt

Reporting API auf Hetzner Cloud Servern

Die Reporting API ermöglicht es Browsern, automatisierte Berichte über Sicherheitsverletzungen an Ihren Server zu senden — ohne dass Nutzer aktiv etwas melden müssen. Das umfasst CSP-Violations, Netzwerkfehler (DNS, TCP, TLS), HPKP-Verletzungen und Deprecation-Warnungen. Im Wolf-Agents Web Security Check fließt die Reporting API mit 4 von 166 Punkten in die Bewertung ein.

Auf einem Hetzner Cloud Server konfigurieren Sie die Reporting API direkt im Webserver. Die API besteht aus zwei Generationen: dem neueren Reporting-Endpoints-Header (empfohlen) und dem älteren Report-To-Header (Fallback). Zusätzlich ermöglicht Network Error Logging (NEL) die Erfassung von Verbindungsfehlern, die der Nutzer nie sieht — etwa DNS-Timeouts oder TLS-Handshake-Fehler auf dem Weg zu Ihrem Hetzner Server.

1 Schritt 1 von 3

Reporting-Endpoints und Report-To konfigurieren

Der Reporting-Endpoints-Header definiert benannte Endpunkte, an die der Browser Reports sendet. Der ältere Report-To-Header bietet Kompatibilität mit Chromium-Browsern, die die neue API noch nicht vollständig unterstützen. Setzen Sie beide Header parallel, um maximale Abdeckung zu erreichen.

Nginx
/etc/nginx/conf.d/reporting-api.conf Produktiv
# /etc/nginx/conf.d/reporting-api.conf
# Neue Reporting API (Reporting-Endpoints)
add_header Reporting-Endpoints 'default="https://ihre-domain.de/api/reports", csp="https://ihre-domain.de/api/csp-reports"' always;

# Legacy Report-To (für ältere Browser)
add_header Report-To '{"group":"default","max_age":86400,"endpoints":[{"url":"https://ihre-domain.de/api/reports"}]}' always;
Nginx — NEL
/etc/nginx/conf.d/reporting-api.conf Ergänzung
# Network Error Logging (NEL)
# Meldet DNS-, TCP- und TLS-Fehler automatisch
add_header NEL '{"report_to":"default","max_age":86400,"include_subdomains":true,"failure_fraction":1.0,"success_fraction":0.01}' always;
Nginx — CSP mit Reporting
/etc/nginx/conf.d/reporting-api.conf Verknüpfung
# CSP mit Reporting-Endpoint verknüpfen
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; report-to csp" always;

# Oder als Report-Only zum Testen
add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; report-to csp" always;
failure_fraction und success_fraction

NEL nutzt Sampling: failure_fraction: 1.0 meldet 100% der Fehler. success_fraction: 0.01 meldet nur 1% der erfolgreichen Requests — genug für eine Baseline, ohne den Report-Collector zu überlasten.

2 Schritt 2 von 3

Apache-Konfiguration und Report-Collector

Die Apache-Konfiguration setzt die gleichen Header mit mod_headers. Für die Verarbeitung der Reports benötigen Sie einen Collector-Endpoint, der die Browser-Reports entgegennimmt. Da die Reports als application/reports+json gesendet werden, muss der Endpoint diesen Content-Type akzeptieren.

/etc/apache2/conf-available/reporting-api.conf Produktiv
# /etc/apache2/conf-available/reporting-api.conf
<IfModule mod_headers.c>
    # Neue Reporting API
    Header always set Reporting-Endpoints 'default="https://ihre-domain.de/api/reports", csp="https://ihre-domain.de/api/csp-reports"'

    # Legacy Report-To
    Header always set Report-To '{"group":"default","max_age":86400,"endpoints":[{"url":"https://ihre-domain.de/api/reports"}]}'

    # Network Error Logging
    Header always set NEL '{"report_to":"default","max_age":86400,"include_subdomains":true,"failure_fraction":1.0,"success_fraction":0.01}'
</IfModule>
/opt/report-collector/server.js Collector
# Minimaler Report-Collector (Node.js/Express)
# /opt/report-collector/server.js
const express = require('express');
const fs = require('fs');
const app = express();

// Reports kommen als application/reports+json
app.use(express.json({ type: [
    'application/reports+json',
    'application/csp-report',
    'application/json'
]}));

// CORS: Browser sendet Reports cross-origin
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'POST');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
});

app.post('/api/reports', (req, res) => {
    const timestamp = new Date().toISOString();
    const line = JSON.stringify({ timestamp, reports: req.body });
    fs.appendFileSync('/var/log/security-reports.jsonl', line + '\n');
    res.status(204).end();
});

app.listen(3001, '127.0.0.1');
Proxy-Pass für den Collector

Wenn der Collector als Node.js-Prozess auf Port 3001 läuft, leiten Sie Requests über Nginx weiter mit einem location /api/reports-Block und proxy_pass auf http://127.0.0.1:3001. Alternativ können Sie externe Dienste wie report-uri.com nutzen.

3 Schritt 3 von 3

Verifizierung und Testing

Prüfen Sie mit curl, ob alle drei Header (Reporting-Endpoints, Report-To, NEL) korrekt gesetzt sind. Testen Sie anschließend den Report-Collector mit einem manuellen POST-Request.

Terminal Verifizierung
# Nginx-Konfiguration testen und laden
sudo nginx -t && sudo systemctl reload nginx

# Reporting-Endpoints prüfen
curl -sI https://ihre-domain.de | grep -i report
# Erwartet:
# reporting-endpoints: default="...", csp="..."
# report-to: {"group":"default",...}

# NEL-Header prüfen
curl -sI https://ihre-domain.de | grep -i nel
# Erwartet: nel: {"report_to":"default",...}

# Report-Collector testen
curl -X POST https://ihre-domain.de/api/reports \
  -H "Content-Type: application/reports+json" \
  -d '[{"type":"test","body":{"message":"test"}}]'
# Erwartet: HTTP 204
Öffnen Sie in Chrome die DevTools unter Application > Reporting API, um gesammelte Reports in Echtzeit zu sehen. Firefox zeigt Reporting-Aktivitäten in der Netzwerk-Konsole.

Häufige Fehler bei der Reporting API auf Hetzner

Report-Endpoint erlaubt kein CORS

Browser senden Reports als Cross-Origin-Requests. Ohne Access-Control-Allow-Origin auf dem Collector-Endpoint werden die Reports stillschweigend verworfen. Der Collector muss mindestens Access-Control-Allow-Origin: * und Access-Control-Allow-Methods: POST setzen. Auf dem Hetzner Server konfigurieren Sie dies entweder im Nginx-Proxy oder direkt im Collector-Code.

NEL funktioniert nur über HTTPS

Network Error Logging erfordert eine HTTPS-Verbindung. Der NEL-Header wird auf HTTP-Verbindungen ignoriert. Stellen Sie sicher, dass Ihr Hetzner Server ein gültiges TLS-Zertifikat hat (z.B. über Let's Encrypt) und HTTP-Requests per 301 auf HTTPS umgeleitet werden.

Report-To vs. Reporting-Endpoints verwechselt

Report-To ist die ältere API (Structured Header mit JSON-Objekt). Reporting-Endpoints ist die neuere, einfachere API (Key-Value-Paare). CSP nutzt report-to als Direktive, die auf einen in Reporting-Endpoints definierten Namen verweist. Setzen Sie beide Header parallel: Reporting-Endpoints für neue Browser, Report-To als Fallback.

Compliance-Relevanz

Die Reporting API ist ein zentrales Instrument für die automatisierte Erkennung von Sicherheitsvorfällen. Statt auf manuelle Meldungen zu warten, erhalten Sie proaktive Benachrichtigungen über CSP-Violations, Netzwerkfehler und Browser-Warnungen.

NIS2 Artikel 21(e) fordert Systeme zur Erkennung von Sicherheitsvorfällen. Die Reporting API liefert automatisierte Violation-Reports direkt aus dem Browser — ein Frühwarnsystem für XSS-Versuche und Infrastrukturprobleme.
BSI Der BSI IT-Grundschutz empfiehlt die Protokollierung sicherheitsrelevanter Ereignisse. Browser-Reports ergänzen serverseitige Logs um die Client-Perspektive.

Wie steht Ihre Domain bei Reporting API?

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