sslxy

server-haertung

Angriffsfläche, TLS, Browser-Policies, Betrieb und Recovery.

Server-Härtung beginnt nicht mit einem Tool-Score und endet auch nicht dort. Ausgangspunkt ist die Frage, welche Dienste, Identitäten, Dateien, Schnittstellen und Verwaltungswege überhaupt erreichbar sind und welche Folgen ein Fehler oder eine Kompromittierung auf jeder dieser Ebenen hätte.

Eine belastbare Sicherheitskonfiguration entsteht schichtweise: unnötige Angriffsfläche reduzieren, Software aktuell halten, Rechte begrenzen, Transportverschlüsselung korrekt betreiben, Browsergrenzen setzen, Protokolldaten beobachten und einen getesteten Rückweg besitzen.

Diese Archivseite dokumentiert deshalb nicht nur TLS, HSTS, Security-Header oder CSP. Sie verbindet diese Browser- und Transportmechanismen mit Patchmanagement, Adminzugängen, Secrets, Logmanagement, Rate Limits, Backup, Restore, Change Control und Incident Response.

Security Snapshot

> AUDIT OVERVIEW
TRANSPORT TLS 1.2 nur mit zeitgemäßen Verfahren · TLS 1.3 bevorzugt, sofern Umgebung und Clients es unterstützen HEADERS HSTS / CSP / nosniff / Referrer-Policy / gezielte Permissions-Policy / Frame-Schutz BROWSER Ressourcen, Einbettungen und riskante DOM-Pfade ausdrücklich begrenzen BETRIEB Logs / Monitoring / gezielte Rate Limits / nachvollziehbare Adminwege LAYERS Angriffsfläche / Patchstand / Rechte / Netz / TLS / Browser / Anwendung / Betrieb / Recovery PRIORITY reale Schwachstellen und Fehlkonfigurationen haben Vorrang vor dekorativen Scores CHANGE RULE sichern → validieren → begrenzt ändern → reload → extern prüfen → Logs prüfen → Rückweg kennen RECOVERY Härtung ohne getesteten Restore und Incident-Ablauf bleibt unvollständig PRINCIPLE verstehen / begrenzen / prüfen / dokumentieren
Sicherheit ist kein einzelner Header, sondern ein fortlaufend gepflegter Systemzustand.
[hardening/layer_model]

Härtung ist Defense in Depth – keine einzelne Headerliste

SchichtKernfrage
ANGRIFFSFLÄCHEWelche Dienste, Module und Endpunkte sind überhaupt erreichbar?
PATCHSTANDSind bekannte Schwachstellen in Betriebssystem, Server und Abhängigkeiten behoben?
RECHTEWas darf ein kompromittierter Prozess tatsächlich erreichen?
TRANSPORTIst die Verbindung mit aktuellem TLS geschützt?
BROWSERWelche Ressourcen, Einbettungen und DOM-Sinks darf die Seite verwenden?
ANWENDUNGWerden Eingaben, Authentisierung und Sitzungen sicher verarbeitet?
BETRIEBWerden Fehler, Missbrauch und Ausfälle sichtbar?
RECOVERYKann nach Fehlkonfiguration, Verlust oder Angriff kontrolliert wiederhergestellt werden?
[mindset/first]

Grundhaltung: verstehen statt kopieren

Eine häufige Fehlentwicklung bei Server-Härtung entsteht durch Konfigurationsblöcke, die aus Generatoren, Foren oder Beispielen übernommen werden, ohne Zweck, Nebenwirkung und Gültigkeitsbereich jeder Direktive ausreichend zu verstehen.

Eine saubere Konfiguration beantwortet deshalb für jede relevante Zeile mindestens drei Fragen: Welche Bedrohung oder Fehlkonfiguration wird begrenzt? Welche Nebenwirkungen sind möglich? Wie lässt sich nach einer Änderung nachweisen, dass die Direktive tatsächlich wie vorgesehen greift?

