Transport
HTTPS aktiv
HTTP sauber umgeleitet
Zertifikatskette vollständig
Erneuerung getestet
OCSP Stapling geprüft
TLS, Header, CSP, Trusted Types, Rate Limiting – A+ als Ergebnis sauberer Arbeit, nicht als Selbstzweck.
Server-Härtung beginnt nicht mit einem Tool-Score und endet auch nicht dort. Sie beginnt mit dem Verständnis, welche Angriffsfläche eine Website überhaupt hat, und sie lebt davon, dass jede gesetzte Direktive einen bekannten Zweck erfüllt.
Diese Seite beschreibt keinen Sicherheitsaberglauben und kein Copy-Paste aus Generatoren. Sie beschreibt die nüchterne Praxis: HTTPS ohne Altlasten, sinnvolle Security-Header, eine passende CSP, klare Grenzen für Browser-Funktionen und ein Betrieb, der Logs tatsächlich liest.
| Schicht | Kernfrage |
|---|---|
| ANGRIFFSFLÄCHE | Welche Dienste, Module und Endpunkte sind überhaupt erreichbar? |
| PATCHSTAND | Sind bekannte Schwachstellen in Betriebssystem, Server und Abhängigkeiten behoben? |
| RECHTE | Was darf ein kompromittierter Prozess tatsächlich erreichen? |
| TRANSPORT | Ist die Verbindung mit aktuellem TLS geschützt? |
| BROWSER | Welche Ressourcen, Einbettungen und DOM-Sinks darf die Seite verwenden? |
| ANWENDUNG | Werden Eingaben, Authentisierung und Sitzungen sicher verarbeitet? |
| BETRIEB | Werden Fehler, Missbrauch und Ausfälle sichtbar? |
| RECOVERY | Kann nach Fehlkonfiguration, Verlust oder Angriff kontrolliert wiederhergestellt werden? |
Die häufigste Fehlentwicklung bei Server-Härtung ist nicht zu wenig Technik, sondern zu wenig Verständnis. Man übernimmt Konfigurationsblöcke aus Foren, Generatoren oder Blogposts, bekommt vielleicht einen grünen Testbericht und merkt erst später, dass die Hälfte davon nicht zur eigenen Seite passt.
Eine saubere Konfiguration beantwortet drei Fragen: Was schützt diese Direktive? Welchen Nebeneffekt hat sie? Wie prüfe ich nach einer Änderung, ob sie noch korrekt greift? Wenn eine dieser drei Antworten fehlt, ist die Zeile in der Konfiguration bereits verdächtig.
„Ein guter Security-Score ist kein Ziel. Er ist nur ein Nebenprodukt sauberer Entscheidungen.“
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.
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.
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.
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.
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.
TLS ist die Grundlage. Ohne saubere Transportverschlüsselung sind alle späteren Header nur Kosmetik. Der erste Schritt ist deshalb schlicht: HTTP konsequent nach HTTPS umleiten und auf veraltete Protokollgenerationen verzichten.
Wenn HSTS mit preload verwendet wird, müssen includeSubDomains und ein max-age von mindestens einem Jahr vorhanden sein. Das setzt eine wirklich vollständige HTTPS-Disziplin für die gesamte Domainfamilie voraus.
preload ist kein Standard-Häkchen für jede Website. Vorher müssen Apex-Domain und sämtliche betroffenen Subdomains dauerhaft HTTPS-fähig sein. Ein versehentlich vorab geladener Namensraum lässt sich nicht augenblicklich aus allen Browserlisten zurückholen.
RFC 8996 stuft TLS 1.0 und 1.1 als veraltet ein; moderner Betrieb beginnt daher mindestens bei TLS 1.2 und kann TLS 1.3 anbieten. Welche Cipher-Details sinnvoll sind, hängt von Bibliothek, Serverversion und Zielclients ab.
Zum Betrieb gehören außerdem vollständige Zertifikatskette, automatisierte Erneuerung, externer Ablaufcheck und die Prüfung, welches Zertifikat der reale TLS-Endpunkt tatsächlich ausliefert.
OCSP Stapling ist keine universelle Pflichtzeile, die blind in jede Konfiguration gehört. Unterstützung und Nutzen hängen von CA, Client-Ökosystem und Serveraufbau ab.
HSTS wird nur über eine sichere HTTPS-Antwort gelernt. Der Header auf einer HTTP-Antwort wird vom Browser ignoriert.
includeSubDomains bindet auch untergeordnete Namen an
HTTPS. preload ist zusätzlich eine Aufnahme in
Browser-Preload-Listen und nicht Teil des eigentlichen HSTS-Standards.
Vor dem Einsatz muss deshalb die gesamte betroffene Domainfamilie
dauerhaft HTTPS-fähig sein.
Security-Header sind kein Sammelalbum. Einige sind heute zentral, andere eher Altkompatibilität. Ich setze nur, was klaren Nutzen hat und im Browser auch noch sauber verstanden wird.
frame-ancestors in CSP die modernere Steuerung ist.X-XSS-Protection ist eine Altlast aus älteren Browsergenerationen. Für neue Konfigurationen ist der eigentliche XSS-Schutz die Kombination aus sauberem Markup, Verzicht auf riskante DOM-Sinks und einer passenden CSP.
| Header/Policy | Aufgabe |
|---|---|
| HSTS | erzwingt für bekannte Hosts zukünftige HTTPS-Nutzung im Browser. |
| X-Content-Type-Options | verhindert bestimmtes MIME-Sniffing mit nosniff. |
| Referrer-Policy | begrenzt, welche Referrer-Informationen weitergegeben werden. |
| frame-ancestors | CSP-Regel gegen unerwünschtes Einbetten der Seite. |
| X-Frame-Options | ältere, gröbere Frame-Steuerung; kann als Kompatibilitätsschicht dienen. |
| Permissions-Policy | begrenzt 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.
Eine Content-Security-Policy ist nur dann gut, wenn sie zur Seite passt. Für eine rein statische Seite ohne fremde Skripte ist die CSP erfreulich streng. Für komplexere Seiten muss sie bewusst erweitert werden. Was ich nicht tue: eine universelle „irgendwie grüne“ Policy aus dem Netz übernehmen.
Für klassische Informationsseiten ist dieser Aufbau ein sauberer Ausgangspunkt:
Der Unterschied zwischen einer guten und einer schlechten CSP liegt oft in zwei Dingen: erstens dem Verzicht auf bequeme Weichmacher wie 'unsafe-inline', zweitens in ehrlicher Prüfung mit Report-Only, bevor blockiert wird.
Für stark statische Seiten kann statt Nonce auch ein Hash für kleine Inline-Skripte sinnvoll sein. Für dynamische Anwendungen ist Nonce oft praktischer. Beides ist sauberer als globale Inline-Freigaben.
Eine Policy mit script-src 'self' blockiert Inline-Skripte,
sofern diese nicht über Nonce oder Hash erlaubt werden. Dasselbe gilt
sinngemäß für Inline-Styles unter style-src.
Für statische, handgeschriebene Seiten sind feste SHA-256-Hashes für unveränderte Inline-Skripte eine nachvollziehbare Möglichkeit. Bei jeder Änderung des Skriptinhalts ändert sich jedoch auch der Hash. Dynamische Anwendungen nutzen häufig Nonces.
OWASP empfiehlt für starke CSP-Ansätze insbesondere nonce- oder
hashbasierte Policies; 'unsafe-inline' sollte nicht nur
eingesetzt werden, um Warnungen schnell verschwinden zu lassen.
CSP-Reporting wird heute über report-to und den
Reporting-Endpoints-Header modelliert. Das ältere
report-uri ist veraltet, kann aber übergangsweise für
ältere Clients zusätzlich sinnvoll sein. Reports selbst sind
untrusted input.
Trusted Types ist kein allgemeiner Schmuck für jede Website. Es ist dort interessant, wo JavaScript mit riskanten DOM-Sinks wie innerHTML arbeitet und wo man den Fluss zu diesen Sinks bewusst kontrollieren will. Für eine rein statische Seite ohne solche Muster ist es nicht der erste Hebel.
Wenn es eingesetzt wird, dann nicht als bloßer String-Durchreicher, sondern über eine klar definierte Policy, die HTML bewusst aufbereitet oder sanitisiert.
Trusted Types ersetzt keine saubere CSP und auch keine inhaltliche Sanitization. Es ist eine zusätzliche Sperrschicht gegen DOM-basiertes XSS, nicht die ganze Lösung.
require-trusted-types-for 'script' zwingt unterstützende
Browser dazu, an bestimmten DOM-XSS-Sinks typisierte Werte statt
beliebiger Strings zu akzeptieren. Die Direktive
trusted-types kann zusätzlich erlaubte Policy-Namen begrenzen.
Seit 2026 ist die Browserunterstützung deutlich breiter geworden, ältere Clients können die Mechanismen aber weiterhin nicht kennen. Die beste Lösung bleibt oft, riskante HTML-Sinks gar nicht zu benutzen.
Eine selbstgeschriebene Funktion wie „ersetze einfach jedes
<“ ist kein belastbarer HTML-Sanitizer. Wenn dynamisches
HTML wirklich benötigt wird, gehört Sanitization in eine kleine,
auditierbare und etablierte Verarbeitungskette.
Nicht jede Seite braucht dieselbe Härte. Aber fast jede öffentlich erreichbare Seite profitiert davon, wenn einzelne Clients nicht unbegrenzt und ohne Taktung feuern können. Für Login- oder Formular-Endpunkte ist das Pflicht. Für statische Seiten ist es zumindest ein vernünftiger Filter gegen den alltäglichen Lärm.
Rate Limiting ersetzt keine Zugangskontrolle und auch kein Fail2Ban, aber es nimmt Druck aus vielen banalen Angriffsmustern und macht Logbilder lesbarer.
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.
Security ohne Log-Sicht ist blind. Ein Scanner, der nachts zehnmal nach /.env, /wp-login.php oder alten PHPMyAdmin-Pfaden fragt, ist kein Weltuntergang. Aber man sollte wissen, dass er da war, wie häufig er auftaucht und ob das Muster kippt.
Gleichzeitig gilt: Access-Logs enthalten personenbezogene Daten. Kurze Aufbewahrung, klarer Zweck und kein Sammeltrieb.
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.
Ein Alarm braucht einen Empfänger und eine Reaktion. Sonst ist Monitoring nur eine weitere Datenquelle.
Ich halte Security-Header und TLS-Parameter gern in wiederverwendbaren Snippets. Nicht, weil Modularisierung schön aussieht, sondern weil Pflegefehler sonst schnell auf mehreren Hosts gleichzeitig auseinanderlaufen.
Wer Apache mit HTTP/2 sauber fahren will, setzt das nicht nur „gefühlt“, sondern ausdrücklich über Protocols h2 http/1.1 und hält den Rest der TLS-Konfiguration schlank und nachvollziehbar.
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.
SSH-Administration sollte mit begrenzten Konten, nachvollziehbarer Authentisierung und minimal notwendiger Erreichbarkeit betrieben werden. Direkter dauerhafter Root-Arbeitsmodus vergrößert den Schadensradius.
Ob Schlüssel, zusätzliche Faktoren, VPN oder Bastion sinnvoll sind, hängt von Umgebung und Risiko ab. Der Grundsatz lautet: Administrationszugänge sind Hochwert-Zugänge und brauchen eine eigene Schutzstrategie.
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.
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.
Konfiguration, Webdaten, Zertifikatsbezüge und gegebenenfalls Anwendungsdaten brauchen eine Wiederherstellungsstrategie. Ein Backup ist erst belastbar, wenn ausgewählte Restores getestet wurden.
Backups sollten nicht mit denselben Zugangsdaten und demselben Fehlerpfad vollständig vom Produktivsystem zerstörbar sein. Die ausführliche Restore-Praxis bleibt auf datensicherung-und-backups.htm.
Ein Incident braucht mindestens eine belastbare Reihenfolge: Auswirkung begrenzen, Beweise und Logs sichern, Zugangsdaten und Schlüssel bewerten, Ursache identifizieren, betroffene Komponenten neu aufbauen oder bereinigen und erst danach kontrolliert zurückkehren.
Wenn ein Secret kompromittiert sein könnte, gehört Rotation zum Vorfall. Wenn die Vertrauensbasis des Systems unklar ist, kann ein sauberer Neuaufbau sicherer sein als punktuelles „Weiterreparieren“.
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.
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.
HTTPS aktiv
HTTP sauber umgeleitet
Zertifikatskette vollständig
Erneuerung getestet
OCSP Stapling geprüft
HSTS bewusst gesetzt
nosniff vorhanden
Referrer-Policy gesetzt
Permissions-Policy sinnvoll beschränkt
X-Frame-Options oder frame-ancestors geprüft
keine unnötigen Wildcards
kein gedankenloses unsafe-inline
Report-Only vor scharfem Block
Browser-Konsole ohne CSP-Rauschen
Rate Limiting aktiv
Logs lesbar und rotierend
Backups vorhanden
Updates planbar
Test mit echten Browsern und echten Requests
„Eine sichere Konfiguration ist nicht die längste. Sie ist die, die auch nach Monaten noch verstanden und gepflegt wird.“
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.
Geheimnisse, private Schlüssel und echte Zugangsdaten werden dabei getrennt behandelt und nicht in eine öffentliche Dokumentation kopiert.
RFC 8996 – Deprecating TLS 1.0 and TLS 1.1
RFC 6797 – HTTP Strict Transport Security
MDN – Strict-Transport-Security und Preload-Hinweise
OWASP Cheat Sheet Series – Content Security Policy
MDN – require-trusted-types-for
nginx – ngx_http_limit_req_module
Die Referenzen liefern technische Grundlagen. Konkrete produktive Konfigurationen müssen immer gegen installierte Versionen, Architektur, Browseranforderungen und reale Dienste geprüft werden.
Diese Seite liegt im sslxy-Bereich der Domain und dokumentiert technische Erfahrungen und Grundsätze zu Server-Härtung, TLS, HTTP-Security-Headern, Content Security Policy, Trusted Types, Rate Limiting, Logmanagement, Monitoring, Administrationszugängen, Backups und Recovery. sslxy ist ein technisches Pseudonym und kein davon getrennt betriebener Hosting-, Security-, Penetrationstest- oder IT-Dienstleister.
Genannte Server-, Standard-, Protokoll-, Browser- und Techniknamen dienen ausschließlich der sachlichen technischen Einordnung.
Anbieter und Verantwortlicher der gesamten Domain – einschließlich dieses Unterverzeichnisses – ist der Betreiber des Goldenen Ochsen in Göppingen-Hohenstaufen. Die maßgeblichen Anbieterangaben stehen im zentralen Impressum der Domain; die Informationen zur Datenverarbeitung in der Datenschutzerklärung der Domain.
Sicherheitskonfigurationen sind versions-, architektur- und anwendungsabhängig. Beispielkonfigurationen auf dieser Seite sind Dokumentation und Ausgangspunkte, keine ungeprüft übernehmbare Garantie für konkrete Produktivsysteme.
Kontakt für technische Hinweise: mail@sslxy.de
Auch diese Unterseite ist als rein informative, statische HTML-Seite konzipiert. Es werden keine Tracker, keine Analyse-Tools und keine zustimmungspflichtigen Cookies eingesetzt.
Statische Seite. Schlanke Struktur. Technischer Inhalt ohne Sicherheitsfolklore.