Atlasingeniería

Incidentes en un servidor propioConfiguración que se edita y no se aplicaTema 3

Redirecciones que degradan la conexión detrás de un proxy

Pedir una ruta sin barra final devolvía una redirección hacia una dirección sin cifrar, con el nombre interno del contenedor. El servidor de adentro hablaba en claro y no tenía forma de saberlo.

Una sección del sitio funcionaba perfecto escribiendo la dirección con barra final y fallaba sin ella. Sin barra, el navegador recibía una redirección hacia una dirección con el nombre interno del contenedor y sin cifrado.

El servidor de adentro no estaba mal configurado. Simplemente no sabía nada del mundo exterior: cuando arma una redirección absoluta, usa lo único que conoce.

Por qué un servidor arma una redirección absoluta

Hay redirecciones que el servidor genera solo, sin que nadie las escriba: la más común es agregar la barra final cuando la ruta corresponde a un directorio.

Lo que ocurre paso a paso

  1. El navegador pide una ruta sin barra final, por HTTPS, al dominio público.
  2. El proxy termina el cifrado y reenvía en claro al contenedor, con su nombre interno como destino.
  3. El contenedor decide redirigir agregando la barra y construye una dirección absoluta con el esquema y el host que él ve: sin cifrar, con el nombre interno.
  4. El navegador recibe esa redirección e intenta seguirla. Falla, o degrada la conexión.

Las dos formas de arreglarlo

EnfoqueCómo funcionaCuándo conviene
Que el servidor interno no use direcciones absolutasSe le indica que las redirecciones sean relativas: sólo la ruta, sin esquema ni hostSiempre que la opción exista: es la más robusta
Que el servidor interno sepa quién es afueraSe reenvían el host y el esquema originales y se configura para usarlos al construir enlacesCuando la aplicación necesita armar enlaces absolutos igual, por ejemplo para correos
La primera elimina el problema; la segunda lo resuelve pero depende de que las cabeceras lleguen siempre.

Con la redirección relativa, el navegador completa el esquema y el host con los de la petición original, que son los correctos. Es una opción de una línea y resuelve toda la familia de casos.

La familia completa de este error

Una vez que se entiende el mecanismo, aparece en varios lugares distintos.

Dónde más se manifiesta

  1. Enlaces en correos generados por la aplicación, que apuntan al nombre interno y no funcionan fuera del servidor.
  2. Redirecciones después de autenticarse, que mandan a una dirección sin cifrar y pierden la sesión en el camino.
  3. Direcciones canónicas y mapas del sitio generados con el host equivocado, que afectan al posicionamiento.
  4. Cookies marcadas como seguras que la aplicación no manda porque cree estar en una conexión sin cifrar.

Antes de seguir, predecí

Después de iniciar sesión, el usuario termina en una dirección sin cifrar y aparece deslogueado. ¿Dónde está la causa más probable?

Cómo se verifica en treinta segundos

Este error es invisible en el navegador, porque sigue las redirecciones y muestra el resultado final. Hay que mirar la respuesta cruda.

Qué comprobar

  1. Pedir sin seguir redirecciones y leer el código y el destino. Ahí se ve si apunta al dominio público o al nombre interno.
  2. Probar con y sin barra final en cada ruta que corresponda a una sección.
  3. Comprobar el esquema del destino: tiene que ser el mismo por el que se entró.
  4. Revisar los enlaces de los correos que genera el sistema, que es donde el error sobrevive más tiempo sin que nadie lo note.
Más a fondo · nivel seniorConfiar en las cabeceras tiene condición

Cuando la aplicación se configura para creerle al esquema y al host reenviados, hay que asegurarse de que el único camino hacia ella sea el proxy. Si alguien puede llegarle directo, puede mandar esas cabeceras a mano y hacerle generar enlaces hacia donde quiera, que es una vía conocida de envenenamiento de enlaces. La red interna de contenedores y no publicar el puerto son lo que sostiene esa confianza.

La redirección en el log

Buscá en el log

Con barra final anda; sin barra final, el navegador termina en una dirección interna y sin cifrado. ¿Qué línea muestra de dónde sale esa dirección?

debug 4info 6warn 0error 111 de 11

Las dos mitades de la solución

Cierre

Autoevaluación

¿Lo entendiste?

¿Por qué este problema no aparece probando el contenedor directamente?
¿Cuál es la solución más robusta?