Einführung von „Public Key Pinning“ mit HPKP-Berichten

Emily Stark

Die Verwendung von SSL auf Ihrer Website ist eine wichtige Möglichkeit, die Sicherheit und den Datenschutz für Ihre Nutzer zu wahren. Das Aktivieren von SSL ist jedoch noch nicht alles: Es gibt viele Schritte, die Sie unternehmen können, um die Sicherheit Ihrer Website weiter zu verbessern. Sie können beispielsweise das Attribut „Secure“ für Ihre Cookies festlegen, HTTP Strict Transport Security aktivieren oder Content Security Policy verwenden, um die Berechtigungen Ihrer Website zu sperren. Die Bereitstellung dieser leistungsstarken Features kann jedoch manchmal schwierig sein. Um Sie bei der Einführung einer strikteren Form von SSL zu unterstützen, beinhaltet Chrome 46 eine Funktion namens HPKP Reporting.

Was bedeuten all diese Abkürzungen?

Sicherheit im Web stützt sich heutzutage auf SSL-Zertifikate: kryptografische Signaturen, die beweisen, dass eine Website die ist, die sie vorgibt. Wenn Ihr Browser eine Anfrage an eine URL wie https://developers.google.com sendet, stellt der Server ein SSL-Zertifikat bereit. Wenn das Zertifikat gültig ist, lässt der Browser die Fortsetzung der Anfrage zu und zeigt die Website-URL mit einem grünen Vorhängeschloss in der Adressleiste an.

Was ist ein gültiges Zertifikat? Ein Zertifikat gilt nur dann als gültig, wenn es von einer Zertifizierungsstelle oder einem anderen Zertifikat signiert wurde, das von einer Zertifizierungsstelle signiert wurde (Zwischenzertifizierungsstelle). In Browsern und Betriebssystemen sind mehrere hundert CAs enthalten, denen die Ausstellung von Zertifikaten vertrauenswürdig ist. Das Problem ist jedoch, dass diese Zertifizierungsstellen standardmäßig Zertifikate für jede Website ausstellen können. Wenn eines von ihnen manipuliert wird oder sich falsch verhält, kann das für das gesamte Web verheerend sein.

Geben Sie HTTP Public Key Pinning oder HPKP ein. Mit diesem Standard können Websites einen HTTP-Header senden, der den Browser anweist, sich Teile der SSL-Zertifikatskette zu merken bzw. anzupinnen. Der Browser lehnt dann nachfolgende Verbindungen ab, die nicht mit den zuvor empfangenen Pins übereinstimmen. Hier ein Beispiel für einen HPKP-Header:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

In diesem Header werden zwei Zertifikats-Hashes als Pins angegeben. Eines ist ein Hash eines Zertifikats in der Zertifikatskette der Website und der andere ein Back-up-PIN oder ein Hash eines Zertifikats, das die Website verwenden kann, wenn ihr Zertifikat rotiert werden muss. Der Header enthält auch einen max-age-Wert. Nach Ablauf dieser Anzahl von Sekunden hat der Browser die PIN nicht mehr im Blick.

Weitere Informationen zu HPKP im Allgemeinen finden Sie in der Spezifikation oder im hervorragenden Blogpost des Chrome-Entwicklers Chris Palmer.

Soll ich HPKP jetzt aktivieren?

Nicht unbedingt. Wenn Sie HPKP bereitstellen, kann es recht leicht passieren, dass ein Fehler unterläuft und Ihre Website versehentlich einem DoS-Angriff verbietet. Wenn Sie Ihre Website an einen Zertifikatssatz anpinnen und dann ein neues Zertifikat bereitstellen müssen, können Nutzer, die die PIN gesehen haben, erst dann auf Ihre Website zugreifen, wenn die PIN abgelaufen ist (basierend auf dem max-age-Wert im Header).

