L'utilizzo di SSL sul tuo sito è un modo importante per preservare la sicurezza e la privacy dei tuoi utenti. Tuttavia, l'attivazione del protocollo SSL non è tutto: esistono molti passaggi che puoi seguire per migliorare ulteriormente la sicurezza del tuo sito, dall'impostazione dell'attributo Secure sui cookie all'attivazione di HTTP Strict Transport Security, dall'utilizzo di Content Security Policy al blocco dei privilegi del tuo sito. Tuttavia, l'implementazione di queste potenti funzionalità può essere complicata. Per aiutarti a implementare una forma più rigorosa di SSL, Chrome 46 è dotato di una funzionalità chiamata report HPKP.
Che cosa significano tutti questi acronimi?
Attualmente la sicurezza sul web si basa sui certificati SSL: firme crittografiche che dimostrano che un sito web è quello che dice di essere. 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, il browser consente di procedere con la 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 un'autorità di certificazione (nota come CA intermedia). I browser e i sistemi operativi vengono forniti con un elenco di diverse centinaia di CA attendibili per l'emissione di certificati. Il problema, però, è che per impostazione predefinita, qualsiasi di queste CA può emettere certificati per qualsiasi sito web. Se uno di questi elementi viene compromesso o presenta comportamenti indesiderati, le conseguenze potrebbero essere devastanti per l'intero web.
Inserisci il pinning della chiave pubblica HTTP o HPKP. Questo standard consente ai siti web di inviare un'intestazione HTTP che indica al browser di ricordare (o "bloccare") parti della catena di certificati SSL. Il browser rifiuterà quindi 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 del certificato come pin. Uno è un hash di un certificato nella catena di certificati del sito e l'altro è un PIN di backup o un hash di un certificato che il sito può utilizzare nel caso in cui debba ruotare il proprio certificato. L'intestazione include anche un valore max-age
. Dopo che questo numero di secondi è trascorso, il browser non avrà più bisogno del PIN.
Per saperne di più su HPKP in generale, consulta la specifica o l'eccellente post del blog di Chris Palmer, altro sviluppatore di Chrome.
Devo attivare subito HPKP?
Non necessariamente. Quando esegui il deployment di HPKP, è abbastanza facile commettere un errore e
effettuare un attacco DoS accidentale sul tuo sito. Se blocchi il tuo sito su un insieme di certificati e poi devi implementarne uno nuovo, gli utenti che hanno visto il blocco non potranno accedere al tuo sito fino alla scadenza del blocco (in base al valore max-age
nell'header).
Poiché è difficile da implementare correttamente, al momento HPKP è utilizzato principalmente da una manciata di siti di alto profilo e sensibili alla sicurezza. Se decidi di attivare HPKP, devi iniziare con un valore max-age molto breve e aumentarlo gradualmente se non riscontri problemi.
Che cos'è la segnalazione HPKP e a cosa serve?
I report HPKP, disponibili in Chrome 46, sono una funzionalità che puoi utilizzare per rilevare le configurazioni errate durante l'implementazione di HPKP.
Per prima cosa, 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 un'intestazione di questo tipo, Chrome verifica se la connessione corrente corrisponde ai pin e, in caso contrario, invia un report a report-uri
. Chrome non bloccherà mai le richieste in base ai pin in un'intestazione Solo report, quindi questo è un modo sicuro per provare HPKP e vedere se causa problemi agli utenti senza rischiare di sottoporre il tuo sito a un attacco DDoS.
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 per i segnaposto reali. In questo modo puoi testare la configurazione senza preoccuparti di memorizzare nella cache valori errati nei browser degli utenti e puoi 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 a applicare i tuoi pin,
puoi includere anche un valore report-uri in quell'intestazione, in modo da
continuare a ricevere report in caso di problemi.
Che cosa deve contenere un report sulla violazione HPKP?
Un report di violazione HPKP è un messaggio JSON inviato in una richiesta POST HTTP al tuo report-uri
configurato. L'elenco dei campi è disponibile nella specifica, ma ne evidenzierò due: served-certificate-chain
e validated-certificate-chain
. served-certificate-chain
è il certificato esattamente come lo ha ricevuto Chrome durante la configurazione della connessione SSL per la richiesta. validated-certificate-chain
,
invece, è la catena ricostruita da Chrome quando tenta di convalidare il certificato del server, che, sorprendentemente, può essere diverso da served-certificate-chain
. Client diversi eseguono la convalida del certificato in modi diversi e questo può essere un motivo comune di configurazioni errate di HPKP. Assicurati di controllare questo campo se ricevi report imprevisti.
Un'ultima nota
Se implementi i report HPKP, ricorda che Chrome esegue la convalida del PIN per tutte le richieste, incluse quelle di invio dei report. Pertanto, 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, una violazione dei pin sul tuo sito attiverà un report nello stesso dominio, che non registrerà la violazione dei pin e quindi non lo riceverai.
Se non hai a disposizione un altro dominio, puoi provare un servizio come report-uri.io, che gestisce le segnalazioni di violazioni per tuo conto.