[PyVigo] Reactivación de HPKP en python-vigo.es
Luis González Fernández
luisgf at luisgf.es
Thu Feb 18 14:35:40 CET 2016
Hola a todos:
Con la migración de los certificados que opero hacia let's encrypt han aparecido una serie de inconvenientes que degradan la configuración SSL y por consiguiente la seguridad de la transmisión.
Todos mis sistemas emitian las cabeceras necesarias para soportar HSTS (HTTP Strict Transport Security) y HPKP (Public Key Pinning Extension for HTTP).
Para los neófitos la siguiente explicación rápida:
HSTS: Es un mecanismo por el cual el servidor web le indica a un navegador que las peticiones que realicen a un determinado sitio, deben ir siempre a través de HTTPS.
HPKP: Es un mecanismo que informa al navegador de los certificados autorizados que puede ver a la hora de conectarse a un sitio. Si vé otros certificados, podriamos ser victimas de un ataque tipo Man-in-the-middle, asi que impedirá tal conexion.
Con los certificados tradicionales, esto no suponia demasiado problema ya que su duración es elevada (1 o 2 años), lo cual me permitia generar pins con una duración un poco inferior a la caducidad de los certificados y darme un margn de maniobra amplio para renovarlos y generar los nuevos pins.
El problema surje con let's encrypt (servicio fantástico!!!) ya que la duración de sus certificados actualmente es de 3 meses y en un futuro podría incluso reducirse.
Asi pues, para lidiar con la problematica he desarrollado un pequeño programa en Perl, (vaaaale es broma), en Python 3.5 que genera los pins HPKP de forma automática. El siguiente programa se ejecutará justo despues de la renovación del certificado y generará un PIN con una duración no superior a la del certificado con respecto a la fecha actual. Esto impedirá crear un pin que tenga validez una vez el certificado haya expirado.
La idea detrás de esto es que este programa se ejecute como hook o plugin del cliente let's encrypt, no obstante y mientras esté en periodo de pruebas, vivirá como un programa independiente.
Configuración de Apache:
<IfModule mpm_itk_module>
AssignUserID pyvigo pyvigo
</IfModule>
<IfModule mod_ssl.c>
SSLUseStapling on
SSLStaplingCache shmcb:/tmp/ocsp_stapling(512000)
<VirtualHost *:443>
ServerName www.python-vigo.es
ServerAlias python-vigo.es
DocumentRoot /datos/webs/python-vigo
ErrorLog ${APACHE_LOG_DIR}/www.python-vigo.es_error.log
CustomLog ${APACHE_LOG_DIR}/www.python-vigo.es_access.log combined
# Configuracion SSL
SSLEngine on
SSLCompression Off
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite EECDH+AES:ECDHE+ECDSA:ECDHE+RSA:ECDHE+AES:DHE+RSA:ECDH+AES:DHE+AES:EDH+AES:-SHA1:DHE+AES:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5
SSLCertificateFile /etc/letsencrypt/live/luisgf.es-0001/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/luisgf.es-0001/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/luisgf.es-0001/chain.pem
# Activamos HSTS
Header always set Strict-Transport-Security "max-age=16070400; includeSubDomains"
# Activamos HPKP leyendo la directiva generada por hpkp-python
Include /etc/apache2/conf-available/hpkp-pin_python-vigo.es.conf
# http://stackoverflow.com/questions/17092154/x-frame-options-on-apache
Header set X-Frame-Options SAMEORIGIN
# http://stackoverflow.com/questions/9090577/what-is-the-http-header-x-xss-protection
Header set X-XSS-Protection "1; mode=block"
</VirtualHost>
</IfModule>
Genero el pin con:
./hpkp.py -f /etc/letsencrypt/live/www.python-vigo.es/cert.pem -u http://www.luisgf.es/hpkp_report -d > /etc/apache2/conf-available/hpkp-pin_python-vigo.es.conf
Ya sólo queda reiniciar el apache para que tenga en cuenta los cambios.
Más información:
HPKP-Python: https://github.com/luisgf/hpkp-python
HSTS: http://tools.ietf.org/html/rfc6797
HPKP: https://tools.ietf.org/html/rfc7469
Un Saludo,
--
Luis González Fernández
https://www.luisgf.es
PGP ID: C918B80F (DD6F BFC1 FC14 4C81 34F8 EA1E 6BCB C27F C918 B80F)
Twitter: @luisgf_2001 / Jabber: luisgf at mijabber.es
More information about the Vigo
mailing list