Lanzamiento de la fijación de claves públicas con los informes de HPKP

Usar SSL en tu sitio es una forma importante de preservar la seguridad y la privacidad de tus usuarios. Sin embargo, habilitar SSL no es el final del proceso: hay muchos pasos que puedes seguir para mejorar aún más la seguridad que proporciona tu sitio, desde configurar el atributo seguro en las cookies hasta activar HTTP con Seguridad de Transporte Estricta hasta usar la Política de Seguridad del Contenido para bloquear los privilegios del sitio. Sin embargo, implementar estas potentes funciones a veces puede ser complicado. Para ayudarte a implementar una forma más estricta de SSL, Chrome 46 incluye una función llamada generación de informes de HPKP.

¿Qué significan todos estos acrónimos?

En la actualidad, la seguridad en la Web depende de certificados SSL: firmas criptográficas que demuestran que un sitio web es quien dice quién es. Cuando tu navegador envía una solicitud a una URL como https://developers.google.com, el servidor proporciona un certificado SSL y, si el certificado es válido, el navegador permite que continúe la solicitud y muestra la URL del sitio web con un candado verde en la barra de direcciones.

Pero ¿qué es un certificado válido? Para considerarse válido, un certificado debe estar firmado por una autoridad certificadora (CA) o por otro certificado firmado por una CA (conocida como CA intermedia). Los navegadores y sistemas operativos incluyen una lista de cientos de CA en confianza para emitir certificados. El problema, sin embargo, es que, de forma predeterminada, cualquiera de estas CA puede emitir certificados para cualquier sitio web. Si alguno de ellos se ve comprometido o se comporta de manera incorrecta, podría ser devastador para toda la Web.

Ingresa la fijación de clave pública HTTP o HPKP. Este estándar permite que los sitios web envíen un encabezado HTTP para indicarle al navegador que recuerde (o "fije") partes de su cadena de certificados SSL. A continuación, el navegador rechazará las conexiones posteriores que no coincidan con las fijaciones que recibió anteriormente. Este es un ejemplo de un encabezado HPKP:

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

Este encabezado especifica dos hash de certificado como fijaciones. Uno es un hash de un certificado en la cadena de certificados del sitio y el otro es un PIN de copia de seguridad o un hash de un certificado que el sitio puede usar en caso de que necesite rotar su certificado. El encabezado también incluye un valor max-age. Una vez transcurrido ese tiempo, el navegador olvidará el pin.

Para obtener más información sobre HPKP en general, consulta las especificaciones o consulta la excelente entrada de blog de Chris Palmer, otro desarrollador de Chrome.

¿Quieres que active el HPKP ahora mismo?

No necesariamente. Cuando implementas HPKP, es bastante fácil cometer un error y lanzar un ataque de DoS a tu sitio por accidente. Si fijas tu sitio en un conjunto de certificados y luego tienes que implementar uno nuevo, los usuarios que hayan visto el pin no podrán acceder a él hasta que venza el PIN (según el valor max-age del encabezado).

Debido a que es difícil entender bien, en la actualidad, HPKP es utilizado principalmente por unos pocos sitios de alto perfil y sensibles a la seguridad. Si decides activar el HPKP, debes comenzar con un valor de max-age muy corto y aumentarlo gradualmente si no tienes ningún problema.

¿Qué es el informe de HPKP y cómo ayuda?

Los informes de HPKP, que se envían en Chrome 46, son una función que puedes usar para detectar parámetros de configuración incorrectos cuando implementas HPKP.

Primero, puedes comenzar por enviar el encabezado Public-Key-Pins-Report-Only en lugar del encabezado 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"

Cuando tu sitio envíe este encabezado, Chrome verificará si la conexión actual coincide con los pines y, de lo contrario, enviará un informe a report-uri. Chrome nunca bloqueará las solicitudes basadas en los marcadores de un encabezado de solo informes, por lo que esta es una forma segura de probar HPKP y ver si causa problemas a los usuarios sin correr el riesgo de sufrir un ataque de DoS en tu sitio.

Ten en cuenta que un encabezado de solo informe solo se aplica a la solicitud por la cual se recibe. El navegador no recuerda los pines del tipo "Solo informes" como lo hace con los marcadores reales. Esto te permite probar la configuración sin preocuparte por almacenar en caché los valores incorrectos en los navegadores de los usuarios, y puedes realizar el lanzamiento de forma incremental (por ejemplo, solo en un solo recurso) para evitar saturar tu servidor con informes.

Cuando lances el encabezado Public-Key-Pins real para comenzar a aplicar las fijaciones, también puedes incluir un valor report-uri en ese encabezado, de modo que continúes recibiendo informes si se produce algún problema.

¿Qué incluye un informe de infracción de HPKP?

Un informe de incumplimiento de HPKP es un mensaje JSON que se envía en una solicitud HTTP POST al report-uri configurado. La lista de campos se puede encontrar en spec, pero destacaré dos de ellos aquí: served-certificate-chain y validated-certificate-chain. El served-certificate-chain es el certificado exactamente como lo recibió Chrome cuando configuró la conexión SSL para la solicitud. Por otro lado, validated-certificate-chain es la cadena que Chrome volvió a compilar cuando intentó validar el certificado del servidor, que, sorprendentemente, puede ser diferente a served-certificate-chain. Los diferentes clientes validan certificados de diferentes maneras, y esto puede ser una causa común de parámetros de configuración incorrectos de HPKP. Asegúrate de marcar este campo si recibes informes inesperados.

Un último "gotcha"

Si implementas informes de HPKP, recuerda que Chrome valida todas las solicitudes, incluidas las que envían informes. Por lo tanto, si implementaste HPKP para tu sitio, es probable que quieras enviar informes de HPKP a un dominio diferente que no hayas fijado. De lo contrario, el incumplimiento de un PIN en tu sitio activará un informe en el mismo dominio, lo cual también generará un error en el incumplimiento y, por lo tanto, no recibirás el informe.

Si no tienes otro dominio a mano, puedes probar con un servicio como report-uri.io, que administra los informes de incumplimiento por ti.