HTTPS

Obteniendo matrícula de honor en SSLLabs al usar HTTPS

Hola chicos y chicas. Vamos a por el primer post serio, quitando el de presentación, del blog. Como ahora ando configurando el servidor donde alojo el blog, una de las primeras cosas importantes que he pensado es que todo el tráfico vaya por HTTPS. De esta forma todo el tráfico de los que vayais a leer este blog vaya cifrado. Mi principal intención es alcanzar la máxima clasificación (nivel A+) del test en SSLabs.

SSL Labs consiste en una colección de documentos y  herramientas que nos permiten entender mejor todo lo relativo a SSL. Así como poder comprobar la configuración y su nivel de seguridad.

Una de las herramientas disponibles es realizar un test de configuración, en la que se realizan diversas pruebas y devuelve información sobre la configuración y posible vulnerabilidad ante ciertos ataques conocidos.

SSL Report
Al final sacamos matricula de honor

A lo largo de esta entrada, vamos a ir viendo cómo configurar un servidor Apache para soportar HTTPS y conseguir la matrícula de honor em los test de SSLlabs.

Los pasos que vamos a realizar son los siguientes:

  • Obtener un certificado gratuito e instalarlo en apache
  • Activar y configurar HTTPS en apache
  • Realizar los últimos retoques para obtener la mejor puntuación.

 

 

Activar y configurar HTTPS en Apache

Para activar https en nuestro servidor apache es necesario realizar dos pasos: activar el módulo ssl y configurar el VirtualHost correspondiente.

Lo primero será comprobar si tenemos el módulo ssl activo, para ello podemos utilizar el comando:

$ sudo apache2ctl -M
...
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
...

Ahí lo tenemos. En caso de no aparecer, habrá que activar el módulo con el comando a2enmod:

$ sudo a2enmod ssl

Una vez activa activado el módulo, ya podemos configurar un VirtualHost para que escuche en el puerto 443 (el dedicado a https) con los parámetros necesarios.

<IfModuCle mod_ssl.c>
    <VirtualHost *:443>
 
 
 
        ServerName mamaquieroserhacker.es
        ServerAlias www.mamaquieroserhacker.es
 
...
 
        SSLEngine on
        SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    	SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
 
        SSLHonorCipherOrder     on
        SSLCompression          off
 
        SSLOptions +StrictRequire
 
 
    </VirtualHost>
</IfModule>

 

Vamos a pasar a explicar un poco los parámetros puestos arriba:

  • VirtualHost *:443 : Creamos el VirtualHost para que responda a las peticiones que vengan por el puerto 443.
  • ServerName y ServerAlias: El host de la petición debe ser uno de los indicados en estos parámetros. Estos vienen bien sobre todo si nuestro apache va a servir a diferentes dominios.
  • SSLEngine on : Aquí es donde decimos que va a ser tráfico seguro y cifrado. Punto base para indicar que va  a ser Https.
  • SSLProtocol : Indicamos los protocolos de cifrado que vamos a utilizar. Por convenio, se suele poner que permitimos todos y eliminamos explicitamente aquellos que no queremos utilizar. Como SSlv2, SSLv3 y las dos primeras versiones de TLS.
  • SSLCipherSuite: Con este parámetro decimos que algoritmos de cifrado vamos a utilizar. Así como aquellos que queremos evitar por ser cifrados débiles.
  • SSLHonorCipherOrder:  Activando esta opción, el orden en el que se hayan puesto los cifrados con el parámetro anterior se respetará en el momento de la negociación con el cliente.
  • SSLCompression: Desactivamos la compresión SSL para evitar el uso del ataque CRIME.

Obtener un certificado gratuito e instalarlo en apache

Para que las conexiones cliente-servidor vayan cifradas, es necesario tener un certificado a nivel servidor que asegure que el servidor es quién dice ser. Complicando las cosas a posibles ataques Man-in-the-middle. También se encargan del cifrado de los datos que se envían. Para obtener un certificado, se puede acudir a diferentes autoridades certificadoras, aunque normalmente tienen un costo.  No obstante, tenemos otras opciones, cómo Let’s Encrypt que nos permiten obtener certificados gratuitos. Estos certificados nos pueden venir bien para blogs o proyectos personales (como este blog). No obstante, tienen un tiempo de vida muy corto, habiendolo que renovar cada 4 meses.

Cómo se puede ver, la fecha de caducidad del certificado de este sitio no es muy longeva.

Para crear e instalar el certificado se puede hacer de manera automática utilizando certbot. Facilitandonos así la administración y renovación del certificado.

En mi caso, para Apache y utlizando una Ubuntu 17.04 los pasos son los siguientes:

$ sudo aptitude install software-properties-common
$ sudo apt-get repository ppa:certbot/certbot
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-apache

Con estos pasos, hemos instalado el paquete software-properties-common. Añadido el repositorio para descargar certbot e instalar este último.

Ya sólo nos queda crear el certificado ejecutando el siguiente comando:

$ sudo certbot --apache certonly

Un asistente nos consultará que nombre queremos activar para el certificado. Para ello lo obtendrá de la configuración de Apache que hemos hecho en el paso anterior. Una vez seleccionado, nos creará en /etc/letsencrypt/live/tudominio.es/ el certificado, su clave privada y la cadena de certificación.

Últimos retoques

Ya tenemos la configuración básica de SSL y el certificado. Ya sólo nos queda una última cosa, añadir el certificado a apache (con certbot usamos la opción de crearlo) y activar HSTS para conseguir una conexión más segura. Vamos a ello.

Simplemente tenemos que añadir en la configuración de nuestro VirtualHost las siguientes líneas:

SSLCertificateFile      /etc/letsencrypt/live/tudominio.es/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tudominio.es/privkey.pem
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

Con SSLCertificateFile  le estamos indicando la ruta al fichero del certificado. El fichero fullchain.pem incluye todos los certificados de la cadena de certificación para enviarlos al cliente y asegurar la fiabilidad de este. Con SSLCertificateKeyFile le indicamos la ruta al fichero privkey.pem que contiene la clave prívada. Sobra decir la importancia de proteger con los permisos adecuados esta información.

Por último, con la directiva Header, estamos activando el protocolo HSTS que ayudará a evitar suplantaciones de identidad si al cliente le hacen un MiTM. Para que funcione esta directiva, es necesario tener activado el módulo headers de Apache. Recordemos que para activarlo se hace de la siguiente manera:

$ sudo a2enmod headers

Resumen

Con todo esto, tras reiniciar nuestro Apache, ya podemos pasar el test de SSLLabs y obtener nuestra matrícula de honor. Al menos a día de hoy, mañana seguramente surjan nuevos problemas de seguridad y tendramos que crear nuevas configuraciones.

Cómo resumen final, hemos hecho lo siguiente para asegurar un poco las comunicaciones HTTP. Activar el protocolo HTTPS desactivando los protocolos inseguros. Indicar el uso de cifrados fuertes. Utilizar un certificado que asegure la autenticidad de nuestro sitio. Y activado HSTS para obligar a los navegadores clientes que siempre utilicen HTTPS para comunicarse  con nuestro sitio, aunque la primera comunicación haya sido mediante HTTP plano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *