Featured image of post Hugoを用いたブログサイトにおける最新のCSP設計方針 Featured image of post Hugoを用いたブログサイトにおける最新のCSP設計方針

Hugoを用いたブログサイトにおける最新のCSP設計方針

Hugoブログサイトにおける最新のContent Security Policy(CSP)設計方針を解説。Cloudflare Pagesなどの静的サイトホスティング環境で、Googleアドセンスやアクセス解析を動作させながらXSSを防ぐ安全なヘッダー設定の最適解を紹介します。

静的サイトにおけるCSPの重要性

Hugoで構築された静的サイトは動的アプリケーションより本質的に安全ですが、アクセス解析、広告、埋め込みコンテンツのためにサードパーティスクリプトを実行します。**Content Security Policy(CSP)**は、読み込み可能なリソースを制御することで、XSSやデータインジェクション、悪意のあるスクリプト実行から訪問者を保護します。

Cloudflare PagesでのCSP設定

Cloudflare Pagesはカスタム_headersファイルを使用したHTTPレスポンスヘッダーの制御をサポートしています:

# static/_headers
/*
  Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'

Hugoプロジェクトでは、この_headersファイルをstatic/ディレクトリに配置します。ビルド時に出力ディレクトリにコピーされ、Cloudflare Pagesが自動的に認識します。

Hugoブログ向けの現実的なCSP

Google AdSense、Google Analytics、YouTube埋め込みを使用するブログでは、より許容的なポリシーが必要です:

Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'strict-dynamic'
    'sha256-...'
    https://www.googletagmanager.com
    https://pagead2.googlesyndication.com
    https://www.youtube.com;
  img-src 'self' https://*.googleapis.com
    https://*.googlesyndication.com
    data:;
  frame-src 'self' https://www.youtube.com;
  connect-src 'self' https://*.google-analytics.com;
  report-uri /csp-report;

Nonce vs Hashの選択

インラインスクリプトの認証には、nonce方式とhash方式があります。静的なHugoサイトでは、デプロイ間で値が変わらないhash方式が適しています。

echo -n 'console.log("safe")' | openssl dgst -sha256 -binary | base64

strict-dynamicの活用

'strict-dynamic'ディレクティブは、信頼されたスクリプトによって読み込まれたスクリプトを自動的に信頼します。これにより、すべてのCDN URLを列挙する必要がなくなり、CSP管理が大幅に簡素化されます。

script-src 'self' 'strict-dynamic' 'sha256-ABC...';

Google AdSenseのCSP要件

AdSenseの利用には以下の最低限の許可が必要です:

ディレクティブ必要なソース
script-srchttps://pagead2.googlesyndication.com
img-srchttps://*.googlesyndication.com, https://*.doubleclick.net
frame-srchttps://googleads.g.doubleclick.net

CSPレポートの設定

report-uriディレクティブを設定すると、CSP違反レポートを受信できます。本番展開前にContent-Security-Policy-Report-Onlyヘッダーを使用してテストすることで、機能を壊さずに問題を特定できます。

適切に設定されたCSPは、XSSやスクリプトインジェクションからHugoブログの訪問者を保護しつつ、正当なサードパーティサービスの機能を維持します。strict-dynamic、スクリプトハッシュ、Report-Onlyモードによる段階的デプロイを組み合わせることで、保護と機能のバランスが取れた堅牢なセキュリティ体制を構築できます。