Active Storage のセキュリティ警告を強化:「推測困難」から「認証なしで公開」へ
Active Storage のリダイレクト・プロキシモードに関するコントローラコメントとガイドの警告文が刷新されました。「URLが推測しにくい」という誤解を招く表現から、「URLを知っている人は誰でもファイルにアクセスできる」という実態を正確に伝える表現へと改められています。
背景
従来の警告文には、Active Storage が生成するURLが「hard to guess(推測困難)」であるという表現が含まれており、これがアクセス制御の手段として機能するかのような誤解を招いていました。実際には、これらのURLは ActiveRecord::SignedId に基づく改ざん防止の仕組みであり、URLを知っている者であれば誰でもファイルにアクセスできます。
PR本文では、この誤解が実際の情報漏洩につながった事例として、Cloudflare のクローラーヒント機能によってアップロードされた履歴書が公開状態になった事例が挙げられています。URLが漏洩する経路は他にも多数あります:
- リクエストログへのアクセス権を持つ者
- 一部のアナリティクスツール
- アプリケーションへのアクセスを失ったユーザーでも、URLを知っていればファイルにアクセス可能
このような背景から、アクセス制御が必要なファイルにはリダイレクト・プロキシモードを使用すべきではないという点を、ドキュメントがより明確に伝える必要がありました。
技術的な変更
4つのコントローラファイルとガイドの警告文が更新されました。変更の核心は警告表現の精緻化と、URL有効期限設定に関する説明の追加です。
警告文の変更(全コントローラ・ガイド共通):
変更前:
WARNING: All Active Storage controllers are publicly accessible by default. The
generated URLs are hard to guess, but permanent by design. If your files
require a higher level of protection consider implementing
Authenticated Controllers.
変更後:
WARNING: All Active Storage controllers are publicly accessible by default.
Anyone who knows the URL can access the file, even if the rest of your application requires
authentication. If your files require access control consider implementing
Authenticated Controllers.
「推測困難」という表現が削除され、「URLを知っている者はアプリケーションの認証状態に関わらずファイルにアクセスできる」という事実が明示されました。
各コントローラのクラスコメントには、URL有効期限の設定方法も追記されています。rails_storage_proxy_url や rails_storage_redirect_url に expires_in オプションを渡すか、config.active_storage.urls_expire_in でデフォルトを設定する方法が示されています:
config.active_storage.urls_expire_in = 1.day
リダイレクトコントローラには、サービスURL(実際のファイルストレージへのURL)の有効期限を制御する config.active_storage.service_urls_expire_in の説明も追加されています。デフォルトは5分で、以下のように変更できます:
config.active_storage.service_urls_expire_in = 1.hour
設計判断
誤解を招く「緩和」ではなく、リスクの正確な説明へと方針が転換されています。
変更前の「hard to guess」という表現は、URLの難読性がある種のセキュリティ層として機能するかのような印象を与えていました。しかし SignedId の役割は改ざん防止であり、アクセス制御ではありません。新しい警告文はこの区別を明確にし、「アプリケーションの認証が要求されていても、URLさえ知っていればファイルにアクセスできる」という事実を直接的に記述しています。
また、URL有効期限設定の説明を警告の直前に配置した点も注目に値します。expires_in を使用してもアクセス制御の問題は解決しませんが、URLが恒久的に有効であることへの誤解を防ぐために、コントローラの動作仕様として明示的に記載されています。アクセス制御が必要な場合は引き続き Authenticated Controllers の実装が推奨されており、この設計方針に変更はありません。
まとめ
本PRは動作を変えることなく、ドキュメントが持っていたセキュリティリスクに関する誤解を解消しています。「URLが推測困難だから安全」という誤った安心感を与えていた表現を、「URLが漏洩すれば誰でもアクセスできる」という正確なリスク認識へと書き換えることで、開発者が適切なアクセス制御手段を選択するための判断材料を提供しています。