Usando Discourse con Cloudflare: Mejores prácticas

Usar 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 resolució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 tu instancia de Discourse con un rendimiento mejorado a través de CDN, capas de seguridad adicionales como protección 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?

Usar Cloudflare con tu instancia de Discourse proporciona varios beneficios clave:

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

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

Configuración de Cloudflare

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

Mejores prácticas de configuración

Ajustes de DNS

  • Asegúrate de que los registros DNS que apuntan a tu instancia de Discourse estén en modo proxy.
  • Accede a la configuración de DNS en dash.cloudflare.com/?to=/:account/:zone/dns

Configuración de SSL/TLS

  • Establece el modo de encriptación en “Full (strict)”.
  • Accede a la configuración de SSL/TLS en dash.cloudflare.com/?to=/:account/:zone/ssl-tls

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

Configuración de caché

  • Establece el nivel de caché en “Standard”.
  • Accede a la configuración de caché en dash.cloudflare.com/?to=/:account/:zone/caching/configuration

Reglas de página

Crea las siguientes reglas de página en dash.cloudflare.com/?to=/:account/:zone/rules:

  • Establece el Nivel de Caché en “Bypass” para community.example.com/session/*
  • Configura los Ajustes de Reglas para normalizar las URL entrantes.

Ajustes de red

Configura lo siguiente en dash.cloudflare.com/?to=/:account/:zone/network:

Habilitar:

  • Compatibilidad con IPv6
  • Geolocalización IP
  • Registro de errores de red
  • Enrutamiento Onion

Deshabilitar:

  • Pseudo IPv4
  • Búfer de respuesta
  • Encabezado True-Client-IP
  • gRPC

Establece el Tamaño máximo de carga según la política de tu sitio (se recomiendan 100 MB).

Ajustes de WAF (Firewall de Aplicaciones Web)

Si tu plan de Cloudflare admite Reglas administradas, crea lo siguiente:

  1. Omitir WAF en la creación/edición de publicaciones:
    (http.request.uri.path eq "/posts(/[0-9]+)?" and http.request.method in {"POST" "PUT"})
    
  2. Para usuarios del plugin Data Explorer, omite WAF en consultas de administrador:
    (http.request.uri.path contains "/admin/plugins/explorer/queries/" and http.request.method eq "PUT")
    

Para ambas reglas:

  • Elige “Omitir todas las reglas restantes”.
  • Habilita “Registrar solicitudes coincidentes”.

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

Optimización de contenido

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

  • Habilita Brotli
  • Deshabilita Rocket Loader™
  • Deshabilita Minificación automática

:warning: Discourse recibe frecuentemente informes de sitio caído debido a la habilitación de Rocket Loader™

Configuración adicional para instalaciones autoalojadas

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

- "templates/cloudflare.template.yml"

Relacionado: ¿Cómo se configura Cloudflare?

Recursos de soporte

Resolución de problemas

Problemas de Política de Seguridad de Contenido (CSP)

Si encuentras errores de CSP:

  • Verifica que Rocket Loader esté deshabilitado.
  • Comprueba que los scripts se añaden correctamente a la configuración del sitio content security policy script src.

Funcionalidad OneBox

Si OneBox está siendo bloqueado:

  • Comprueba si el modo Super Bot Fight está habilitado.
  • Ajusta la configuración “Definitivamente automatizado” si está configurada como “Gestionado” o “Bloquear”.
  • Considera crear una regla WAF personalizada para el agente de usuario de OneBox.
28 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.

3 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.

4 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