CloudflareでDiscourseを使用する際のベストプラクティス

Cloudflare を使用した Discourse の利用

:bookmark: このガイドでは、セキュリティのベストプラクティスやトラブルシューティングのヒントを含め、Cloudflare と Discourse を設定して使用する方法について説明します。

:person_raising_hand: 必要なユーザーレベル: 管理者

:information_source: セルフホスト型インストールではコンソールへのアクセスが必要です

概要

Cloudflare は、CDN によるパフォーマンスの向上、DDoS 保護などの追加のセキュリティレイヤー、HTTPS サポートにより、Discourse インスタンスを強化できます。このガイドでは、セットアッププロセスと最適な構成のためのベストプラクティスについて説明します。

Discourse で Cloudflare を使用する理由

Discourse インスタンスで Cloudflare を使用すると、いくつかの重要な利点が得られます。

  • パフォーマンス: Cloudflare の CDN は、一般的なアセットへの世界中からのアクセスを改善し、グローバルなユーザーエクスペリエンスを向上させます (ソース)
  • セキュリティ: 以下の追加の保護レイヤーが含まれます。

:warning: セルフホスト型インストールの場合、Cloudflare はこれらの利点を提供する一方で、セットアップの複雑さが増します。

Cloudflare のセットアップ

  1. Cloudflare の基本に慣れる
  2. セットアップ手順に従ってドメインの Cloudflare を設定し、セキュリティ、パフォーマンス、信頼性のメリットを得る

構成のベストプラクティス

DNS 設定

  • Discourse インスタンスを指す DNS レコードがプロキシされていることを確認します
  • DNS 設定には dash.cloudflare.com/?to=/:account/:zone/dns からアクセスします

SSL/TLS 構成

  • 暗号化モードを「フル (厳格)」に設定します
  • SSL/TLS 設定には dash.cloudflare.com/?to=/:account/:zone/ssl-tls からアクセスします

:warning: 不適切な SSL/TLS 構成はリダイレクトループを引き起こす可能性があります

キャッシュ構成

  • キャッシュレベルを「標準」に設定します
  • キャッシュ設定には dash.cloudflare.com/?to=/:account/:zone/caching/configuration からアクセスします

キャッシュルール

