Content-Security-Policy
Content-Security-Policy HTTPヘッダーを提供し、ブラウザが読み込めるリソースを制御することでXSSやその他のコードインジェクション攻撃から保護します。
csp
インストール
composer require 'drupal/csp:^2.2'
概要
Content-Security-Policy(CSP)モジュールは、DrupalサイトがContent-Security-Policy HTTPヘッダーを送信できるようにします。これは、クロスサイトスクリプティング(XSS)、クリックジャッキング、その他のコードインジェクション攻撃を防ぐための強力なセキュリティメカニズムです。CSPにより、サイト管理者はスクリプト、スタイルシート、画像、フォント、その他のリソースの信頼できるソースを指定できます。
このモジュールは、Report-OnlyポリシーとEnforcedポリシーの両方を設定するための包括的な管理インターフェースを提供し、すべての標準CSPディレクティブをサポートしています。Drupalライブラリで定義された外部リソースを自動検出し、ポリシーに追加するため、手動設定の手間が軽減されます。また、特定のインラインスクリプトやスタイルを許可しながら他をブロックするためのnonceとハッシュのサポートも含まれています。
開発者向けには、CSPポリシーをプログラムで変更するためのサービスとイベント、およびカスタムレポートハンドラーを実装するためのプラグインシステムを提供しています。テーマは専用のalter hookを使用して必要に応じてポリシーを変更できます。
Features
- デュアルポリシーサポート:Report-OnlyとEnforcedのContent-Security-Policyヘッダーを独立して設定可能
- 包括的なディレクティブサポート:default-src、script-src、style-src、img-src、font-src、connect-src、frame-src、frame-ancestors、form-action、base-uri、object-src、worker-src、manifest-src、media-src、prefetch-src、sandbox、webrtc、trusted-typesなど、すべてのCSP3ディレクティブを設定可能
- 自動ライブラリ検出:有効なすべてのモジュールとテーマをスキャンし、ライブラリ定義から外部スクリプトとスタイルシートのソースを自動的に含める
- nonceサポート:セキュリティを維持しながら特定のインラインスクリプトとスタイルを許可するための、リクエストごとの暗号学的nonce生成
- ハッシュサポート:特定のインラインコードをホワイトリストに登録するためのSHA-256、SHA-384、SHA-512ハッシュの計算と組み込み
- 柔軟なソース設定:ディレクティブごとにベースポリシー(self、none、any)を設定し、追加の許可ソースを指定可能
- キーワードフラグサポート:適用可能なディレクティブに対して'unsafe-inline'、'unsafe-eval'、'unsafe-hashes'、'report-sample'、'wasm-unsafe-eval'、'inline-speculation-rules'などのフラグを有効化
- プラグイン対応レポートシステム:カスタムURIエンドポイントとReport-URI.com統合の組み込みサポート、およびカスタムレポートハンドラー用のプラグインアーキテクチャ
- CKEditor5統合:ページにCKEditor5が存在する場合、必要な例外を自動的に追加
- ポリシー最適化:冗長なソースを自動的に削減し、フォールバック値と一致するディレクティブを削除
- Firefoxバグの回避策:default-srcにおけるnonce/ハッシュに関するFirefoxバグの回避策を含む
- イベント駆動アーキテクチャ:CspEvents::POLICY_ALTERイベントにより、モジュールはポリシー送信前に変更可能
- テーマhookサポート:hook_csp_policy_alterによりテーマがポリシーをカスタマイズ可能
- render element統合:CSPソース、nonce、ハッシュをrender elementに直接アタッチ可能
Use Cases
基本的なXSS保護
script-srcとstyle-srcに'self'をベースとしてReport-OnlyとEnforceの両方のポリシーを有効にします。これにより、攻撃者によって注入される可能性のある外部スクリプトとスタイルの読み込みを防ぎます。まずReport-Onlyポリシーを使用して、許可が必要な正当な外部リソースを特定してください。
クリックジャッキングの防止
frame-ancestorsディレクティブを'self'または'none'で設定し、他のサイトのフレームにページが埋め込まれるのを防ぎます。これにより、攻撃者が正当なコンテンツの上に透明なiframeをオーバーレイするクリックジャッキング攻撃から保護されます。
CDNリソースの許可
CDNホスト名(例:'https://cdn.example.com')を適切なディレクティブ(script-src、style-src、font-src、img-src)に追加し、信頼できるCDNからのリソースを許可しながら不明なソースをブロックします。モジュールはDrupalライブラリ定義から多くのCDNソースを自動的に検出します。
インラインスクリプトへのnonce使用
インラインスクリプトを追加する必要があるモジュールの場合、csp.policy_helperサービスを使用してnonceを追加します。フォールバック値を持つrender elementに'csp_nonce'をアタッチします。nonceはscript-src-elemとヘッダーに自動的に追加され、特定のインラインスクリプトを許可しながら他をブロックします。
混合コンテンツのアップグレード
Enforceポリシーで'upgrade-insecure-requests'を有効にし、HTTPリクエストを自動的にHTTPSにアップグレードします。HTTP URLで参照されているリソースを壊すことなくHTTPS移行を支援します。
サードパーティウィジェットの統合
サードパーティウィジェット(Googleマップ、ソーシャルメディア埋め込みなど)を埋め込む場合、必要なドメインをframe-src、script-src、style-srcディレクティブに追加します。Report-Onlyモードで開始し、必要なすべてのソースを発見してから、Enforceモードに移行してください。
Trusted Typesの実装
trusted-typesとrequire-trusted-types-forディレクティブを有効にし、危険なDOM操作シンクにTrusted Types APIの使用を要求することでDOMベースのXSSを防ぎます。これは複雑なJavaScriptを持つアプリケーション向けの高度な機能です。
Tips
- ポリシーを適用する前に、必要なソースを発見するために常にReport-Onlyモードで開始してください
- 開発中はReport-URI.com Wizard機能を使用して、ポリシーを簡単に構築してください
- 'report-sample'フラグは、どのインラインスクリプトやスタイルが違反を引き起こしているかを特定するのに役立ちます
- *.libraries.ymlファイルで定義された外部ソースは自動的に検出されます - 手動でソースを追加する前にライブラリが適切に定義されているか確認してください
- ブラウザの開発者ツール(コンソールとネットワークタブ)を使用してCSP違反を特定してください
- frame-ancestorsディレクティブは、クリックジャッキング保護のための古いX-Frame-Optionsヘッダーに代わるものです
- HTTPSへの移行時に混合コンテンツの問題を避けるために'upgrade-insecure-requests'の有効化を検討してください
- nonceを使用する場合、nonceをサポートしない可能性のあるブラウザのために常にフォールバック値を提供してください
- 管理インターフェースで'auto'とマークされたディレクティブは、ライブラリからソースが自動検出されています
Technical Details
Admin Pages 1
/admin/config/system/csp
Report-OnlyとEnforcedの両方のポリシーをサポートし、サイトのContent-Security-Policyヘッダーを設定します。ページは垂直タブを使用してポリシー設定を分離しています。
権限 1
Hooks 1
hook_csp_policy_alter
テーマが現在のレスポンスのCSPポリシーを変更できるようにします。このhookはテーマに対してのみ呼び出されます。モジュールは代わりにCspEvents::POLICY_ALTERイベントを使用する必要があります。
Troubleshooting 6
Report-Onlyモードを有効にし、Enforceを無効にして開始します。ブラウザコンソールとレポートエンドポイントで違反を監視します。必要なソースを適切なディレクティブに追加します。すべての正当なソースが許可された後にのみEnforceモードを有効にしてください。
モジュールは検出時にCKEditor5用の'unsafe-inline'を自動的に追加します。モジュールがCKEditor5を正しく検出しているか確認してください。問題が解決しない場合は、style-srcディレクティブに手動で'unsafe-inline'を追加してください。
ライブラリが外部URLを持つ*.libraries.ymlファイルで定義されているか確認してください。モジュールはこれらを自動検出します。自動検出されない場合は、script-src-elemとscript-srcディレクティブにホストを手動で追加してください。
インラインスタイルを避けられない場合は、style-srcディレクティブに'unsafe-inline'を追加してください。より良いセキュリティのために、csp.policy_helperサービスを使用して特定のインラインスタイルのハッシュを追加してください。
モジュールは、対応するフォールバックディレクティブ(script-src、style-src、またはdefault-src)なしで*-attrまたは*-elemサブディレクティブが有効になっている場合に警告します。サブディレクティブをサポートしないブラウザとの互換性を確保するために、親ディレクティブを有効にしてください。
少なくとも1つのポリシー(Report-OnlyまたはEnforce)が設定で有効になっているか確認してください。ユーザーがページにアクセスする権限を持ち、キャッシュが干渉していないことを確認してください。他のモジュールやWebサーバーがヘッダーを削除していないか確認してください。
Security Notes 6
- 'administer csp configuration'権限は、設定ミスがサイトの機能を壊したりセキュリティを弱めたりする可能性があるため、信頼できる管理者にのみ付与してください
- 'unsafe-inline'と'unsafe-eval'はCSP保護を大幅に弱めるため、絶対に必要な場合を除き、本番環境での使用を避けてください
- 'strict-dynamic'キーワードは、アプリケーションコードでのハッシュまたはnonce実装が必要なため、UIから設定できません
- script-srcまたはstyle-srcのハッシュソースは、インラインコードに依存する機能をブロックする可能性があります - 十分にテストしてください
- Report-Onlyヘッダーは、ブロックせずに違反を監視できます - 安全にポリシーを開発するために使用してください
- CSPは多層防御の手段であり、サイトを保護する唯一のセキュリティメカニズムであるべきではありません