Usando Discourse con Cloudflare: Mejores prácticas

Uso de Discourse con Cloudflare

:bookmark: Esta guía explica cómo configurar y usar Discourse con Cloudflare, incluyendo las mejores prácticas de seguridad y consejos para la solución de problemas.

:person_raising_hand: Nivel de usuario requerido: Administrador

:information_source: Se requiere acceso a la consola para instalaciones autoalojadas

Resumen

Cloudflare puede mejorar su instancia de Discourse con un rendimiento optimizado a través de CDN, capas de seguridad adicionales como protección contra DDoS y soporte HTTPS. Esta guía cubre el proceso de configuración y las mejores prácticas para una configuración óptima.

Por qué usar Cloudflare con Discourse

El uso de Cloudflare con su instancia de Discourse proporciona varios beneficios clave:

  • Rendimiento: La CDN de Cloudflare puede mejorar el acceso mundial a los recursos comunes, mejorando la experiencia del usuario a nivel global (fuente)
  • Seguridad: Capas de protección adicionales que incluyen:

:warning: Para las instalaciones autoalojadas, aunque Cloudflare ofrece estos beneficios, añade complejidad a su configuración.

Configuración de Cloudflare

  1. Familiarícese con los Fundamentos de Cloudflare
  2. Siga las instrucciones de configuración para configurar Cloudflare para su dominio y obtener los beneficios de seguridad, rendimiento y fiabilidad

Mejores prácticas de configuración

Configuración de DNS

  • Asegúrese de que los registros DNS que apuntan a su instancia de Discourse estén proxificados
  • Acceda a la configuración de DNS en dash.cloudflare.com/?to=/:account/:zone/dns

Configuración de SSL/TLS

  • Establezca el modo de cifrado en “Full (strict)” (Completo [estricto])
  • Acceda a la configuración de SSL/TLS en dash.cloudflare.com/?to=/:account/:zone/ssl-tls

:warning: Una configuración incorrecta de SSL/TLS puede provocar bucles de redirección

Configuración de Caching

  • Establezca el nivel de caché en “Standard” (Estándar)
  • Acceda a la configuración de caché en dash.cloudflare.com/?to=/:account/:zone/caching/configuration

Reglas de Caché

