es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring Boot detrás de un proxy inverso ignorando las cabeceras X-Forwarded.

Recientemente migramos nuestros servicios de Spring Boot (2.2 y 2.4) a un nuevo clúster de Kubernetes (EKS).
Tenemos Traefik ejecutándose como proxy inverso con un balanceador de carga público adjunto.

Desde nuestra migración, los servicios de Spring ya no aceptan los encabezados X-Forwarded. Verificamos tres veces los encabezados que son recibidos por esos servicios provenientes del proxy inverso, pero spring parece ignorarlos y marcar el HTTPServletRequest como inseguro, lo que básicamente rompe nuestro sistema.

Los siguientes encabezados son enviados por el proxy (eliminando los encabezados User Agent y Sec-Fetch) y recibidos por nuestros servicios de Spring.

Encabezado: host=test.example.intern
Encabezado: authorization=Bearer xxx
Encabezado: referer=https://test.example.intern/profile
Encabezado: x-forwarded-for=172.32.11.128
Encabezado: x-forwarded-host=test.example.intern
Encabezado: x-forwarded-port=443
Encabezado: x-forwarded-proto=https
Encabezado: x-forwarded-server=traefik-84794d75b9-p2q7z
Encabezado: x-real-ip=172.32.11.128

Otra cosa “divertida” es que si intercambiamos los servicios usando herramientas como telepresencia y ejecutamos el servicio localmente, funciona incluso si los encabezados son los mismos. Lo mismo sucede si simulamos la llamada de los proxies inversos, estableciendo los encabezados X-Forwarded idénticos a los que provienen del proxy, funciona.

Comparamos la configuración y los encabezados enviados de los mismos servicios que se ejecutan en nuestros otros clústeres de k8s en Google Cloud y Azure, que son idénticos (además de las direcciones IP de origen, obviamente).

Los rangos de IP del servicio del clúster y los CIDR del pod también se establecen en la configuración de server.tomcat.remoteip.internal-proxies. Otra cosa que intentamos sin éxito es establecer server.forward-headers-strategy a NATIVE.

¿Alguien sabe qué es lo que posiblemente pasamos por alto o podría orientarnos en la dirección correcta aquí?

Gracias de antemano,
Rob

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Resolución de problemas de encabezados X-Forwarded en servicios Spring Boot que se ejecutan en Kubernetes con Traefik como proxy inverso

    Problema

    Después de migrar los servicios Spring Boot a un nuevo clúster de Kubernetes con Traefik como proxy inverso y un balanceador de carga de cara al público, los encabezados X-Forwarded no son aceptados por los servicios Spring, lo que hace que HttpServletRequest sea marcado como inseguro y rompa el sistema.

    Encabezados

    Los encabezados X-Forwarded recibidos por los servicios Spring de Traefik son:

    Header: host=test.example.intern
    Header: authorization=Bearer xxx
    Header: referer=https://test.example.intern/profile
    Header: x-forwarded-for=172.32.11.128
    Header: x-forwarded-host=test.example.intern
    Header: x-forwarded-port=443
    Header: x-forwarded-proto=https
    Header: x-forwarded-server=traefik-84794d75b9-p2q7z
    Header: x-real-ip=172.32.11.128
    

    Pasos para solucionar el problema

    • Verificar los encabezados recibidos por los servicios de Traefik y confirmar que son correctos.
    • Comparar los encabezados y la configuración con los mismos servicios que se ejecutan en otros clústeres k8s en Google Cloud y Azure que funcionan bien.
    • Probar intercambiando los servicios usando herramientas como telepresencia y ejecutar el servicio localmente, lo que funcionó.
    • Simular la llamada de los proxies inversos y establecer los encabezados X-Forwarded idénticos a los que vienen del proxy, lo que funcionó.
    • Verificar y confirmar que los rangos de IP de los servicios del clúster y los CIDR de los pods están configurados en la configuración server.tomcat.remoteip.internal-proxies.
    • Intentar configurar server.forward-headers-strategy a NATIVE pero no funcionó.

    Solución

    El problema podría ser causado por el hecho de que el sistema utiliza un certificado autofirmado, lo que hace que Spring Boot ignore los encabezados X-Forwarded. Para resolver el problema, es necesario agregar el certificado al almacén de confianza de los servicios Spring Boot.

    Para agregar el certificado al almacén de confianza, siga estos pasos:

    1. Descargue el certificado con el siguiente comando:
      openssl s_client -servername test.example.intern -connect test.example.intern:443  test.example.intern.crt
      
    2. Agregue el certificado al almacén de confianza con el siguiente comando:
      keytool -importcert -alias test.example.intern -keystore truststore.jks -file test.example.intern.crt
      
    3. Reinicie los servicios Spring Boot.

    Con estos pasos, los encabezados X-Forwarded deberían ser aceptados por los servicios Spring Boot y el sistema debería estar funcionando correctamente.

Comments are closed.