[regeln] > keine Direktive ohne begründeten Zweck > keine Policy ohne Browser- und Serverprüfung > kein Vertrauen in einen Score ohne Verständnis der Messung > keine externe Abhängigkeit ohne bewusste Freigabe > jede sicherheitsrelevante Änderung braucht einen Rückweg

„Ein guter Security-Score ist ein Messwert – kein Ersatz für nachvollziehbare Entscheidungen.“

[hardening/threat_model]

Vor der Konfiguration steht die Frage: Was soll gegen wen geschützt werden?

Eine statische Informationsseite, ein Loginbereich, ein Administrationspanel und eine Upload-Anwendung haben nicht dieselbe Angriffsfläche. Härtung beginnt deshalb mit einem einfachen Bedrohungsmodell statt mit einer maximal langen Headerliste.

  • Assets: Inhalte, Zugangsdaten, personenbezogene Daten, Schlüssel und Konfigurationen.
  • Entry Points: HTTP-Endpunkte, Formulare, APIs, SSH, Adminoberflächen und Datei-Uploads.
  • Trust Boundaries: Internet, Reverse Proxy, Anwendung, Datenbank, internes Netz und Backup.
  • Failure Impact: Was passiert bei Manipulation, Ausfall, Datenabfluss oder Credential-Diebstahl?
[hardening/attack_surface]

Was nicht benötigt wird, sollte nicht erreichbar oder aktiv sein

Unbenutzte Dienste, Module, Beispielanwendungen, Testverzeichnisse und offen gelassene Administrationspfade vergrößern die Angriffsfläche. Die stärkste Konfiguration eines Webservers hilft wenig, wenn daneben ein vergessener Dienst mit alter Software lauscht.

[Attack_Surface_Review] > welche Ports lauschen? > welche Dienste gehören dorthin? > welche Module sind aktiviert? > welche Adminpfade sind extern erreichbar? > welche Test-/Backup-Dateien liegen im Webroot? > welche alten Hosts oder DNS-Namen zeigen noch auf Infrastruktur? > alles Unnötige abschalten oder isolieren
[operations/patch_management]

Bekannte Schwachstellen sind wichtiger als kosmetische Scores

Betriebssystem, Webserver, Laufzeitumgebung, Bibliotheken und Administrationswerkzeuge brauchen einen nachvollziehbaren Updateprozess. Eine öffentlich bekannte und ausnutzbare Schwachstelle wiegt in der Praxis meist schwerer als ein fehlender dekorativer Header.

Updates werden trotzdem nicht blind eingespielt: Relevanz prüfen, Sicherung und Rückweg kennen, Änderung testen, anschließend extern verifizieren und Logs beobachten.

[security/least_privilege]

Der Webprozess sollte nur das dürfen, was seine Aufgabe verlangt

Ein statischer Webserver braucht typischerweise keinen Schreibzugriff auf den gesamten Webroot. Ein Uploadbereich sollte nicht automatisch ausführbar sein. Ein Dienstkonto sollte nicht zugleich allgemeiner Administrationsbenutzer sein.

Least Privilege begrenzt den Schaden nach einem Fehler: Benutzer, Gruppen, Dateirechte, Service-Sandboxing und getrennte Secrets sind deshalb Härtungsmaßnahmen, keine reine Systempflege.

[network/service_exposure]

Nur notwendige Dienste nach außen – Administration getrennt behandeln

Ein öffentlicher Webserver muss HTTP/HTTPS erreichbar machen. Daraus folgt nicht, dass Datenbank, Verwaltungsoberfläche, Monitoring oder interne Dienste ebenfalls öffentlich lauschen müssen.

Firewallregeln, Bind-Adressen, private Netze und vorgeschaltete Gateways können die Erreichbarkeit begrenzen. Die genaue Architektur ist systemspezifisch; der Grundsatz bleibt: Exposition muss begründet sein.

[transport/tls]

TLS: Transportverschlüsselung als eigene Sicherheitsschicht

