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.
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.
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.
# /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; # 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; # 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; 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.
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
<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> # 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'); 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.
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.
# 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 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.
Wie steht Ihre Domain bei Reporting API?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.