HAProxy

Instalamos HaProxy en su versión 2 que se encuentra en los repositorios

apt install haproxy

Ahora vamos a preparar las diferentes partes de la configuración de HAProxy para lo siguiente:

  • Todas las peticiones que tienen certificado se re direcciones automáticamente al puerto 443

  • Se añadirá HSTS a todas las peticiones con certificado

  • Se reenviara la petición a nuestra granja de WAF

  • Si a petición es correcta se devolverá al HaProxy para que lo envié a los nodos

La configuración de HAProxy se encuentra en

vim /etc/haproxy/haproxy.cfg

Ahora vamos a ir viendo las diferentes secciones

Las dos primeras son la global donde configuramos el usuarios, la jaula... y la de por defecto para configurar el modo, los tiempos de conexión y los errores.

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

La siguiente sección se encarga de escuchar las peticiones que vienen del exterior y configurar el SLL, redireccionar a SSL y mandar al WAF o a los nodos directamente

Con la configuración actual de SSL conseguimos un A en SSLLabs.

SSL Labs

Configuramos las peticiones a la granja de WAF, se manda una petición a waf_health_check a los diferentes nodos para ver si esta disponible esperando un 403 que luego configuraremos en el WAF y a continuación se envia al WAF.

El balance especifica la estrategia de equilibrio de carga. En este caso usamos Round-robin dado que vamos a provechar los pesos, dado que un WAF se encuentra en el mismo CPD que el HAProxy y el otro esta en otro CPD de esta manera reducimos los tiempos de latencia y priorizamos el que tenemos cerca.

En esta sección lo que hacemos es recibir la petición de vuelta del WAF para mandarlos para los nodos, si solo usáramos una HAProxy podríamos decirle la ip interna que tiene que escuchar en el bind pero si usamos 2 y tenemos una ip flotante interna para que la granja de WAF siempre vuelva a la misma ip tenemos que dejarle el *, esto supone un fallo de seguridad porque podrían entrar por el puerto 82 saltando el WAF, pero lo solucionaremos mediante Iptables mas adelante.

La ultima sección lo que nos servirá es para enviar ya a los nodos volveremos a usar el tipo de conexión Round-robin con los pesos por el mismo motivo que antes dado que tenemos algunos en el mismo CPD y otros en otro.

Con esto tendríamos una configuración minima para poder usar nuestro tipo de infraestructura, podríamos añadir mas cosas al HAProxy como mitigación de DDoS, evitar que los ficheros estaticos como las imagenes tengan que pasar por el waf para liberarlos de carga...

Keepalived

Instalamos keepalived y psmisc

Las configraciones entre los dos nodos son muy parecidas solo teniendo que cambiar la prioridad y el estado.

Nodo MASTER

Creamos la configuración en el siguiente fichero

Nodo Backup

Creamos la configuración en el siguiente fichero

certbot

Vamos a utilizar certbot para que todos los dominios de nuestros cluster tengan por lo menos un certificado ssl gratuito, en este caso tenemos los dominios en OVH (Si el dominio esta en otro proveedor tendriamos que mirar como sacar el certificado para dicho proveedor) por lo primero que tenemos que hacer es generar una api token y los permisos necesarios, para no tener que reconfigurar el HAProxy para que funcione dado que este camino es mas fácil y cómodo.

Para crear los tokens vamos al siguiente enlace:

API OVH

Podemos dar permisos globales para funcionar:

  • GET /domain/zone/*

  • PUT /domain/zone/*

  • POST /domain/zone/*

  • DELETE /domain/zone/*

pero seria bastante inseguro por lo que podemos dar solo los permisos necesarios

  • GET /domain/zone/

  • GET /domain/zone/{domain.ext}/status

  • GET /domain/zone/{domain.ext}/record

  • GET /domain/zone/{domain.ext}/record/*

  • POST /domain/zone/{domain.ext}/record

  • POST /domain/zone/{domain.ext}/refresh

  • DELETE /domain/zone/{domain.ext}/record/*

Reemplace {domain.ext} con su nombre de dominio. Tenga en cuenta que este es siempre el nombre de dominio raíz sin un subdominio.

Después de la validación, deberá crearse un archivo de configuración para que Certbot pueda acceder a los identificadores de API. Puedes guardar este archivo donde quieras y nombrarlo como quieras. Por mi parte /root/certs/.ovhapi con el siguiente contenido.

Obviamente, los reemplaza xxx con la información obtenida durante la creación del token. Finalmente, asegúrese de configurar permisos para este archivo con 600, de lo contrario Certbot generara advertencias. chmod 600 /root/certs/.ovhapi

Instalamos cerbot en el HA1

Generando certificados

Una vez que tenemos todo listo, podemos generar nuestros certificados, solo los dominios administrados en su cuenta OVH pueden funcionar.

Vamos a crear el siguiente script en la carpeta root/certs para poder tener los certificados de todos nuestros dominios y sincronizados con los dos HaProxys

con el siguiente contenido, el cual comprobara la lista de dominios que tenemos en el ficheros domains_ssl.txt y si no esta creado el certificado lo solicitara, acordarse de cambiar el email.

Tendremos un segundo script que se lanzara cuando se acabe de solicitar el dominio para para preprar los certificados para HA y crear la lista de certificados que necesitamos

Esto mismo se podría gestionar desde una base de datos y crear una interfaz web para no tener que entrar por consola si fuera necesario.

Última actualización