HTTPS schützt den Transport zwischen den beteiligten TLS-Endpunkten. Diese Schicht muss korrekt funktionieren, bevor Browser-Policies oder Anwendungsschutz sinnvoll bewertet werden können. Transportverschlüsselung ersetzt jedoch weder sichere Serverkonfiguration noch sichere Anwendungslogik.

  • HTTP → HTTPS: öffentliche Webinhalte konsequent auf HTTPS führen, sofern kein technischer Sonderfall ausdrücklich dagegen spricht.
  • Protokollversionen: TLS 1.0 und 1.1 nicht mehr anbieten; TLS 1.2 nur mit zeitgemäßen Verfahren betreiben und TLS 1.3 bevorzugt ermöglichen.
  • Zertifikate: vollständige Zertifikatskette, kontrollierte Erneuerung und Prüfung des tatsächlich ausgelieferten Zertifikats.
  • Schlüsselmaterial: private Schlüssel nicht im Webroot, in öffentlichen Repositories oder ungeschützten Diagnoseausgaben ablegen.
  • OCSP Stapling: als optionale, server- und CA-abhängige Funktion behandeln – nicht als universelle Pflichtzeile.
# Beispielprinzip – konkrete Syntax immer gegen die installierte nginx-Version prüfen server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://example.com$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; # Cipher-, HTTP/2-/HTTP/3- und OCSP-Details # gegen Server-, TLS-Bibliotheks- und Clientanforderungen prüfen. }
[tls/2026]

TLS 1.2 bleibt in vielen Umgebungen relevant, ist 2026 aber nicht mit beliebigen historischen TLS-1.2-Cipher-Suites gleichzusetzen. Veraltete RSA- und klassische finite-field-DH-Schlüsselaustauschverfahren gehören nicht in eine moderne Konfiguration; statisches ECDH ist ebenfalls keine bevorzugte Wahl. Konkrete Cipherlisten sollten nicht aus alten Vorlagen übernommen werden.

[tls/operations]

TLS-Betrieb 2026: Version, Algorithmen, Zertifikat und realer Endpunkt

TLS 1.0 und TLS 1.1 sind seit Jahren veraltet und sollen nicht mehr ausgehandelt werden. TLS 1.3 ist die modernere Protokollgeneration; TLS 1.2 bleibt für Kompatibilität relevant, verlangt aber eine zeitgemäße Auswahl der tatsächlich verwendeten Verfahren.

Im Jahr 2026 ist die Betrachtung von TLS 1.2 deshalb genauer geworden: Nicht nur die Protokollversionsnummer zählt. Auch der verwendete Schlüsselaustausch muss bewertet werden. Historische RSA-Key-Exchange- und klassische finite-field-DH-Verfahren gehören nicht in neue TLS-1.2-Konfigurationen; statisches ECDH sollte ebenfalls vermieden werden.

Zum Betrieb gehören außerdem vollständige Zertifikatskette, automatisierbare Erneuerung, externer Ablaufcheck und die Prüfung, welches Zertifikat der reale öffentliche TLS-Endpunkt tatsächlich ausliefert. Bei Reverse Proxy oder CDN kann dieser Endpunkt von der Origin-Maschine getrennt sein.

OCSP Stapling ist keine universelle Pflichtdirektive. Unterstützung, Nutzen und Fehlerverhalten hängen von Server, TLS-Bibliothek, Zertifizierungsstelle und Client-Ökosystem ab.

[tls/hsts]

HSTS: Browserzustand mit langfristiger Wirkung

HSTS wird über eine sichere HTTPS-Antwort gelernt. Ein Strict-Transport-Security-Header auf einer ungesicherten HTTP-Antwort begründet keinen vertrauenswürdigen HSTS-Zustand.

includeSubDomains erweitert die Regel auf untergeordnete Hostnamen. Das ist nur sinnvoll, wenn die betroffene Domainstruktur tatsächlich vollständig und dauerhaft HTTPS-fähig ist.

preload ist ein zusätzlicher Browserlisten-Mechanismus und nicht Teil der eigentlichen HSTS-Spezifikation. Für eine Aufnahme in entsprechende Preload-Listen gelten zusätzliche Voraussetzungen. Die Entscheidung sollte deshalb nicht nur wegen eines Security-Scores getroffen werden.

