Usar o SSL no seu site é uma maneira importante de preservar a segurança e a privacidade dos seus usuários. Mas ativar o SSL não é o fim da história: há muitas etapas que você pode seguir para melhorar ainda mais a segurança oferecida pelo site, desde a configuração do atributo Secure nos cookies até a ativação da segurança de transporte estrito do HTTP e o uso da política de segurança de conteúdo para bloquear os privilégios do site. No entanto, o implantação desses recursos poderosos pode ser complicada. Para ajudar você a lançar uma forma mais rígida de SSL, o Chrome 46 vem com um recurso chamado Relatórios do HPKP.
O que significam todos esses acrônimos?
Hoje, a segurança na Web depende de certificados SSL: assinaturas criptográficas que comprovam que um site é quem diz ser. Quando seu navegador envia uma solicitação para um URL, como https://developers.google.com, o servidor fornece um certificado SSL. Se o certificado for válido, o navegador permitirá que a solicitação prossiga e mostrará o URL do site com um cadeado verde na barra de endereço.
Mas o que é um certificado válido? Para ser considerado válido, um certificado precisa ser assinado por uma autoridade certificadora (AC) ou por outro certificado que foi assinado por uma AC (conhecida como AC intermediária). Os navegadores e sistemas operacionais são enviados com uma lista de várias centenas de ACs confiáveis para emitir certificados. O problema é que, por padrão, qualquer uma dessas ACs pode emitir certificados para qualquer site. Se um deles for comprometido ou apresentar comportamento inadequado, isso poderá ser devastador para toda a Web.
Digite "HTTP Public Key Pinning" ou "HPKP". Esse padrão permite que os sites enviem um cabeçalho HTTP instruindo o navegador a lembrar (ou "fixar") partes da cadeia de certificados SSL. O navegador vai recusar conexões subsequentes que não correspondam aos pinos recebidos anteriormente. Confira um exemplo de cabeçalho HPKP:
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
Esse cabeçalho especifica dois hashes de certificado como pinos. Um é um hash de um
certificado na cadeia de certificados do site, e o outro é um PIN de backup ou um
hash de um certificado que o site pode usar caso precise fazer a rotação
do certificado. O cabeçalho também inclui um valor max-age
. Depois que esse número de
segundos passar, o navegador vai esquecer o pino.
Para mais informações sobre o HPKP em geral, consulte a especificação ou a excelente postagem do blog do desenvolvedor do Chrome Chris Palmer.
Devo ativar o HPKP agora?
Não necessariamente. Ao implantar o HPKP, é muito fácil cometer um erro e
fazer um ataque DoS no seu site por acidente. Se você fixar seu site em um conjunto de certificados e precisar implantar um novo, os usuários que tiverem visto o pin não poderão acessar seu site até que ele expire (com base no valor max-age
no cabeçalho).
Como é difícil fazer isso corretamente, o HPKP é usado principalmente por alguns sites de alto perfil e sensíveis à segurança. Se você decidir ativar o HPKP, comece com um valor de idade máxima muito curto e aumente gradualmente se não houver problemas.
O que é o relatório do HPKP e como ele ajuda?
O relatório do HPKP, enviado no Chrome 46, é um recurso que pode ser usado para detectar configurações incorretas durante o lançamento do HPKP.
Primeiro, envie o cabeçalho Public-Key-Pins-Report-Only
em vez
do cabeçalho 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 o site envia esse cabeçalho, o Chrome verifica se a conexão atual
corresponde aos pinos e envia um relatório para o report-uri
, caso contrário. O Chrome nunca vai
bloquear solicitações com base nos pinos em um cabeçalho somente para relatórios. Essa é uma maneira segura
de testar o HPKP e verificar se ele causa problemas para os usuários sem correr o
risco de DoS no seu site.
Um cabeçalho "Report-Only" se aplica apenas à solicitação em que ele é recebido. O navegador não lembra os pinos somente para relatórios, como faz com os pinos reais. Isso permite testar a configuração sem se preocupar com o armazenamento em cache de valores incorretos nos navegadores dos usuários. Além disso, você pode fazer o lançamento de forma incremental (por exemplo, em apenas um recurso) para evitar o envio de relatórios ao servidor.
Quando você lançar o cabeçalho Public-Key-Pins
real para começar a aplicar seus pinos,
também poderá incluir um valor report-uri nesse cabeçalho para continuar recebendo relatórios caso ocorra algum problema.
O que é incluído em um relatório de violação do HPKP?
Um relatório de violação do HPKP é uma mensagem JSON enviada em uma solicitação HTTP POST para o
report-uri
configurado. A lista de campos pode ser encontrada na
especificação, mas vou destacar dois deles
aqui: served-certificate-chain
e validated-certificate-chain
. O
served-certificate-chain
é o certificado exatamente como o Chrome o recebeu ao
configurar a conexão SSL para a solicitação. O validated-certificate-chain
,
por outro lado, é a cadeia que o Chrome recriou ao tentar validar o
certificado do servidor, que, surpreendentemente, pode ser diferente do
served-certificate-chain
. Clientes diferentes executam a validação de certificado de
maneiras diferentes, e isso pode ser uma causa comum de configurações incorretas do HPKP. Verifique
este campo se você estiver recebendo relatórios inesperados.
Uma última dica
Se você estiver implantando relatórios do HPKP, lembre-se de que o Chrome faz a validação de pino para todas as solicitações, incluindo solicitações de envio de relatórios. Portanto, se você tiver implantado o HPKP para seu site, provavelmente vai querer enviar relatórios do HPKP para um domínio diferente que não tenha sido fixado. Caso contrário, uma violação de pino no seu site vai acionar um relatório para o mesmo domínio, que também vai falhar na violação de pino, e você não vai receber o relatório.
Se você não tiver outro domínio disponível, tente um serviço como o report-uri.io, que processa relatórios de violação para você.