Cómo habilitar HTTPS para Varnish Cache usando Hitch en CentOS-RHEL 8


Varnish Cache carece de soporte nativo para SSL/TLS y otros protocolos asociados con el puerto 443. Si está utilizando Varnish Cache para mejorar el rendimiento de su aplicación web, debe instalar y configurar otra pieza de software llamada proxy de terminación SSL/TLS, para que funcione junto con Varnish Cache para habilitar HTTPS.

The Hitch es un proxy SSL/TLS escalable, gratuito y de código abierto, basado en libev, diseñado para Varnish Cache, que actualmente funciona en Linux, OpenBSD, FreeBSD y MacOSX. Termina las conexiones TLS/SSL escuchando en el puerto 443 (el puerto predeterminado para las conexiones HTTPS) y reenvía el tráfico no cifrado a Varnish Cache, sin embargo, también debería funcionar con otros backends.

Es compatible con TLS1.2 y TLS1.3 y TLS 1.0/1.1 heredado, admite ALPN (negociación de protocolo de capa de aplicación) y NPN (negociación de protocolo siguiente) para HTTP/2, un protocolo PROXY para señalar la IP/puerto del cliente a un backend , Conexiones de socket de dominio UNIX al origen, SNI (Indicación de nombre de servidor), con y sin certificados comodín. Además, funciona bien para grandes instalaciones que requieren hasta 15.000 tomas de escucha y 500.000 certificados.

Como continuación de nuestros dos artículos anteriores sobre la instalación de Varnish Cache para servidores HTTP Nginx y Apache, esta guía muestra cómo habilitar HTTPS para Varnish Cache usando Hitch TLS Proxy en CentOS/RHEL 8.

Esta guía asume que ha instalado Varnish para Nginx o el servidor web Apache; de lo contrario, consulte:

  • Cómo instalar Varnish Cache 6 para el servidor web Nginx en CentOS/RHEL 8
  • Cómo instalar Varnish Cache 6 para el servidor web Apache en CentOS/RHEL 8

Paso 1: Instale Hitch en CentOS/RHEL 8

1. El paquete Hitch se proporciona en el repositorio EPEL (Paquetes adicionales para Enterprise Linux). Para instalarlo, primero habilite EPEL en su sistema y luego instale el paquete. Si no tiene el paquete OpenSSL instalado, instálelo también.

# dnf install epel-release
# dnf install hitch openssl

2. Cuando se complete la instalación del paquete, deberá configurar Varnish Cache para que funcione con Hitch. También debe configurar Hitch para usar sus certificados SSL/TLS y Varnish como backend. El archivo de configuración principal de Hitch se encuentra en /etc/hitch/hitch.conf, que se explica a continuación.

Paso 2: Configurar Varnish Cache para Hitch

3. A continuación, habilite Varnish para escuchar un puerto adicional (8443 en nuestro caso) utilizando el soporte del protocolo PROXY, para las comunicaciones con Hitch.

Así que abra el archivo de servicio systemd de Varnish para editarlo.

# systemctl edit --full varnish

Busque la línea ExecStart y agregue un indicador -a adicional con el valor 127.0.0.1:8443,proxy. Usar un valor de 127.0.0.1:8443 significa que Varnish solo aceptará la conexión interna (de procesos que se ejecutan en el mismo servidor, es decir, enganche en este caso) pero no conexiones externas.

ExecStart=/usr/sbin/varnishd -a :80 -a 127.0.0.1:8443,proxy -f /etc/varnish/default.vcl -s malloc,256m 

Guarde el archivo y luego reinicie el servicio Varnish para aplicar los últimos cambios.

# systemctl restart varnish

Paso 3: obtención de certificados SSL/TLS

4. En esta sección, explicaremos cómo crear el paquete de certificados SSL/TLS que se utilizará en Hitch. Para esta guía, explicaremos las diferentes opciones de cómo utilizar un certificado autofirmado, un certificado comercial o uno de Let's Encrypt.

Para crear un certificado autofirmado (que solo debe usar en un entorno de prueba local), puede usar la herramienta OpenSSL.

# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout  tecmint.lan.key -out tecmint.lan.crt

Luego, cree un paquete del certificado y la clave de la siguiente manera.

# cat tecmint.crt tecmint.key >tecmint.pem

Nota: Para uso en producción, puede comprar un certificado de una autoridad certificadora (CA) comercial o obtener un certificado gratuito, automatizado y totalmente reconocido de Let's Encrypt. Luego crea un paquete PEM.

Si compró un certificado de una CA comercial, debe combinar la clave privada, el certificado y el paquete de CA como se muestra.

# cat example.com.key example.com.crt example.com-ca-bundle.crt > /etc/ssl/example.com.pem 

Para Let's Encrypt, el certificado, la clave privada y la cadena completa se almacenarán en /etc/letsencrypt/live/example.com/, así que cree el paquete como se muestra.

# cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem >/etc/letsencrypt/live/example.com/example.com_bundle.pem

Paso 4: configurar e iniciar el enganche

5. A continuación, configure Varnish como backend para Hitch y especifique los archivos de certificado SSL/TLS que se usarán para HTTPS, en el archivo de configuración principal de Hitch, ábralo para editarlo.

# vi /etc/hitch/hitch.conf