[hsts/preload_commitment]

Vor einer Preload-Anmeldung müssen Apex-Domain und die einbezogenen Subdomains dauerhaft mit HTTPS funktionieren. Ein späterer Rückbau ist langsamer und schwieriger als das Entfernen eines normalen Headers.

[headers/boundaries]

Security-Header haben unterschiedliche Aufgaben und Reichweiten

Header/PolicyAufgabe
HSTSerzwingt für bekannte Hosts zukünftige HTTPS-Nutzung im Browser.
X-Content-Type-Optionsverhindert bestimmtes MIME-Sniffing mit nosniff.
Referrer-Policybegrenzt, welche Referrer-Informationen weitergegeben werden.
frame-ancestorsCSP-Regel gegen unerwünschtes Einbetten der Seite.
X-Frame-Optionsältere, gröbere Frame-Steuerung; kann als Kompatibilitätsschicht dienen.
Permissions-Policybegrenzt Browser-Funktionen, hat aber je nach Direktive unterschiedliche Browserunterstützung.

Kein Header ersetzt sichere Anwendungslogik. Besonders Permissions-Policy sollte nur mit geprüften, tatsächlich unterstützten Direktiven eingesetzt werden.

[policy/csp]

CSP: Ressourcen und Browseraktionen ausdrücklich begrenzen

Eine Content Security Policy ist nur dann belastbar, wenn sie zur realen Seite passt. Eine statische Website ohne externe Skripte, Frames, Netzwerk-Requests aus JavaScript oder Formularendpunkte kann wesentlich enger gefasst werden als eine komplexe Webanwendung.

Für sslxy.de wird die CSP als HTTP-Response-Header über die Serverkonfiguration beziehungsweise .htaccess ausgeliefert. Ein zusätzlicher CSP-Meta-Tag im HTML ist deshalb nicht Bestandteil des Seitenstandards.

# Prinzip für eine statische SSLXY-Seite. # Die schematisch gezeigten Hashwerte müssen in der realen Konfiguration exakt zum jeweiligen Inline-Inhalt passen. Content-Security-Policy: default-src 'self'; base-uri 'self'; object-src 'none'; form-action 'self'; img-src 'self' data:; style-src 'self' 'sha256-<CSS-HASH>'; script-src 'self' 'sha256-<JSONLD-HASH>' 'sha256-<JS-HASH>'; connect-src 'none'; media-src 'self'; font-src 'self' data:; frame-ancestors 'none'; upgrade-insecure-requests;

Hash-Sources sind für unveränderte Inline-Blöcke nachvollziehbar: Schon eine kleine Änderung am exakten Inline-Inhalt erzeugt einen neuen Hash. Deshalb werden die CSP-Hashes bei jeder Änderung der betreffenden HTML-Datei neu berechnet.

Globale Freigaben wie 'unsafe-inline', unnötige Wildcards oder sehr breite Fremdquellen sollten nicht verwendet werden, nur um eine fehlerhafte Policy schnell „grün“ zu bekommen.

[csp/deployment]

Eine CSP wird gegen die reale Seite entwickelt und geprüft

script-src 'self' erlaubt nicht automatisch beliebige Inline-Skripte. Inline-Code benötigt – sofern er beibehalten wird – eine passende Nonce oder Hash-Source. Entsprechendes gilt für Inline-Styles unter style-src.

Für handgeschriebene statische Seiten mit stabilen Inline-Blöcken sind feste SHA-256-Hashes gut nachvollziehbar. Dynamische Anwendungen verwenden häufig Nonces oder verlagern Code vollständig in externe Ressourcen.

Vor einer scharf blockierenden Policy kann ein Report-Only-Betrieb helfen, reale Verstöße sichtbar zu machen. Ein Reporting-Endpunkt ist jedoch selbst ein öffentlich erreichbarer Dateneingang: Reports sind fremdgesteuerte Eingaben und brauchen Datenminimierung, Begrenzung, sichere Verarbeitung und eine definierte Aufbewahrung.

