セキュアメディアアップロードがカテゴリロゴを壊す

「Secure Media」と「Enable S3 Uploads」のオプションを有効にすると、カテゴリロゴが表示されなくなるようです。

最近、プライベートな投稿にアップロードされたドキュメントにアクセス権のないユーザーが、直接 URL リンクを通じてドキュメントを閲覧・ダウンロードできてしまう問題を発見しました。Secure Media 機能を使用するには、まず S3 アップロードを有効にする必要があると理解していたため、先にそれを有効にし、Discourse サーバーから S3 バケットにアップロードファイルを手動でコピーしました。その後、以下の投稿の手順に従って Secure Media を有効化しました。

この手順を実行した後、/uploads/default/ を //bucketname-etc-etc/ に変更するために discourse remap を実行する必要がありました。remap の後、rake posts:rebake を実行したところ、ほとんどの点は問題なく動作しました。Secure Media を有効化し、適切な rake タスクと remap タスクを実行した後も、他のすべてのアップロード(投稿内のドキュメントや画像、サイトのブランディング画像など)は正しく表示され、リンクされていました。ユーザーのアバターやグループのロゴは再アップロードが必要でしたが、それらを再アップロードすると、すべて正しく表示され、期待通りに新しい短縮 URL と secure-media-uploads URL が適用されました。

しかし、カテゴリロゴ画像が表示されなくなっていることに気づきました。ブラウザの開発者モードで確認したところ、カテゴリロゴ画像を再アップロードすると、正しい secure-media-uploads URL が生成され、画像は正しく表示されていました。ところが、「Save Category」をクリックするとカテゴリページが更新され、画像に対して AWS S3 の署名なし URL に直接マップしようとしてしまい、画像が表示されなくなってしまいました。

カテゴリロゴ画像を表示する Discourse のすべてのページで、画像が secure-media-uploads URL ではなく、AWS S3 の署名なし URL に直接マップされてしまいます。

回避策として、AWS S3 上の各カテゴリロゴ画像オブジェクトに訪問し、権限を「Public Read」に変更するという手間のかかる作業を行わざるを得ませんでした。

この動作は Chrome、Firefox、Microsoft Edge のすべてのブラウザで確認されました。posts:rebake や uploads:secure_upload_analyse_and_update の rake タスクを試しましたが、カテゴリロゴには何の影響も与えていないようです。これらの誤ってマップされたカテゴリロゴ画像の URL を修正する別のタスクがあるでしょうか?あるいは、これは意図された設計であり、プライベートな投稿を除くすべての S3 アップロードオブジェクトを public read にする必要があるのでしょうか?

「いいね!」 3

ご指摘ありがとうございます。カテゴリロゴが存在するとは存じませんでした :sweat: 今週中に確認し、修正をお知らせできるよう努めます。

「いいね!」 6

素晴らしい!@martin さん、ありがとうございます!

「いいね!」 3

ここでの主な問題は、secure_upload_analyse_and_update が、何が安全で何が安全でないかを判断する際に少し強引であることです。UploadSecurity クラス(https://github.com/discourse/discourse/blob/master/lib/upload_security.rb)は、アバターやカテゴリのロゴなどのパブリックタイプのアップロードがアップロード時に安全かどうかを確認しますが、この type は、rake タスクで再度確認する際に存在しません。

このセキュリティチェックの時点でアップロードが存在する可能性のあるすべての場所を確認することでこれを改善するというタスクを社内で追跡していますが、それはまだ先のことです。また、アップロード参照をより整理された方法で保存するという大規模な計画の一部でもあります。

とにかく、カテゴリのロゴや背景を、安全かどうかを判断する際にパブリックタイプとして扱うことでこの問題を修正する PR を現在作成しています。これがマージされ、更新を行えば、カテゴリ画像を再アップロードするだけで問題が解決するはずです。

「いいね!」 4