Uitrol van het vastzetten van publieke sleutels met HPKP-rapportage

Het gebruik van SSL op uw site is een belangrijke manier om de veiligheid en privacy van uw gebruikers te waarborgen. Maar het inschakelen van SSL is niet het einde van het verhaal: er zijn veel stappen die u kunt nemen om de beveiliging van uw site verder te verbeteren, van het instellen van het Secure-attribuut op uw cookies tot het inschakelen van HTTP Strict Transport Security tot het gebruiken van Content Security Policy om vergrendel de rechten van uw site. Het implementeren van deze krachtige functies kan echter soms lastig zijn. Om u te helpen een strengere vorm van SSL te implementeren, wordt Chrome 46 geleverd met een functie genaamd HPKP-rapportage.

Wat betekenen al deze acroniemen?

De beveiliging op internet is tegenwoordig afhankelijk van SSL-certificaten: cryptografische handtekeningen die bewijzen dat een website is wie hij zegt wie hij is. Wanneer uw browser een verzoek verzendt naar een URL zoals https://developers.google.com , levert de server een SSL-certificaat. Als het certificaat geldig is, staat de browser toe dat het verzoek wordt voortgezet en wordt de website-URL weergegeven met een groene hangslot in de adresbalk.

Maar wat is een geldig certificaat? Om als geldig te worden beschouwd, moet een certificaat zijn ondertekend door een certificeringsinstantie (CA), of door een ander certificaat dat is ondertekend door een CA (ook wel een tussenliggende CA genoemd). Browsers en besturingssystemen worden geleverd met een lijst van enkele honderden CA's die vertrouwd worden om certificaten uit te geven. Het probleem is echter dat elk van deze CA's standaard certificaten voor elke website kan uitgeven. Als een van hen wordt gecompromitteerd of zich misdraagt, kan dat verwoestende gevolgen hebben voor het hele internet.

Voer HTTP Public Key Pinning of HPKP in. Met deze standaard kunnen websites een HTTP-header verzenden waarin de browser wordt geïnstrueerd om delen van de SSL-certificaatketen te onthouden (of te "pinnen"). De browser zal vervolgens volgende verbindingen weigeren die niet overeenkomen met de pinnen die hij eerder heeft ontvangen. Hier is een voorbeeld van een HPKP-header:

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

Deze header specificeert twee certificaathashes als pinnen. De ene is een hash van een certificaat in de certificaatketen van de site, en de andere is een back-uppin, of een hash van een certificaat dat de site kan gebruiken in het geval dat het certificaat moet worden gerouleerd. De header bevat ook een max-age . Nadat dat aantal seconden is verstreken, vergeet de browser de pincode.

Voor meer informatie over HPKP in het algemeen kun je de specificaties of de uitstekende blogpost van collega Chrome-ontwikkelaar Chris Palmer raadplegen.

Moet ik HPKP nu meteen inschakelen?

Niet noodzakelijk. Wanneer u HPKP implementeert, is het vrij eenvoudig om een ​​fout te maken en per ongeluk uw site te doseren. Als u uw site vastmaakt aan één set certificaten en vervolgens een nieuwe moet implementeren, hebben gebruikers die de pincode hebben gezien geen toegang tot uw site totdat de pincode verloopt (gebaseerd op de max-age in de header).

Omdat het lastig is om het goed te doen, wordt HPKP momenteel vooral gebruikt door een handvol spraakmakende, beveiligingsgevoelige sites. Als u besluit HPKP in te schakelen, moet u beginnen met een zeer korte maximale leeftijdswaarde en deze geleidelijk verhogen als u geen problemen ondervindt.

Wat is HPKP-rapportage en hoe helpt het?

HPKP-rapportage, geleverd in Chrome 46, is een functie die u kunt gebruiken om verkeerde configuraties te detecteren terwijl u HPKP uitrolt.

Ten eerste kunt u beginnen met het verzenden van de Public-Key-Pins-Report-Only header in plaats van de Public-Key-Pins-header:

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"

Wanneer uw site een dergelijke header verzendt, verifieert Chrome of de huidige verbinding overeenkomt met de pinnen, en stuurt een rapport naar de report-uri als dit niet het geval is. Chrome blokkeert nooit verzoeken op basis van de pinnen in een Report-Only-header. Dit is dus een veilige manier om HPKP uit te proberen en te kijken of dit problemen voor uw gebruikers veroorzaakt zonder het risico te lopen uw site te doSeren.

Houd er rekening mee dat een Report-Only-header alleen van toepassing is op het verzoek waarop deze is ontvangen. De browser onthoudt Report-Only-pins niet zoals bij echte pins. Hierdoor kunt u uw configuratie testen zonder dat u zich zorgen hoeft te maken over het opslaan van slechte waarden in de browsers van uw gebruikers, en kunt u stapsgewijs uitrollen (bijvoorbeeld op slechts één bron) om te voorkomen dat uw server wordt overspoeld met rapporten.

Wanneer u de echte Public-Key-Pins header uitrolt om te beginnen met het afdwingen van uw pinnen, kunt u ook een report-uri-waarde in die header opnemen, zodat u rapporten blijft ontvangen als er zich problemen voordoen.

Wat staat er in een HPKP-schendingsrapport?

Een HPKP-schendingsrapport is een JSON-bericht dat in een HTTP POST-verzoek naar uw geconfigureerde report-uri wordt verzonden. De lijst met velden is te vinden in de spec , maar ik zal er hier twee uitlichten: served-certificate-chain en validated-certificate-chain . De served-certificate-chain is het certificaat precies zoals Chrome het heeft ontvangen bij het instellen van de SSL-verbinding voor het verzoek. De validated-certificate-chain daarentegen is de keten die Chrome opnieuw heeft opgebouwd toen hij probeerde het certificaat van de server te valideren, wat verrassend genoeg anders kan zijn dan de served-certificate-chain . Verschillende clients voeren certificaatvalidatie op verschillende manieren uit, en dit kan een veelvoorkomende oorzaak zijn van HPKP-misconfiguraties. Vink dit veld zeker aan als u onverwachte meldingen ontvangt.

Nog een laatste "gotcha"

Als u HPKP-rapportage implementeert, moet u er rekening mee houden dat Chrome de validatie vastzet voor alle verzoeken, inclusief verzoeken voor het verzenden van rapporten. Dus als u HPKP voor uw site heeft geïmplementeerd, wilt u waarschijnlijk HPKP-rapporten naar een ander domein sturen dat u niet heeft vastgezet. Anders zal een pinovertreding op uw site leiden tot een rapport naar hetzelfde domein, wat eveneens een pinovertreding zal mislukken, en u zult het rapport dus niet ontvangen.

Als u geen ander domein bij de hand heeft, kunt u in plaats daarvan een dienst zoals report-uri.io proberen, die overtredingsrapporten voor u afhandelt.