Reporting-Mechanismen und ihre Browserunterstützung entwickeln sich unabhängig von der eigentlichen Blockierwirkung weiter. Deshalb muss eine Reporting-Konfiguration gegen die tatsächlich unterstützten Browser und den konkret eingesetzten Server geprüft werden.

[dom/trusted-types]

Trusted Types: zusätzliche Grenze für riskante DOM-Sinks

Trusted Types ist kein allgemeiner Sicherheitszusatz für jede Website. Der Mechanismus wird relevant, wenn JavaScript tatsächlich mit DOM-XSS-gefährdeten Sinks arbeitet und der Datenfluss zu diesen Sinks ausdrücklich kontrolliert werden soll.

Die einfachste Lösung bleibt häufig, einen riskanten HTML-Sink gar nicht zu verwenden. Für reine Textausgabe ist beispielsweise textContent der direkte und weniger fehleranfällige Weg.

Content-Security-Policy: require-trusted-types-for 'script'; trusted-types sslxy-policy;
// Wenn nur Text benötigt wird: target.textContent = userInput; // Wenn nicht vertrauenswürdiges HTML wirklich notwendig ist: // 1. etablierte Sanitization verwenden, // 2. kleine und auditierbare Trusted-Types-Policy definieren, // 3. erlaubte Policy-Namen begrenzen, // 4. erst danach den erforderlichen HTML-Sink verwenden.
[trusted-types]

Trusted Types ersetzt weder eine passende CSP noch korrekte Sanitization. Es ist eine zusätzliche Schutzschicht gegen bestimmte DOM-XSS-Pfade.

[dom/trusted_types_boundary]

Trusted Types schützt bestimmte DOM-Sinks – nicht beliebigen Code

require-trusted-types-for 'script' kann unterstützende Browser dazu verpflichten, an bestimmten DOM-XSS-Sinks typisierte Werte statt beliebiger Strings zu akzeptieren. Die Direktive trusted-types kann zusätzlich die erlaubten Policy-Namen begrenzen.

Browserunterstützung und Detailverhalten sind versionsabhängig. Eine Website darf deshalb nicht davon ausgehen, dass Trusted Types allein jeden Client oder jeden XSS-Pfad abdeckt.

Selbstgeschriebene Minimalfunktionen wie „ersetze jedes <“ sind keine belastbaren HTML-Sanitizer. Wenn dynamisches HTML unvermeidbar ist, gehört Sanitization in eine kleine, nachvollziehbare und etablierte Verarbeitungskette.

[operations/rate-limiting]

Rate Limiting: gezielte Begrenzung statt pauschaler Bremse

Rate Limiting ist besonders bei Login-, Reset-, Formular-, API- oder rechenintensiven Endpunkten sinnvoll. Für rein statische Dateien ist ein pauschales Limit dagegen nicht automatisch die beste Maßnahme und kann bei gemeinsam genutzten IP-Adressen unnötig legitime Abrufe treffen.

# Beispiel: empfindlichen Endpunkt begrenzen, nicht blind jede statische Datei limit_req_zone $binary_remote_addr zone=login_zone:10m rate=5r/m; server { location = /login { limit_req zone=login_zone burst=5 nodelay; # Anwendung / Proxy folgt hier } } # Vor scharfem Einsatz reale Nutzer, NAT, Proxies und IPv6 berücksichtigen. # nginx bietet für die Beobachtung auch einen Dry-Run-Modus.

Rate Limiting ersetzt keine Authentisierung, Autorisierung oder anwendungsspezifische Missbrauchserkennung. Gegen verteilte Angriffe kann außerdem eine vorgelagerte Netz- oder Providerstrategie erforderlich sein.

[operations/rate_design]

Rate Limiting gehört an die passende Ressource und hinter das richtige Clientmodell

