Implementazione del blocco della chiave pubblica con i report HPKP

Emily Stark

L'utilizzo di SSL sul tuo sito è un modo importante per tutelare la sicurezza e la privacy dei tuoi utenti. Tuttavia, abilitare SSL non è la fine della storia: ci sono molti passaggi che puoi intraprendere per migliorare ulteriormente la sicurezza offerta dal tuo sito, dall'impostazione dell'attributo Secure sui cookie all'attivazione di HTTP Strict Transport Security all'utilizzo dei Criteri di sicurezza del contenuto per bloccare i privilegi del tuo sito. Tuttavia, il deployment di queste potenti funzionalità a volte può essere difficile. Per aiutarti a implementare una forma più restrittiva di SSL, Chrome 46 include una funzionalità chiamata reporting HPKP.

Cosa significano tutti questi acronimi?

La sicurezza sul web oggi si basa sui certificati SSL: firme crittografiche che dimostrano che un sito web è chi è. Quando il browser invia una richiesta a un URL come https://developers.google.com, il server fornisce un certificato SSL e, se il certificato è valido, consente l'esecuzione della richiesta e mostra l'URL del sito web con un lucchetto verde nella barra degli indirizzi.

Che cos'è un certificato valido? Per essere considerato valido, un certificato deve essere firmato da un'autorità di certificazione (CA) o da un altro certificato firmato da una CA (nota come CA intermedia). Per i browser e i sistemi operativi viene fornito un elenco di diverse centinaia di CA considerate affidabili per l'emissione dei certificati. Il problema, tuttavia, è che per impostazione predefinita ciascuna di queste CA può emettere certificati per qualsiasi sito web. Se uno di questi viene compromesso o funziona in modo anomalo, questo potrebbe essere devastante per l'intero Web.

Inserisci il blocco della chiave pubblica HTTP o HPKP. Questo standard consente ai siti web di inviare un'intestazione HTTP che indica al browser di memorizzare (o "bloccare") parti della catena di certificati SSL. Il browser rifiuterà le connessioni successive che non corrispondono ai PIN ricevuti in precedenza. Ecco un esempio di intestazione HPKP:

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

Questa intestazione specifica due hash dei certificati come PIN. Uno è l'hash di un certificato nella catena di certificati del sito, l'altro un PIN di backup o un hash di un certificato che il sito può utilizzare nel caso in cui sia necessario ruotare il certificato. L'intestazione include anche un valore max-age. Una volta trascorso questo numero di secondi, il browser dimenticherà il PIN.

Per ulteriori informazioni su HPKP in generale, leggi le specifiche o l'eccellente post del blog del collega sviluppatore di Chrome Chris Palmer.

Devo attivare subito HPKP?

Non necessariamente. Quando implementi l'HPKP, è abbastanza facile commettere un errore e accidentalmente modificare la strategia di sicurezza per il tuo sito. Se blocchi il tuo sito su un insieme di certificati e poi devi implementarne uno nuovo, gli utenti che hanno visto il segnaposto non potranno accedervi fino alla scadenza del PIN (in base al valore max-age nell'intestazione).

Poiché è difficile scegliere nel modo giusto, l'HPKP è attualmente utilizzato principalmente da alcuni siti di alto profilo sensibili alla sicurezza. Se decidi di attivare l'HPKP, dovresti iniziare con un valore di età massima molto breve e aumentarlo gradualmente se non hai problemi.

Che cosa sono i report HPKP e in che modo sono utili?

I report HPKP, disponibili in Chrome 46, sono una funzionalità che puoi usare per rilevare le configurazioni errate durante l'implementazione dell'HPKP.

Innanzitutto, puoi iniziare inviando l'intestazione Public-Key-Pins-Report-Only anziché l'intestazione Public-Key-Pins:

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"

Quando il tuo sito invia questa intestazione, Chrome verifica se la connessione corrente corrisponde ai segnaposto e, in caso contrario, invia una segnalazione a report-uri. Chrome non bloccherà mai le richieste in base ai segnaposto in un'intestazione solo report, quindi questo è un modo sicuro per provare HPKP e vedere se causa problemi agli utenti senza correre il rischio di DoSing del tuo sito.

Tieni presente che un'intestazione Solo report si applica solo alla richiesta su cui viene ricevuta. Il browser non memorizza i segnaposto solo report come fanno per i segnaposto veri. In questo modo puoi testare la configurazione senza preoccuparti di memorizzare nella cache valori non validi nei browser degli utenti ed eseguire l'implementazione in modo incrementale (ad esempio, solo su una singola risorsa) per evitare di inondare il server di report.

Quando implementi l'intestazione Public-Key-Pins reale per iniziare ad applicare i segnaposto, puoi includere nell'intestazione anche un valore report-uri, in modo da continuare a ricevere report in caso di problemi.

Che cosa viene incluso in una segnalazione di violazione dell'HPKP?

Una segnalazione di violazione HPKP è un messaggio JSON inviato in una richiesta HTTP POST al tuo report-uri configurato. L'elenco dei campi è disponibile nelle spec, ma qui ne evidenzierò due: served-certificate-chain e validated-certificate-chain. served-certificate-chain è il certificato esattamente come Chrome lo ha ricevuto durante la configurazione della connessione SSL per la richiesta. validated-certificate-chain, d'altra parte, è la catena che Chrome ha ricostruito durante il tentativo di convalidare il certificato del server e che, sorprendentemente, può essere diversa dalla served-certificate-chain. Client diversi eseguono la convalida dei certificati in modi diversi e questa può essere una causa comune di errori di configurazione di HPKP. Assicurati di selezionare questo campo se ricevi report imprevisti.

Un ultimo "gotcha"

Se esegui il deployment dei report HPKP, ricorda che Chrome blocca la convalida per tutte le richieste, incluse le richieste di invio dei report. Quindi, se hai implementato HPKP per il tuo sito, probabilmente vorrai inviare i report HPKP a un dominio diverso che non hai bloccato. In caso contrario, la violazione di un PIN sul tuo sito attiverà una segnalazione per lo stesso dominio, il che non andrà a buon fine in caso di violazione del PIN, pertanto non riceverai la segnalazione.

Se non hai un altro dominio a portata di mano, puoi provare un servizio come report-uri.io, che gestisce per te le segnalazioni delle violazioni.