【入門編】Content-Security-Policy (CSP) の厳密なディレクティブ設計 – アプリケーションセキュリティ & 安全な開発防御ガイド

こんにちは。セキュリティの最前線で、日々「どうすればシステムを泥棒から守れるか」と格闘しているエンジニアです。

今日は、WebサイトをXSS(クロスサイトスクリプティング)という「悪意ある侵入者」から守るための最強の盾、「Content-Security-Policy(CSP)」についてお話しします。

専門用語だらけで難しそう? 大丈夫です。まずは身近な「家の防犯」に例えて、一緒に紐解いていきましょう。

1. CSPってなに?「家の防犯」で考えてみる

WebサイトにおけるXSS攻撃とは、泥棒があなたの家の鍵穴に「勝手に合鍵を差し込んで、家の中の物を持ち出したり、家具を勝手に置き換えたりする」ようなものです。

これまで、この泥棒を防ぐために多くの対策が行われてきましたが、CSP(Content-Security-Policy)は、「家の中に何を置くか、誰を招くか」を厳格に決めた「家訓(ポリシー)」のようなものです。

この家訓をブラウザに伝えておくことで、もし泥棒が侵入を試みても、ブラウザが「その怪しい道具は家の中に持ち込んではいけないと、家訓に書いてありますよ!」と即座に追い返してくれるようになります。

2. 泥棒を入れないための「三種の神器」

CSPを設定する際、特に意識すべき重要な防衛線が3つあります。

① script-src:誰の言葉を信じるか

「家の中に置いていいのは、信頼できる職人が作った道具だけ」と決めるルールです。

  • `self`:自分自身のサーバーにあるファイルならOK。
  • `unsafe-inline`:これは「何でもあり」の危険な設定。絶対に使わないのが今の常識です。

② object-src:余計なプラグインを禁止する

昔のWebではFlashなどのプラグインが使われていましたが、今はもう過去の遺物です。ここを `none` にしておくことで、攻撃者が古い脆弱性のあるプラグインを悪用することを物理的に防げます。

③ base-uri:家への帰り道を書き換えさせない

攻撃者は、Webサイト内のリンク先を勝手に書き換えて、偽のサイトへ誘導しようとします。これを防ぐために「リンクの基準となる場所はここだけ!」と固定するのが `base-uri ‘self’` です。

3. 「nonce(ナンス)」を使った安全な運用

「でも、どうしてもWebページの一部にJavaScriptを直接書き込みたいんだ!」という場面もありますよね。そんな時に使うのが「nonce(ナンス)」という仕組みです。

これは「使い捨ての入場パスポート」です。サーバーがページを表示するたびに、ランダムな合言葉(パスワード)を発行し、そのパスポートを持つスクリプトだけを実行許可します。

実践的なCSP設定サンプル

これをWebサーバーのレスポンスヘッダーに設定してみてください。

Content-Security-Policy:
default-src ‘self’; # 基本は自分のサイト内のみ
script-src ‘self’ ‘nonce-random123’; # 自分のサイトと、正しいパスポート(nonce)を持つものだけ許可
object-src ‘none’; # プラグインは全面禁止
base-uri ‘self’; # リンク先を勝手に書き換えさせない

※ `random123` の部分は、動的に生成される英数字に置き換えてくださいね!

4. 導入のコツ:いきなり縛りすぎない

いきなり厳格な設定をすると、今まで動いていた機能が突然止まってしまうことがあります。まずは「Content-Security-Policy-Report-Only」というヘッダーを使ってください。

これを使うと、「もしこのルールを適用したら、どこでブロックされるか」という報告だけを受け取ることができます。まずは「実験」として動かし、問題がないことを確認してから本番の「守り」に切り替える。このステップが、現場でトラブルを起こさないための鉄則です。

まとめ:セキュリティは「完璧」を目指さなくていい

最後に一つだけ。セキュリティに100%の完璧はありません。しかし、CSPという「家訓」をしっかり作り、ブラウザという「用心棒」を雇うことで、攻撃の難易度は飛躍的に高まります。

攻撃者は「一番鍵のかかっていない家」を狙います。今日のこの小さな一歩が、あなたのサイトを「狙うには面倒すぎるサイト」に変える第一歩になります。

まずは、自分のサイトのヘッダーを一度確認してみてください。そこからが、安全な開発の始まりです!

もし何か疑問があれば、いつでも聞いてくださいね。一緒に、より安全なWebの世界を作っていきましょう!

コメント

タイトルとURLをコピーしました