Cloudflare は、ページルールを廃止し、代わりに最新の ルール システムを採用しました。キャッシュルールを使用して、dash.cloudflare.com/?to=/:account/:zone/rules で以下を作成します。

  • community.example.com/session/* のキャッシュレベルを「バイパス」に設定します
  • 受信する URL を正規化するように URL 正規化設定を構成します

ネットワーク設定

dash.cloudflare.com/?to=/:account/:zone/network のネットワーク設定は、通常、Discourse の機能には影響しません。Discourse は WebSockets、gRPC、または CF-IPCountry / True-Client-IP ヘッダーを使用しません。これらの設定は、同じドメイン上の他のソフトウェアが特定の構成を必要としない限り、デフォルトのままにしておくことができます。

WAF (Web Application Firewall) 設定

Cloudflare プランでマネージドルールがサポートされている場合は、以下を作成します。

  1. 投稿の作成/編集時に WAF をスキップします。
(starts_with(http.request.uri.path, "/posts") and http.request.method in {"POST" "PUT"})
  1. データエクスプローラープラグインのユーザー向けに、管理者クエリ時に WAF をスキップします。
((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")

両方のルールについて:

  • 「残りのルールをすべてスキップ」を選択します
  • 「一致したリクエストをログに記録」を有効にします

:information_source: ビジネスプラン以上をご利用の場合は、matches 正規表現演算子を使用して、より正確なマッチングが可能です。上記で使用されている starts_with および contains 演算子は、無料およびプロを含むすべてのプランで機能します。

WAF 設定には dash.cloudflare.com/?to=/:account/:zone/firewall/managed-rules からアクセスします

コンテンツの最適化

dash.cloudflare.com/?to=/:account/:zone/speed/optimization で以下を構成します。

  • Brotli を有効にします
  • Rocket Loader™ を無効にします

:warning: Rocket Loader™ が有効になっていることにより、Discourse でサイトがダウンしたという報告が頻繁に寄せられています (原因となったレポートの検索)

セルフホスト型インストール用の追加構成

正しい IP アドレス転送を保証するために、containers/app.yml のテンプレートセクションに以下を追加します。

- "templates/cloudflare.template.yml"

:warning: テンプレートを追加した後、変更を有効にするには ./launcher rebuild app でコンテナを再構築する必要があります。

関連: Cloudflare のセットアップ方法

サポートリソース

トラブルシューティング

コンテンツセキュリティポリシー (CSP) の問題

CSP エラーに遭遇した場合:

  • Rocket Loader が無効になっていることを確認します
  • スクリプトがサイト設定の content security policy script src に正しく追加されているか確認します

OneBox 機能

OneBox がブロックされている場合:

  • スーパーボットファイトモードが有効になっているか確認します
  • 「完全に自動化されている」の設定が「管理されている」または「ブロック」に設定されている場合は調整します
  • OneBox ユーザーエージェント用にカスタム WAF ルールを作成することを検討します
「いいね!」 29

おはようございます。

このガイドを文字通り実行しましたが、問題が発生しました。コンソールでCloudflareを有効にするたびに、CSPでエラーが発生します。「script-src」ディレクティブに違反するため、インラインスクリプトの実行が拒否されました。CSPに含まれるURLが表示されます。(「unsafe-inline」キーワード、ハッシュ(「sha256-VCiGKEA…=」)、またはナンス(「nonce-…」)のいずれかが必要です。インライン実行を有効にするには。)

どこを探しても解決策が見つかりませんでしたが、プロキシを無効にすると問題が解決しました。

ありがとうございます。

ロケットローダーがオフになっているか確認していただけますか?

もう一つは、スクリプトが content security policy script src サイト設定に適切に追加されているか確認することです。

これら none がうまくいかない場合は、Cloudflare に @ https://community.cloudflare.com/t/using-discourse-with-cloudflare-best-practices/602890 までお問い合わせいただくことをお勧めします。

「いいね!」 1

@nat および @tcloonan、ありがとうございます。

これは1~2年前から私のやることリストに入っていたのですが、この件に関する古いスレッドのいくつかが古かったので、延期していました :smiley:

ストレージやバックアップにAWS S3を使用しているユーザーにとって、何か問題や特別なことはありますか? :thinking:

True IPアドレスのためにapp.ymlでCloudflareテンプレートがまだ必要か、それとも年月を経て変更されたか、ご存知ですか?

「いいね!」 1

はい。cloudflareテンプレートは必要です。それがないと、すべてのトラフィックはユーザーのブラウザIPではなく、cloudflareのサーバーから来たように見えます。

OP(元の投稿)に記載されていないのは、明白な見落としのように思えます。どのようにしてそれが必要だと推測しましたか?

「いいね!」 2

こんにちは!2014年から(数年間はほとんど静かでしたが)活動しており、カスタムインポーターを使用してコミュニティを移行させてきました。現在、Discourseにbbobをbbcodeエンジンとして挿入および有効化するための社内プラグインの第2版に取り組んでいます。進捗はこちらで確認できます:GitHub - RpNation/bbcode: RpNation's Official BBCode Implementation for Discourse

このソフトウェアにはしばらく触れています。Cloudflareを使用しているため、Discourseとの間にどのような問題があるかを再調査しています。現在は、ブロッカーとは見なされない重要度の低いことについて心配し始める段階にあるためです。

@nat セルフホストインスタンスのテンプレートに関する編集を追加していただけますか?

「いいね!」 4

追加しました。ご指摘いただきありがとうございます!

「いいね!」 4

ありがとうございます!おそらく、私のサイトが突然アクセスできなくなったのもそのせいでしょう。Cloudflareの設定をいじりすぎてしまったようです。

古いドメインプロバイダーはDNSSecを不十分かつ不正確にしかサポートしていなかったので、新しいものを探さなければなりませんでした。その時にCloudflareのことを思い出しました。無料プランで私には十分です。料金プランが要件に合わせて合理的にスケーリングされないのは残念です。

「いいね!」 2

これがこの場所に追加されていますか?

「いいね!」 1

正確性のために、WAF除外のクエリは次のとおりです。

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

左側の Edit expression をクリックして、フォーム選択を使用せずにコピー&ペーストできます。

今日、更新したところ、Auto Minify のせいでフォーラムの半分が機能しなくなったことに気づきました :weary:

編集:これはWiki投稿であることに気づきました。お恥ずかしい、初めの投稿を編集してしまいました。

「いいね!」 4

SSL/TLS 暗号化モードを「フル(厳格)」に設定しています。これをオフにしても問題ありませんか?自動 SSL は anyway 定義されませんか?

これを追加すると、Super Bot Fight Mode がオンになっており、Definitely automated 設定が Managed または block に設定されている場合に OneBox 機能がブロックされているようです。

Onebox ユーザーエージェントのカスタム WAF ルールを設定することで回避できますが、これよりも安全な方法があるでしょうか?

関連情報

この部分は、より良い表現が必要かもしれません。

@supermathie 提案:

containers/app.yml のテンプレートセクションの末尾に次の行を追加する必要があります。

Using Discourse with Cloudflare: Best Practices - #11 by shawa で説明されているように。

サーバー構成におけるテンプレートに関する一般的なハウツーへのリンクも提供できると良いでしょう。これは、最初見たときに見つけられませんでした。

Cloudflare 内の AI ボットをオフにすることを推奨します。これは、セキュリティ → ボット → AI ボットをブロック で見つけることができます。

AI ボットは毎日 30,000 ~ 40,000 のページビューで私のサイトを攻撃していました。このフィルターをオンにした後、AI ボットのトラフィックは大幅に減少しました。

「いいね!」 5

上記のコードは以下のように変更する必要があります。

 - "templates/cloudflare.template.yml"

ありがとうございます。
Major

「いいね!」 2

Cloudflare で WebSockets を有効にする必要があるというのは本当ですか?

長年有効にせずに問題なく動作していましたし、フォーラムで調べた限りでは、Discourse は WebSockets を一切使用していません。

これをしなければならないのか理解できません

おっしゃる通りです。Websocketsは使用していないと思います。

削除しました。また、上記のユーザーからのテンプレートスニペットも更新しました。

「いいね!」 2

ついでに、ネットワーク設定全体が Discourse には関係ないと思います。

  • IPv6 互換性は無効にできなくなり、もちろん Discourse はそれに依存しませんが、IPv4 のみのシステムでも完全に動作します。
  • IPジオロケーションはリクエストに CF-IPCountry ヘッダーを追加しますが、これは Discourse では使用されません。独自の(オプションの)MaxMind 機能を使用します。
  • Network Error Logging は Report-To レスポンスヘッダーを追加し、ブラウザはエラーを報告するためにこれを使用できます。しかし、これは非推奨であり、Cloudflare のすべてのプランでこの機能を有効にできたとしても、実際にレポートを表示するダッシュボード要素は Enterprise プランでのみ利用可能です。したがって、この場合、古いブラウザではプライバシーの低下やネットワークのオーバーヘッドになる可能性があります。
  • Onion Routing は Tor ネットワークからのリクエストのプライバシーを強化します。Discourse はこれに注意しませんし、知ることさえありません。
  • Pseudo IPv4 機能は、ホストが IPv4 アドレスのみをサポートする古い分析ツールなどを実行している場合に必要になる可能性があります。Cloudflare のプロキシヘッダー(例: Cf-Connecting-IP や、設定に応じてその他のヘッダー)は、クライアントの実際の IPv6 アドレスの代わりに、より一意の IPv4 アドレスを持つように調整して、クライアントから Cloudflare へのリクエストで IPv6 サポートが無効にできないという事実を回避できます。繰り返しますが、Discourse は気にしません。たとえば GeoIP 検出には問題になりますが、この機能はデフォルトで無効になっており、管理者は実行しているソフトウェアで厳密に必要な場合にのみ有効にし、実際のクライアント IP ではないという欠点を受け入れるべきです。疑似 IPv4 アドレスを持つ新しいヘッダーを追加するように構成することもでき、分析ツールなどは必要に応じてクライアント IP ヘッダーを書き換えることができますが、Discourse へのリクエストには影響しません。いずれにしても、Discourse の一般的な機能にとっては、この機能は無関係です。
  • True-Client-IP Header は、CF-Connecting-IP および X-Forwarded-For に加えて、このヘッダーを追加するだけです。Discourse はこれを使用しませんし、Discourse の設定テンプレートも CF-Connecting-IP を使用しています。したがって、効果はありません。
  • gRPC は Discourse では使用されませんが、Cloudflare が gRPC リクエストを転送するように有効にしても害はありません。WebSocket も同様です。どちらも、同じ Cloudflare ドメインで実行されている他のソフトウェアに必要になる場合があります。
  • Maximum Upload Size 100 MB はデフォルトおよび最小値です。より大きなアップロードサイズには Business または Enterprise プランが必要ですが、Cloudflare がより大きなアップロードを許可しても Discourse が破損することはありません。

唯一、影響があるかどうか確信が持てないのは Response Buffering です。Enterprise 専用機能のためテストできません。しかし、クライアントが CF エッジからパケットが到着したときにストリーミングされるか、エッジで完了したときに 1 つのチャンクで送信されるかを気にするとは考えにくいです。キャッシュされたデータ(Cloudflare でキャッシュされたデータ)については、常にこのように行われており、少なくとも問題は発生していません。この機能はキャッシュされないデータにのみ影響します。

したがって、基本的に「ネットワーク設定」セクション全体を削除することをお勧めします。これは Cloudflare の機能には無関係ですが、他のソフトウェアでは特定の С настройка が必要になる場合や、管理者が特定の С настройка を好む場合があり、Discourse はどのような場合でも機能することを理解しておく必要があります。

「いいね!」 1