Da es schwierig ist, die richtigen Entscheidungen zu treffen, wird HPKP derzeit hauptsächlich von einigen wenigen bekannten, sicherheitsrelevanten Websites verwendet. Wenn Sie sich dafür entscheiden, HPKP zu aktivieren, sollten Sie mit einem sehr niedrigen Höchstwert beginnen und diesen schrittweise erhöhen, wenn keine Probleme auftreten.

Was ist HPKP-Berichterstellung und wie hilft sie?

Die HPKP-Berichterstellung, die in Chrome 46 verfügbar ist, ist eine Funktion, mit der Sie bei der Einführung von HPKP Fehlkonfigurationen erkennen können.

Sie können zuerst den Header Public-Key-Pins-Report-Only anstelle des Headers „Public-Key-Pins“ senden:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

Wenn Ihre Website einen solchen Header sendet, prüft Chrome, ob die aktuelle Verbindung mit den Pins übereinstimmt. Ist dies nicht der Fall, sendet Chrome einen Bericht an report-uri. Chrome blockiert niemals Anfragen basierend auf den Pins in einem Report-Only-Header. Dies ist eine sichere Möglichkeit, um HPKP zu testen und herauszufinden, ob es Probleme für Ihre Nutzer verursacht, ohne dass das Risiko eines DoS-Angriffs auf Ihre Website besteht.

Ein Report-Only-Header gilt nur für die Anfrage, bei der er empfangen wurde. Der Browser merkt sich keine Nur-Bericht-Markierungen wie bei echten Markierungen. Auf diese Weise können Sie Ihre Konfiguration testen, ohne sich Gedanken über die Zwischenspeicherung fehlerhafter Werte in den Browsern Ihrer Nutzer machen zu müssen. Außerdem können Sie die Konfiguration schrittweise einführen (z. B. nur für eine einzelne Ressource), um eine Überflutung Ihres Servers mit Berichten zu vermeiden.

Wenn Sie den echten Public-Key-Pins-Header einführen, um Ihre PINs zu erzwingen, können Sie auch einen „report-uri“-Wert in diesen Header aufnehmen, damit Sie weiterhin Berichte erhalten, falls Probleme auftreten.

Was beinhaltet eine Meldung über einen HPKP-Verstoß?

Eine Meldung über einen HPKP-Verstoß ist eine JSON-Nachricht, die in einer HTTP-POST-Anfrage an Ihre konfigurierte report-uri gesendet wird. Die Liste der Felder befindet sich in der spec, aber ich werde hier zwei von ihnen hervorheben: served-certificate-chain und validated-certificate-chain. Das served-certificate-chain ist das Zertifikat, das Chrome beim Einrichten der SSL-Verbindung für die Anfrage erhalten hat. Andererseits ist validated-certificate-chain die Kette, die Chrome bei der Validierung des Serverzertifikats neu erstellt hat. Diese kann sich natürlich von der served-certificate-chain unterscheiden. Verschiedene Clients führen die Zertifikatsvalidierung auf unterschiedliche Weise durch, was eine häufige Ursache für HPKP-Fehlkonfigurationen sein kann. Aktivieren Sie dieses Feld, wenn Sie unerwartete Berichte erhalten.

Ein letztes Problem

Wenn Sie HPKP-Berichte bereitstellen, denken Sie daran, dass Chrome für alle Anfragen, einschließlich Anfragen zum Senden von Berichten, eine PIN-Validierung durchführt. Wenn Sie also HPKP für Ihre Website bereitgestellt haben, möchten Sie HPKP-Berichte wahrscheinlich an eine andere Domain senden, die Sie nicht angepinnt haben. Andernfalls wird bei einem Verstoß gegen die PIN auf Ihrer Website ein Bericht für die gleiche Domain ausgelöst, was ebenfalls nicht zum Pin-Verstoß führt und Sie daher keinen Bericht erhalten.

Wenn Sie keine andere Domain zur Hand haben, können Sie stattdessen einen Dienst wie report-uri.io ausprobieren, der Berichte über Verstöße für Sie verarbeitet.