このガイドでは、Discourse におけるクロスサイトスクリプティング(XSS)攻撃を緩和するために、コンテンツセキュリティポリシー(CSP)を使用する方法について説明します。CSP の基礎、設定、およびベストプラクティスをカバーしています。
必要なユーザーレベル:管理者
まとめ
コンテンツセキュリティポリシー(CSP)は、クロスサイトスクリプティング(XSS)やその他のインジェクション攻撃から保護するための、Discourse における重要なセキュリティ機能です。このガイドでは、CSP の基礎、Discourse での実装方法、およびサイトでの設定方法について解説します。
コンテンツセキュリティポリシーとは?
コンテンツセキュリティポリシーは、クロスサイトスクリプティング(XSS)やデータインジェクション攻撃など、特定の種類の攻撃を検出および緩和するための追加のセキュリティ層です。CSP は、信頼できるコンテンツソースを指定し、ブラウザに対してそれらの信頼できるソースからのリソースのみを実行またはレンダリングするように指示することで機能します。
XSS は依然として最も一般的な Web の脆弱性の一つです。CSP を実装することで、Discourse は信頼できるソースからのスクリプトのみをロードおよび実行することを許可し、XSS 攻撃のリスクを大幅に低減します。
Discourse の CSP 実装
Discourse バージョン 3.3.0.beta1 以降、Discourse は「strict-dynamic」CSP を実装しています。このアプローチでは、script-src ディレクティブに単一の nonce- 値と strict-dynamic キーワードを使用します。コアおよびテーマ内のすべての初期の <script> タグには、自動的に適切な nonce= 属性が割り当てられます。
デフォルトのポリシーには、以下のディレクティブが含まれています。
script-src:JavaScript の有効なソースを指定worker-src:ServiceWorker スクリプトの有効なソースを指定object-src:プラグイン(Flash、Java など)の実行をブロックbase-uri:<base>要素の URL を制限manifest-src:Web アプリマニフェストの URL を制限frame-ancestors:どのサイトが iframe 内に Discourse インスタンスを埋め込むことができるかを制御upgrade-insecure-requests:HTTP リクエストを自動的に HTTPS にアップグレード(force_httpsが有効な場合に含まれる)
Discourse での CSP の設定
利用可能な設定
content_security_policy:CSP の有効化または無効化(デフォルト:オン)content_security_policy_report_only:CSP レポートオンリーモードの有効化(デフォルト:オフ)content_security_policy_script_src:デフォルトのscript-srcディレクティブ を拡張可能content_security_policy_frame_ancestors:frame_ancestorsディレクティブ を有効化(デフォルト:オン)
CSP の有効化方法
- 管理パネルに移動
- セキュリティ設定へ移動
content_security_policy設定を見つけ、有効になっていることを確認
CSP を完全に有効にする前に、潜在的な問題を確認するために、CSP レポートオンリーモードから開始することをお勧めします。
content_security_policy_report_only設定を有効化- ブラウザのコンソールで CSP 違反を監視
- 必要に応じて CSP を拡張し、正当な違反に対処
- 誤検知がないことを確信したら、レポートオンリーモードを無効化し、CSP を完全に有効化
デフォルトの CSP の拡張
追加のスクリプトソースを許可する必要がある場合は、content_security_policy_script_src 設定を使用して script-src ディレクティブを拡張できます。以下を追加できます。
- ハッシュソース
'wasm-unsafe-eval''unsafe-eval'(注意して使用してください)
例:
'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=' 'unsafe-eval'
'unsafe-eval' や他の寛容なディレクティブを追加する際は注意してください。これらは CSP の効果を低下させる可能性があります。
CSP とサードパーティとの統合
Google タグマネージャー、Google アナリティクス、広告サービスなどのサードパーティサービスを使用する場合は、CSP 設定を調整する必要がある場合があります。Discourse バージョン 3.3.0.beta1 以降のほとんどの場合、‘strict-dynamic’ CSP の実装により、追加の設定なしで外部スクリプトが動作します。
問題が発生した場合は、以下を行う必要がある場合があります。
- ブラウザのコンソールを監視して、必要なスクリプトソースを特定
- 必要なソースを
content_security_policy_script_src設定に追加 - 外部リソースをロードする広告サービスなどの複雑な統合の場合、ドメイン間レンダリングを有効にする必要があるかもしれません(これを行う discourse-adplugin の例 PR を参照)。
ベストプラクティス
- 潜在的な問題を確認するために、CSP レポートオンリーモードから開始
- 正当な違反を解決するにつれて、CSP を徐々に強化
- CSP 設定を定期的にレビューし、必要に応じて調整
'unsafe-eval'や'wasm-unsafe-eval'のような寛容なディレクティブを追加する際は注意- 最新の CSP の改善を活用するために、Discourse インスタンスを最新の状態に保つ
よくある質問
Q: CSP 違反レポートが多数表示されています。心配すべきですか?
A: 多くの CSP 違反は誤検知であり、ブラウザ拡張機能や他の無関係なスクリプトが原因であることが多いです。サイトの機能に関連する違反に対処することに集中してください。
Q: Google AdSense や他の広告ネットワークと CSP を併用できますか?
A: はい、ただしより寛容な CSP 設定を使用する必要がある場合があります。レポートオンリーモードから開始し、報告された違反に基づいて設定を調整してください。
Q: CSP の問題をトラブルシューティングするにはどうすればよいですか?
A: ブラウザの開発者ツールを使用して、CSP 違反メッセージをコンソールで監視してください。これにより、どのリソースがブロックされているか、その理由を特定できます。