【入門編】Permissions Policy (旧Feature-Policy)によるブラウザ機能の制限 – アプリケーションセキュリティ & 安全な開発防御ガイド

こんにちは。セキュリティの世界へようこそ。

「XSS(クロスサイトスクリプティング)」という言葉、一度は耳にしたことがあるかもしれませんね。Webサイトの入力フォームに悪意あるスクリプトを仕込まれ、勝手に情報を盗まれたり、偽の画面を表示させられたりする……。想像するだけで背筋が凍るような攻撃です。

今日は、そんなXSSの「さらに先」の話をしましょう。もし攻撃者があなたのサイトでスクリプトを実行できてしまったら、彼らは何を狙うでしょうか? 答えは、「ブラウザが持っている強力な機能」です。

—

泥棒に「家の鍵」を渡さないために

まず、イメージしてみてください。あなたの家(Webアプリ)に、泥棒(攻撃者)が窓から忍び込んだとします。

もし、リビングのテーブルの上に「カメラのスイッチ」や「マイクの録音ボタン」、さらには「GPS追跡装置」まで置いてあったらどうでしょう? 泥棒はそれらを自由に使って、あなたのプライバシーを根こそぎ奪い去りますよね。

Webブラウザも同じです。最近のWebサイトは、カメラやマイク、位置情報(ジオロケーション)など、非常に便利な機能を持っています。しかし、「攻撃者がスクリプトを実行できる状態=泥棒が家にいる状態」で、これらの強力な機能が誰でも使える設定になっていると、被害は一気に深刻化します。

そこで登場するのが、今回の主役「Permissions Policy」です。

—

Permissions Policy(パーミッション・ポリシー)とは?

Permissions Policyは、いわば「家の中にいる人に対して、どの道具を使わせていいか決めるルールブック」です。

たとえ攻撃者があなたのサイトでスクリプトを実行したとしても、Permissions Policyで「このサイトではカメラは絶対に使わせない!」と宣言しておけば、ブラウザは攻撃者の要求を拒絶します。泥棒の手元にカメラがあっても、シャッターが降りない仕組みを作るようなものですね。

設定のイメージ(HTTPレスポンスヘッダー)

Webサーバーからブラウザへ、以下のようなヘッダーを送信することで設定します。

ブラウザに送る「厳格な防犯ルール」の例
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()

この一行の意味を噛み砕くとこうなります。

  • camera=():カメラは誰にも許可しない(空っぽにする)
  • microphone=():マイクも誰にも許可しない
  • geolocation=():位置情報もダメ
  • payment=():決済APIもダメ

これだけで、たとえXSS攻撃を受けても、攻撃者はあなたのWebサイト経由で、ユーザーのカメラやマイクを勝手に起動させることはできなくなるのです。

—

具体的な設定方法:一歩ずつ進めましょう

「全部禁止しちゃったら、カメラを使う機能が動かなくなるのでは?」という疑問、ごもっともです! 必要な機能は、特定の場所(オリジン)だけに許可を与えることができます。

例えば、「自分のサイト(https://example.com)だけはカメラを使っていいよ」という設定にするなら、こう書きます。

Permissions-Policy: camera=(self “https://example.com”), microphone=()

  • self:自分自身のドメインならOKという指定
  • "https://example.com":信頼できる特定のドメインだけ許可

このように、「最小限の権限だけを与える(最小権限の原則)」というのが、セキュリティの鉄則です。

—

開発者が今すぐやるべきこと

新人のエンジニアさんや、セキュリティを学び始めたばかりの皆さんが、明日から現場で意識できるポイントをまとめました。

1. 現状を確認する: 今担当しているWebサイトで、何の機能(カメラ、位置情報など)を使っているか書き出してみましょう。
2. 使っていない機能を捨てる: 例えば、位置情報を使わないサイトなら、迷わず geolocation=() と設定して塞いでしまいましょう。これだけで攻撃の選択肢を一つ減らせます。
3. HTTPヘッダーに仕込む: Webサーバーの設定(NginxやApacheなど)や、アプリケーションのレスポンスヘッダーにPermissions Policyを追加しましょう。

設定のサンプル(Nginxの場合)

Nginxの設定ファイルに記述してブラウザに指示を出す
add_header Permissions-Policy “camera=(), microphone=(), geolocation=()”;

—

まとめ:セキュリティは「多層」で考える

XSSを防ぐことはもちろん大事です。入力値をチェックしたり、エスケープ処理をしたりする基本的な対策は、泥棒を家に入れないための「頑丈な鍵」です。

しかし、もしその鍵が壊されたら? その時のために、Permissions Policyという「家の中の道具を制限する防犯設備」を備えておく。これが、多層防御(たそうぼうぎょ)という考え方です。

セキュリティは完璧を目指すのではなく、「一つでも多くの壁を積み重ねること」が大切です。今日から、あなたのWebサイトにも「防犯ルール」を書き加えてみませんか?

一歩ずつ、着実に。そうやって守りを固めていく姿勢こそが、最強のエンジニアへの第一歩ですよ。応援しています!

コメント

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