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 でアクセスできます。

ページルール

dash.cloudflare.com/?to=/:account/:zone/rules で以下のページルールを作成してください。

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

ネットワーク設定

dash.cloudflare.com/?to=/:account/:zone/network で以下の設定を行ってください。

有効にする:

  • IPv6 互換性
  • IP ジオロケーション
  • ネットワークエラーログ
  • オニールルーティング

無効にする:

  • 疑似 IPv4
  • レスポンスバッファリング
  • True-Client-IP ヘッダー
  • gRPC

最大アップロードサイズは、サイトポリシーに従って設定してください (100 MB 推奨)。

WAF (Web Application Firewall) 設定

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

  1. 投稿の作成/編集時に WAF をスキップ:
    (http.request.uri.path eq "/posts(/[0-9]+)?" and http.request.method in {"POST" "PUT"})
    
  2. Data Explorer プラグインユーザーの場合、管理クエリで WAF をスキップ:
    (http.request.uri.path contains "/admin/plugins/explorer/queries/" and http.request.method eq "PUT")
    
    両方のルールについて:
  • 「残りのルールをすべてスキップ」を選択してください。
  • 「一致したリクエストをログに記録する」を有効にしてください。

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 セクションに以下を追加してください。

- "templates/cloudflare.template.yml"

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

サポートリソース

トラブルシューティング

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

CSP エラーが発生した場合:

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

OneBox 機能

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

  • Super Bot Fight Mode が有効になっているか確認してください。
  • 「確実に自動化された」設定が「管理」または「ブロック」に設定されている場合は調整してください。
  • OneBox ユーザーエージェント用のカスタム WAF ルールを作成することを検討してください。
「いいね!」 28

おはようございます。

このガイドを文字通り実行しましたが、問題が発生しました。コンソールで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投稿であることに気づきました。お恥ずかしい、初めの投稿を編集してしまいました。

「いいね!」 3

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 ボットのトラフィックは大幅に減少しました。

「いいね!」 4

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

 - "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