Ein globales Limit pro IP kann bei NAT, Mobilfunk-Gateways, Unternehmensnetzen oder vorgeschalteten Proxies viele legitime Nutzer gemeinsam treffen. Umgekehrt kann ein Angreifer über viele IP-Adressen ein simples Limit umgehen.

Deshalb werden besonders empfindliche Endpunkte gezielt betrachtet: Login, Passwort-Reset, Suchendpunkte, APIs oder teure dynamische Operationen. nginx verwendet dafür im limit_req-Modul ein Leaky-Bucket-Verfahren und bietet auch Dry-Run-Unterstützung zur Beobachtung vor scharfem Einsatz.

Rate Limiting ist Schutz gegen Übermaß und Missbrauch – keine Identitätsprüfung und kein vollständiger DDoS-Schutz.

[operations/logs]

Logs: Beobachtungen für Betrieb und Diagnose

Protokolldaten können Scanverkehr, Fehlermuster, Rate-Limit-Reaktionen und ungewöhnliche Änderungen im Betrieb sichtbar machen. Einzelne Logzeilen sind jedoch zunächst Beobachtungen; ihre Bedeutung entsteht erst durch technische Einordnung und Vergleich mit dem erwarteten Zustand.

  • 404-Cluster: können typischen Scanverkehr oder veraltete interne Links sichtbar machen.
  • 429-Antworten: zeigen Reaktionen eines Rate Limits und helfen bei der Abstimmung.
  • TLS-Fehler: können veraltete Clients, Bots oder Fehlkonfigurationen anzeigen.
  • User-Agent-Angaben: sind fremdgesteuerte Werte und allein kein zuverlässiger Identitätsnachweis.
log_format security '$remote_addr - [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time'; access_log /var/log/nginx/access.log security; error_log /var/log/nginx/error.log warn;

Access-Logs können personenbezogene oder anderweitig sensible Daten enthalten. Zweck, Zugriffsschutz, Aufbewahrung und Löschung müssen deshalb zum tatsächlichen Betrieb passen.

[operations/log_management]

Logmanagement bedeutet sammeln, schützen, rotieren und löschen

NIST behandelt Logmanagement als eigenen Betriebsprozess: Logs müssen erzeugt, übertragen, gespeichert, ausgewertet und schließlich nach definierten Regeln aufbewahrt oder gelöscht werden.

Für Websysteme bedeutet das: Zugriffsrechte auf Logs begrenzen, Rotation und Speicherbedarf planen, Zeitstempel konsistent halten und Datenschutzanforderungen berücksichtigen.

Ein Log, das niemand liest, hilft nur rückblickend. Ein Log, das unbegrenzt alles sammelt, kann selbst zum Datenschutz- und Speicherproblem werden.

[operations/monitoring_alerting]

Monitoring muss Abweichungen sichtbar machen, nicht nur Daten sammeln

  • Verfügbarkeit: antwortet der reale öffentliche Endpunkt?
  • TLS: läuft das Zertifikat ab oder wird das falsche Zertifikat ausgeliefert?
  • Fehlerquote: steigen 5xx-Fehler oder Timeouts ungewöhnlich an?
  • Ressourcen: laufen Platte, Speicher oder Prozessgrenzen voll?
  • Security: ungewöhnliche Loginfehler, Scanmuster oder Policy-Verstöße?

Ein Alarm braucht einen Empfänger und eine Reaktion. Sonst ist Monitoring nur eine weitere Datenquelle.

[config/apache-nginx]

Apache und nginx: wiederverwendbare Bausteine mit Versionsbezug

Wiederverwendbare Konfigurationsbausteine können Pflegefehler reduzieren, solange Vererbung, Include-Reihenfolge und Serverversion verstanden werden. Ein Snippet ist keine universelle Sicherheitsvorlage.

nginx – Beispielprinzip

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "DENY" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always; # CSP getrennt pflegen; bei Inline-Code Hashes oder Nonces exakt verwalten. # add_header Content-Security-Policy "..."; server_tokens off;

Apache – Beispielprinzip

<IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" "expr=%{HTTPS} == 'on'" Header always set X-Frame-Options "DENY" Header always set X-Content-Type-Options "nosniff" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" # CSP als eigene, zur Seite passende Direktive pflegen. </IfModule> ServerTokens Prod ServerSignature Off # Protokoll- und Modulkonfiguration gegen installierte Apache-Version prüfen.

Besonders bei Apache und nginx können Direktiven, Module und Vererbungsregeln versions- oder kontextabhängig wirken. Vor Reload oder Restart gehört deshalb ein Konfigurationstest ebenso zum Ablauf wie die externe Prüfung der tatsächlich ausgelieferten Header.

[architecture/reverse_proxy]

Reverse Proxy und TLS-Termination verschieben die Sicherheitsgrenze

Wenn TLS an CDN, Load Balancer oder Reverse Proxy endet, ist der dahinterliegende Webserver nicht automatisch der öffentliche Sicherheitsrand. Dann müssen Client-IP-Weitergabe, interne Transportverschlüsselung, vertrauenswürdige Proxy-Header und Zugriff auf den Origin bewusst konfiguriert werden.

Besonders gefährlich ist es, beliebige eingehende X-Forwarded-For- oder ähnliche Header blind als vertrauenswürdig zu behandeln. Nur bekannte Proxy-Pfade dürfen solche Informationen autoritativ setzen.

[administration/ssh]

Adminzugriff gehört getrennt vom öffentlichen Webverkehr

SSH-Administration sollte mit begrenzten Konten, nachvollziehbarer Authentisierung und möglichst kleiner Exposition betrieben werden. Ein dauerhaft genutzter direkter Root-Arbeitsmodus vergrößert den Schadensradius und erschwert die Zuordnung von Änderungen.

Ob Schlüssel, zusätzliche Faktoren, VPN, Bastion oder eine Kombination sinnvoll ist, hängt von Architektur und Risiko ab. Entscheidend bleibt, dass Administrationszugänge als besonders schützenswerte Zugänge eine eigene Schutz- und Wiederherstellungsstrategie erhalten.

[security/secrets]

Secrets gehören nicht in Webroot, Repository oder Logausgabe

Private Schlüssel, API-Tokens, Datenbankpasswörter und andere Geheimnisse müssen getrennt von öffentlich ausgelieferten Dateien und möglichst getrennt von gewöhnlichem Quelltext verwaltet werden.

Backup, Rotation und Widerruf beziehungsweise Austausch gehören zum Lebenszyklus. Ein Secret, das in einem Log oder öffentlichen Repository auftauchte, sollte nicht nur „wieder gelöscht“, sondern als potenziell kompromittiert behandelt werden.

[operations/config_validation]

Vor Reload oder Restart: Syntax und effektive Konfiguration prüfen

Webserver und Dienste bieten häufig eigene Konfigurationstests. Diese sollten vor einem Reload genutzt werden, weil ein Tippfehler sonst aus einer Sicherheitsänderung einen Ausfall machen kann.

Zusätzlich zählt die effektive Konfiguration: Include-Dateien, Vererbungsregeln und virtuelle Hosts können bewirken, dass eine scheinbar gesetzte Direktive an einem anderen Ort überschrieben wird.

[operations/change_control]

Härtung wird als kontrollierte Änderung betrieben

[Controlled_Hardening_Change] > aktuellen Zustand dokumentieren > Konfiguration sichern > eine begrenzte Änderung vorbereiten > Syntax validieren > reload statt unnötigem Full Restart, wenn passend > intern und extern testen > Header/TLS/Status prüfen > Logs beobachten > Rückweg dokumentieren
[resilience/backup_recovery]

Härtung verhindert nicht jeden Ausfall – Recovery gehört dazu

Konfiguration, Webdaten, Zertifikatsbezüge und gegebenenfalls Anwendungsdaten brauchen eine Wiederherstellungsstrategie. Ein Backup ist erst belastbar, wenn mindestens ausgewählte Restores unter realistischen Bedingungen erfolgreich geprüft wurden.