Cloudflare ha desaprobado las Reglas de Página en favor de su moderno sistema de Reglas. Cree lo siguiente usando Reglas de Caché en dash.cloudflare.com/?to=/:account/:zone/rules:

  • Establezca el Nivel de Caché en “Bypass” (Evitar) para community.example.com/session/*
  • Configure los ajustes de normalización de URL para normalizar las URL entrantes

Configuración de Red

La configuración de red en dash.cloudflare.com/?to=/:account/:zone/network generalmente no afecta la funcionalidad de Discourse. Discourse no utiliza WebSockets, gRPC, o las cabeceras CF-IPCountry / True-Client-IP. Estas configuraciones se pueden dejar en sus valores predeterminados a menos que otro software en el mismo dominio requiera una configuración específica.

Configuración del WAF (Web Application Firewall)

Si su plan de Cloudflare admite Reglas Administradas, cree lo siguiente:

  1. Omitir WAF al crear/editar publicaciones:
(starts_with(http.request.uri.path, "/posts") and http.request.method in {"POST" "PUT"})
  1. Para los usuarios del plugin Data Explorer, omitir WAF en consultas de administrador:
((http.request.uri.path contains "/admin/plugins/explorer/queries/" or http.request.uri.path contains "/admin/plugins/discourse-data-explorer/queries/") and http.request.method eq "PUT")

Para ambas reglas:

  • Elija “Skip all remaining rules” (Omitir todas las reglas restantes)
  • Active “Log matching requests” (Registrar solicitudes coincidentes)

:information_source: Si tiene un plan Business o superior, puede usar el operador matches regex para una coincidencia más precisa. Los operadores starts_with y contains utilizados anteriormente funcionan en todos los planes, incluidos Free y Pro.

Acceda a la configuración del WAF en dash.cloudflare.com/?to=/:account/:zone/firewall/managed-rules

Optimización de contenido

Configure lo siguiente en dash.cloudflare.com/?to=/:account/:zone/speed/optimization:

  • Habilitar Brotli
  • Deshabilitar Rocket Loader™

:warning: Discourse recibe frecuentemente informes de sitio caído debido a que Rocket Loader™ está habilitado

Configuración adicional para instalaciones autoalojadas

Para asegurar el reenvío correcto de la dirección IP, añada lo siguiente a la sección de plantillas en su containers/app.yml:

- "templates/cloudflare.template.yml"

:warning: Después de añadir la plantilla, debe reconstruir su contenedor con ./launcher rebuild app para que los cambios surtan efecto.

Relacionado: ¿Cómo configuras Cloudflare?

Recursos de soporte

Solución de problemas

Problemas de Content Security Policy (CSP)

Si encuentra errores de CSP:

  • Verifique que Rocket Loader esté deshabilitado
  • Compruebe que los scripts se añadan correctamente a la configuración del sitio content security policy script src

Funcionalidad OneBox

Si OneBox está siendo bloqueado:

  • Compruebe si Super Bot Fight Mode está habilitado
  • Ajuste la configuración de “Definitely automated” (Definitivamente automatizado) si está configurada como “Managed” (Administrada) o “Block” (Bloquear)
  • Considere crear una regla WAF personalizada para el agente de usuario de OneBox
29 Me gusta

Buenos días,

Gracias por esta guía que seguí al pie de la letra pero me encuentro con un problema, cada vez que activo Cloudflare en mi consola me sale un error con el CSP que me muestra (Refused to execute inline script because it violates the following Content Security Policy directive: "script-src) y después de indicarme las urls presentes en mi CSP: (Either the ‘unsafe-inline’ keyword, a hash (‘sha256-VCiGKEA…=’), or a nonce (‘nonce-…’) is required to enable inline execution.

He intentado buscar por todas partes pero no encuentro ninguna solución más que desactivar el proxy que me soluciona el problema.

GRACIAS.

¿Puedes comprobar si Rocket Loader está desactivado?

Otra cosa es comprobar que los scripts se añaden correctamente a la configuración del sitio content security policy script src.

Si nada de esto funciona, te sugiero que te pongas en contacto con Cloudflare en https://community.cloudflare.com/t/using-discourse-with-cloudflare-best-practices/602890.

1 me gusta

Gracias @nat y @tcloonan

Esto ha estado en mi lista de cosas que hacer durante uno o dos años, pero me ha disuadido la antigüedad de algunos de los hilos más antiguos sobre este tema :smiley:

¿Hay algún problema o algo especial para las personas que usan AWS S3 para almacenamiento y copias de seguridad? :thinking:

¿Todavía necesitas la plantilla de Cloudflare en app.yml para direcciones IP reales o eso ha cambiado con los años?

1 me gusta

Sí. Necesitas la plantilla de cloudflare. Sin ella, todo el tráfico parecerá provenir de los servidores de cloudflare en lugar de la IP del navegador del usuario.

No la veo mencionada en el OP, lo que parece una omisión flagrante. ¿Cómo dedujiste que la necesitabas?

2 Me gusta

¡Hola! He estado por aquí desde 2014 (algunos años mayormente en silencio) pero hemos estado trabajando en migrar nuestra comunidad desde 2020 con un importador personalizado, y estamos trabajando en la segunda versión de nuestro plugin interno para insertar y habilitar bbob como motor bbcode en Discourse. Puedes seguir nuestro progreso aquí: GitHub - RpNation/bbcode: RpNation's Official BBCode Implementation for Discourse

He estado respirando este software por un tiempo. Usamos Cloudflare, así que he estado re-investigando qué problemas tiene con Discourse, si es que tiene alguno, ya que ahora estamos en la etapa en la que puedo empezar a preocuparme por cosas menos vitales que no se consideran bloqueantes.

@nat ¿Podrías añadir una edición sobre la plantilla para instancias autoalojadas?

4 Me gusta

¡Hecho, gracias a ambos por señalarlo!

4 Me gusta

¡Muchas gracias! Esa fue probablemente también la razón por la que mi sitio de repente ya no era accesible. Debo haber jugado un poco demasiado con la configuración de Cloudflare.

Dado que mi antiguo proveedor de dominios solo admitía DNSSec de forma inadecuada y incorrecta, tuve que buscar algo nuevo. Fue entonces cuando se me ocurrió Cloudflare. El plan gratuito es completamente suficiente para mí. Es una pena que las tarifas ni siquiera escalen razonablemente a los requisitos.

2 Me gusta

¿Se está agregando a esta ubicación?

1 me gusta

Solo para ser precisos, la consulta para la exclusión de WAF es:

(http.request.uri.path eq "/posts(/[0-9]+)?" and http.request.method in {"POST" "PUT"})

Puedes copiarla y pegarla si haces clic en Editar expresión a la izquierda en lugar de usar la selección del formulario.

Lo noté hoy cuando actualicé y de repente la mitad del foro no funcionaba debido a Auto Minify :weary:

Editar: acabo de notar que esta es una publicación wiki. Qué tonto, he editado la publicación inicial.

4 Me gusta

Modo de cifrado SSL/TLS Completo (estricto). ¿Habrá algún problema si no se cierra? ¿No se definirá de todos modos el SSL automático?

Solo para añadir a esto, parece que la funcionalidad OneBox está siendo bloqueada cuando el Modo Super Bot Fight está activado y la configuración “Definitely automated” está configurada en “Managed” o “block”.

Puedes solucionar esto configurando una regla WAF personalizada para el user agent de Onebox, pero ¿quizás hay una forma más segura de hacerlo?

Relacionado con

esta parte podría necesitar una mejor redacción:

@supermathie Sugerencia:

querrás añadir la siguiente línea al final de tu sección de plantillas en containers/app.yml.

como se ilustra en Using Discourse with Cloudflare: Best Practices - #11 by shawa

En el mejor de los casos, también se podría proporcionar un enlace a un tutorial general sobre plantillas en la configuración del servidor, que no pude encontrar a primera vista.

Sugeriría desactivar los bots de IA dentro de Cloudflare. Esto se puede encontrar en seguridad → bots → bloquear bots de IA.

Los bots de IA estaban atacando mi sitio con 30 000 a 40 000 visitas a páginas diariamente. Después de activar este filtro, mi tráfico de bots de IA se redujo significativamente.

5 Me gusta

El código anterior debe cambiarse a:

 - "templates/cloudflare.template.yml"

Gracias,
Major

2 Me gusta

¿Es realmente cierto que el soporte de WebSockets debe habilitarse en Cloudflare?

Nos ha funcionado bien sin él durante años y, por lo que he podido encontrar en el foro, Discourse no utiliza WebSockets.

No entiendo si tengo que hacer esto

Tienes razón. No creo que usemos Websockets.

Lo he eliminado y también he actualizado el fragmento de plantilla del usuario anterior.

2 Me gusta

Mientras tanto, creo que toda la configuración de Red es irrelevante para Discourse:

  • La compatibilidad con IPv6 ya no se puede deshabilitar y, por supuesto, Discourse no depende de ella, pero puede funcionar perfectamente en un sistema solo IPv4.
  • La Geolocalización IP añade la cabecera CF-IPCountry a las solicitudes, que sin embargo no es utilizada por Discourse. Utiliza su propia función (opcional) de MaxMind.
  • El Registro de Errores de Red añade la cabecera de respuesta Report-To, que los navegadores pueden usar para reportar errores. Sin embargo, está obsoleto, e incluso si la función se puede habilitar con todos los planes de Cloudflare, el elemento del panel para ver los informes solo está disponible con el plan Enterprise. Por lo tanto, en este caso, para algunos navegadores antiguos, podría ser solo una regresión de privacidad y una sobrecarga de red.
  • Onion Routing mejora la privacidad de las solicitudes provenientes de la red Tor. Discourse no se preocupará por esto ni siquiera lo sabrá.
  • La función Pseudo IPv4 podría ser necesaria si el host ejecuta algún software, como análisis antiguos o similar, que solo admite direcciones IPv4. Las cabeceras proxy de Cloudflare, como Cf-Connecting-IP (u otras, dependiendo de la configuración), se pueden ajustar para tener una dirección IPv4 más o menos única, en lugar de la dirección IPv6 real del cliente, para solucionar el hecho de que la compatibilidad con IPv6 para las solicitudes del cliente a Cloudflare no se puede deshabilitar. De nuevo, a Discourse no le importará. Quiero decir que sería un problema para, por ejemplo, la detección de GeoIP, pero la función está deshabilitada por defecto, y los administradores, por supuesto, solo deberían habilitarla si es estrictamente necesario para cualquier software que ejecuten, aceptando la desventaja de que las IPs de los clientes no sean reales. También se puede configurar para añadir solo una nueva cabecera con la dirección IPv4 pseudo, y el análisis (o lo que sea) puede reescribir las cabeceras de IP del cliente donde sea necesario, mientras que las solicitudes a Discourse no se verían afectadas. En cualquier caso, para la funcionalidad general de Discourse, la función es irrelevante.
  • True-Client-IP Header añade solo esta cabecera además de CF-Connecting-IP y X-Forwarded-For. Discourse no la utiliza, y la plantilla de configuración de Discourse utiliza CF-Connecting-IP en su lugar. Por lo tanto, no tiene ningún efecto.
  • Discourse no utiliza gRPC, pero tener Cloudflare habilitado para reenviar solicitudes gRPC tampoco perjudica, al igual que con WebSockets. Ambos podrían necesitar estar habilitados para otro software que se ejecute en el mismo dominio de Cloudflare.
  • Tamaño Máximo de Subida 100 MB es el valor predeterminado y mínimo. Los tamaños de subida más grandes requieren planes Business o Enterprise, y Discourse no fallará si Cloudflare permite subidas más grandes.

Lo único sobre lo que no estoy seguro es si puede tener un efecto es el Almacenamiento en Búfer de Respuestas. Y no puedo probarlo ya que es una función exclusiva de Enterprise. Pero no puedo imaginar que al cliente le importe si los paquetes se transmiten desde el borde de CF a medida que llegan, o se envían en un solo bloque una vez completados en el borde. Para los datos cacheados (cacheado en Cloudflare, quiero decir), esto siempre se hace de todos modos, y no causa problemas, al menos. Esta función solo afecta a los datos no cacheados.

Así que, básicamente, eliminaría toda la sección “Configuración de Red” como algo irrelevante para la funcionalidad de Cloudflare, pero otro software podría requerir ciertas configuraciones o los administradores podrían preferirlas de cierta manera, y deben saber que Discourse funcionará en cualquier caso.

1 me gusta