La sección de interfaz define las direcciones IP y el puerto que escuchará Hitch. La configuración predeterminada es escuchar en todas las interfaces IPv4 e IPv6 conectadas al servidor y se ejecuta en el puerto 443 y manejar las solicitudes HTTPS entrantes, entregándolas a Varnish.

Cambie el puerto proxy de backend predeterminado de 6086 a 8443 (el puerto utilizado para reenviar solicitudes a Varnish) en el archivo de configuración de Hitch, usando el parámetro de backend. Además, especifique el archivo de certificado utilizando el parámetro pem-file como se muestra.

backend = "[127.0.0.1]:8443"
#pem-dir = "/etc/pki/tls/private"
pem-file = "/etc/ssl/tecmint.lan/tecmint.pem"

Guarde el archivo y ciérrelo.

6. Ahora inicie el servicio de enganche y habilítelo para que se inicie automáticamente al arrancar el sistema. Tenga en cuenta que el modificador --now cuando se usa con enable, también inicia un servicio systemd y luego verifica el estado para ver si está en funcionamiento de la siguiente manera.

# systemctl enable --now hitch
# systemctl status hitch

7. Antes de proceder a probar si su sitio web/aplicación ahora se está ejecutando en HTTPS, debe permitir que el puerto 443 del servicio HTTPS en el firewall permita que las solicitudes destinadas a ese puerto en el servidor pasen a través del firewall.

# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

Paso 5: Probar la terminación SSL/TLS con la configuración de Varnish Cache-Hitch

8. Ahora es el momento de probar la configuración de Varnish Cache-Hitch. Abra un navegador web y use la IP de su dominio o servidor para navegar a través de HTTPS.

https://www.example.com
OR
https://SERVER_IP/

Una vez que se haya cargado la página de índice de su aplicación web, verifique los encabezados HTTP para confirmar que el contenido se está sirviendo a través de Varnish Cache.

Para hacer eso, haga clic derecho en la página web cargada, seleccione Inspeccionar de la lista de opciones para abrir las herramientas de desarrollador. Luego haga clic en la pestaña Red y vuelva a cargar la página, luego seleccione una solicitud para ver los encabezados HTTP, como se resalta en la siguiente captura de pantalla.

Paso 6: Redirigir HTTP a HTTPS en Varnish Cache

9. Para ejecutar su sitio web solo en HTTPS, debe redirigir todo el tráfico HTTP a HTTPS. Puede hacer esto agregando la siguiente configuración en su archivo de configuración de Hitch.

# vi /etc/hitch/hitch.conf 

Primero, agregue la línea import std; justo debajo de vlc 4.0;, luego busque la subrutina vlc_recv, que es la primera subrutina VCL ejecutada inmediatamente después de que Varnish Cache haya analizado la solicitud del cliente en su estructura de datos básica. Es donde podemos modificar los encabezados de las solicitudes y ejecutar un sintetizador para redirigir las solicitudes de los clientes.

Modifíquelo para que se vea así.

sub vcl_recv {
    if (std.port(server.ip) != 443) {
        set req.http.location = "https://" + req.http.host + req.url;
        return(synth(301));
    }
}

Tenga en cuenta que el protocolo PROXY permite a Varnish ver el puerto de escucha 443 de Hitch desde la variable server.ip. Entonces, la línea std.port (server.ip) devuelve el número de puerto en el que se recibió la conexión del cliente.

Si el puerto no es 443 para HTTPS (como lo verifica (std.port (server.ip)! u003d 443)), la subrutina establecerá el encabezado de la ubicación HTTP de la solicitud (establecer req.http.location) en una solicitud segura (" https:/”+ req.http.host + req.url) simplemente pidiendo al navegador web que cargue una versión HTTPS de la página web (es decir, redirección de URL).

El encabezado de ubicación se enviará a la subrutina vcl_synth (que se llama usando return (synth (301))) con un código de estado HTTP de 301 (movido permanentemente).

10. A continuación, agregue la siguiente subrutina vcl_synth (uno de sus muchos casos de uso es la redirección de usuarios), para procesar el sintetizador anterior.

sub vcl_synth {
        if (resp.status == 301) {
                set resp.http.location = req.http.location;
		  set resp.status = 301;
                return (deliver);
        }
}

Comprueba si el estado de la respuesta es 301, el encabezado de ubicación HTTP en la respuesta se establece en el encabezado de ubicación HTTP en la solicitud, que de hecho es una redirección a HTTPS y ejecuta una acción de entrega.

La acción de entrega genera una respuesta con la respuesta del backend, almacena la respuesta en la caché y la envía al cliente.

Guarde el archivo y ciérrelo.

11. Una vez más, aplique los nuevos cambios en la configuración de Varnish reiniciando el servicio. Luego, use la herramienta de línea de comandos curl para confirmar la redirección de HTTP a HTTPS.

# systemctl restart varnish
# curl -I http://eaxmple.com/

Desde el navegador, la respuesta también es la misma que se muestra en la siguiente captura de pantalla.

Esperamos que todo haya funcionado bien hasta este momento. De lo contrario, envíe un comentario o una pregunta a través del formulario de comentarios a continuación. Para conocer las opciones de configuración avanzadas, consulte la documentación de Hitch.