Sicherungen sollten nicht vollständig über denselben Fehlerpfad, dieselben Zugangsdaten oder dieselbe administrative Vertrauensgrenze wie das Produktivsystem zerstörbar sein.

[operations/incident_response]

Bei Verdacht auf Kompromittierung reicht ein Neustart nicht

Ein Sicherheitsvorfall braucht eine nachvollziehbare Reihenfolge: Auswirkungen begrenzen, relevante Beweise und Protokolle sichern, Zugangsdaten und Schlüssel bewerten, Ursache und Reichweite bestimmen, betroffene Komponenten kontrolliert neu aufbauen oder bereinigen und erst danach in einen vertrauenswürdigen Betriebszustand zurückkehren.

Wenn ein Secret kompromittiert sein könnte, gehört Rotation zum Vorfall. Wenn die Vertrauensbasis des Systems nicht mehr zuverlässig bewertbar ist, kann ein sauberer Neuaufbau belastbarer sein als eine Folge punktueller Reparaturen.

[software/dependencies]

Auch externe Bibliotheken und Build-Werkzeuge gehören zur Angriffsfläche

Webserverhärtung schützt nicht vor einer verwundbaren Anwendung, einem kompromittierten Plugin oder einer ungeprüften Abhängigkeit. Inventar, Herkunft, Versionen und Updatefähigkeit der eingesetzten Komponenten gehören deshalb zum Sicherheitsbild.

Für sehr statische Seiten ist eine kleine Abhängigkeitsfläche selbst bereits ein Sicherheitsvorteil: weniger Fremdcode, weniger Updateketten und weniger externe Laufzeitabhängigkeiten.

[testing/scores_and_reality]

Scanner und A+-Scores sind Messpunkte – keine Sicherheitsgarantie

Automatische Tests sind wertvoll, weil sie reproduzierbar TLS, Header oder bekannte Fehlkonfigurationen prüfen können. Sie sehen aber nicht automatisch Geschäftslogik, gestohlene Credentials, fehlerhafte Berechtigungen im Backend oder fehlende Restorefähigkeit.

Ein hoher Score ist deshalb nützlich, wenn die zugrunde liegenden Entscheidungen verstanden sind. Er ist gefährlich, wenn er ausschließlich als Ziel optimiert wird.

[operations/checkliste]

Checkliste vor Go-Live oder größerer Sicherheitsänderung

Transport

HTTPS aktiv
HTTP-Weiterleitung geprüft
Zertifikatskette vollständig
Erneuerung geprüft
TLS-Versionen und Verfahren aktuell bewertet

Header

HSTS bewusst gesetzt
nosniff geprüft
Referrer-Policy gesetzt
Permissions-Policy nur mit benötigten Features
Frame-Schutz geprüft

CSP

keine unnötigen Wildcards
kein gedankenloses unsafe-inline
Inline-Hashes/Nonces exakt passend
Report-Only bei größeren Änderungen erwogen
tatsächliche Auslieferung geprüft

Betrieb

Adminzugänge begrenzt
Logs geschützt und rotierend
Backups vorhanden
Restore getestet
Updates planbar
externer Test mit realen Requests

„Eine sichere Konfiguration ist nicht die längste, sondern diejenige, deren Zweck, Wirkung und Rückweg auch später noch nachvollziehbar sind.“

[archive/security_configuration]

Sicherheitskonfigurationen brauchen Versions- und Herkunftskontext

Eine historische nginx- oder Apache-Konfiguration ist ohne Serverversion, Betriebssystem, Module und Architekturkontext nur teilweise verständlich. Direktiven können veraltet, umbenannt oder in späteren Versionen anders bewertet werden.

[SECURITY-CONFIG-RECORD] > date / host role: > operating system: > webserver + version: > TLS library: > enabled modules: > reverse proxy / CDN: > security headers: > CSP / Trusted Types: > rate limits: > log policy: > backup / rollback reference: > last external verification:

Geheimnisse, private Schlüssel und echte Zugangsdaten werden dabei getrennt behandelt und nicht in eine öffentliche Dokumentation kopiert.