Avatar ProxyとCDNホットリンク保護

私のDiscourseサイトは画像が多いです。多くの画像があるため、画像を保存および配信するためにS3/CDNの組み合わせを使用しています。CDN内では、画像ハイジャックを防ぐためにさまざまな対策を講じています。対策の1つは、画像への直接アクセスをすべて停止し、定義されたホスト名のリストからのみアクセスを許可することです。

Discourseはこのセットアップで機能しますが、アバターは例外です。ホットリンク保護がオンになると、アバターは機能しなくなります。

その理由は、Discourseがアバターのプロキシセットアップを使用しているためです。HTMLはアバターのプロキシリンクを使用します。リンク構造は https://discourse.forum/user_avatar/discourse.forums/username/24/616_2.png です。
プロキシが解決されると、ブラウザは画像ファイルへの直接アクセスを要求します。

私のCDNは、この直接リクエストを行う際に403で直接アクセスを防ぎます。そして、すべてカスタムアバターがシルエットになります。

プロキシを削除するオプションはありますか?
アバターを標準の画像ファイル構造に変更できますか?

Discourse の IP アドレスをホワイトリストに登録できませんか?

直接アクセスリンクの呼び出しは、ユーザーのIPアドレスから行われます。サーバーが情報を解決しますが、ローカルブラウザが呼び出しを行います。

それが機能するかどうかはわかりません。構成によっては、プロキシが実際にプロキシするか、CDN が最初に行われます。これがどのように設定されているか詳しく説明していただけますか?

曖昧な質問は嫌いです。「これ」とは何を求めていたのですか?

現在の設定は以下の通りです。

Discourseの設定:

  • 標準的な単一コンテナインストール
  • サブドメインとして設定: forums.domain.tld
  • アップロード用の標準S3設定
  • アップロードはS3に保存

S3の設定:

  • Digital Ocean S3バケット
  • バケットは外部アクセス用にオン
  • その他のセキュリティレイヤーや権限なし

CDNの設定:

  • bunny CDN
  • 許可された参照元設定: domain.tld および *.domain.tld
  • アバターへのアクセスを妨げたスイッチは「ダイレクトURLファイルアクセスをブロックする」でした。

これをオンにすると、すべてのアバターが403エラーを受け取ります。オフにすると、アバターが表示されます。

非アバター画像:

  • Discourse内のURL: https://cdn.domain.tld/optimized/3X/3/1/filename_#_size.jpeg

アバター画像:

  • Discourse内のURL: https://forums.domain.tld/user_avatar/forums.domain.tld/mazzini/48/776_2.png

以前の投稿「アバターはどのように保存およびアクセスされますか?」では、Discourseはアバターにプロキシを使用していると示唆されています。したがって、アバターのURL構造は標準的な画像URL構造ではありません。

私のシステム内では、アバターはS3またはCDNから利用可能です。これは、どこかでアバターURLがCDN URLに変換されていることを示しています。

これが起こると、CDNはそのURLをダイレクトアクセスリンクとみなし、403でアクセスをブロックします。

これで「これ」という質問に答えられたでしょうか?

そして、私が彼らを助けるために時間を費やしているときにそのように返信されるのは嫌なので、引き分けですね :wink:

はい、「プロキシ」とは、リクエストがDiscourseを経由することを意味します。ブラウザがCDNにリクエストするのではなく、Discourseがリクエストします。

CDNをフルサイトCDNとして設定しましたか、それともS3 CDNとして設定しましたか?後者だと思います。その場合、リクエストは参照元なしでDiscourseからCDNに対して行われます。しかし、CDNはリクエストがDiscourse IPから発信されているため、正当なリクエストであることを認識できます。したがって、ホワイトリストに登録することをお勧めします。

編集:保護を短時間オフにして、Bunnyのログを確認し、どこからリクエストが来ているかを確認できます。

IT開発およびサポートの分野で長年働いてきた経験から、曖昧な質問や応答は不必要な作業を生み出すと認識しており、あなたの助けに感謝します。あなたの経験に基づけば、あなたも同意していただけると思います。

CDNはS3バケットのみに設定されています。

元のトピックを送信する前に、403エラーに関連するDiscourseのIPについてCDNログを確認しました。ログファイルには見つかりませんでした。

あなたのコメントに基づき、再度ログを分析しました。最も多くのアクセスを記録しているIPを確認したところ、上位のIPがホスティング会社のゲートウェイであることがわかりました。

課題は、Discourseサーバーが画像を正しく表示できるように、Digital OceanのゲートウェイIPアドレスを追跡したくないことです。

ご協力ありがとうございました。