こんにちは。セキュリティの世界へようこそ。
現場でバリバリとコードを書いていると、ついつい「機能の実装」に集中してしまいがちですよね。でも、ちょっと待ってください。「動くものを作ること」と「安全に動くものを作ること」は、実は別のスキルなんです。
今日は、あなたのWebアプリを「予期せぬ悪用」から守るための、ちょっと地味だけど非常に強力な用心棒、「Permissions-Policy(パーミッションズ・ポリシー)」についてお話しします。
—
泥棒が「勝手に家の中を覗き込む」のを防ぐ仕組み
いきなりですが、あなたの家を想像してみてください。
玄関には鍵がありますよね。では、窓はどうでしょう?
最新のブラウザには、カメラ、マイク、GPS(位置情報)、さらには画面共有機能など、非常に便利な「窓」がたくさん付いています。Webアプリケーションは、これらを使ってビデオ会議をしたり、地図を表示したりします。
しかし、攻撃者はあの手この手で、「あなたが許可していない窓」をこじ開けようとします。
例えば、あなたが作ったサイトに悪意のある広告が紛れ込んだり、あるいは何らかの脆弱性を突いて外部のスクリプトが実行されたりした場合、攻撃者は「ユーザーの許可なく、ひっそりとカメラを起動して部屋を覗こう」とするかもしれません。これが、Webにおける「権限の悪用」です。
そこで登場するのが、Permissions-Policy です。これは、「このWebサイトのどの機能(窓)を、誰(どのドメイン)に許可するか」をあらかじめ決めておく「防犯ルールブック」のようなものなんです。
—
Permissions-Policy で何ができるのか?
このヘッダーを設定すると、ブラウザに対して「このサイトでは、たとえ攻撃者が頑張っても、カメラやマイクは絶対に動かさせないぞ!」と宣言できます。
もし、あなたがカメラ機能を使わないブログサイトや管理画面を作っているなら、カメラの権限を「ゼロ」にしてしまうのが一番の防犯対策です。
設定のイメージ:防犯ルールの書き方
HTTPレスポンスヘッダーに以下のように設定します。
全ての機能(カメラ、マイク、位置情報など)を禁止し、自分自身にすら許可しない設定例
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
これだけで、たとえサイト内で悪意あるコードが動こうとしても、ブラウザ側が「このサイトのルールではカメラは禁止されているので、リクエスト自体を拒否します」とブロックしてくれます。これぞ、ブラウザという「堅牢な壁」を活かした防犯対策です。
—
実践:開発現場での設定ステップ
難しく考える必要はありません。まずは「使っていない機能を閉じる」ことから始めましょう。
1. 全てをオフにする(基本の姿勢)
まずは全ての機能を禁止し、必要になったものだけを許可する「ホワイトリスト方式」で考えるのが、セキュリティの鉄則です。
全ての機能を無効化する最も厳しいポリシー
Permissions-Policy: accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()
2. 特定の機能だけ許可する
もし、自社ドメインのみでカメラを使いたい場合は、以下のように記述します。
自分自身(self)にのみカメラを許可する設定
Permissions-Policy: camera=(self)
3. 信頼できる外部ドメインだけ許可する
例えば、決済サービスなど、特定の外部パートナーのドメインにだけ機能を使わせたい場合も、このように明示できます。
自分自身と、決済代行サービスのドメインにのみ機能を許可
Permissions-Policy: payment=(self “https://payment.example.com”)
—
セキュリティの「盲点」に気づくために
新人のエンジニアの方にぜひ知っておいてほしいのは、「デフォルトを信頼しすぎないこと」です。
ブラウザの機能は便利ですが、便利さは常にリスクと背中合わせです。Permissions-Policyを設定しておくことは、万が一あなたのアプリケーションにクロスサイトスクリプティング(XSS)のような脆弱性が混入してしまったとき、「被害を最小限に食い止める最後の砦」になります。
「まだ誰も見ていない小さなサイトだから」と油断せず、開発の初期段階からこのヘッダーを仕込んでおいてください。それが、プロのエンジニアとしての「たしなみ」です。
今日からできること
1. 今すぐ自分のサイトのヘッダーを確認する: ブラウザの開発者ツール(F12)を開き、ネットワークタブからレスポンスヘッダーを見てみてください。
2. 不要な権限を特定する: 自分のサイトで使っている機能はどれだけありますか?使っていないものは全て `()` でブロックしてしまいましょう。
最初は少し面倒に感じるかもしれませんが、一度設定してしまえば、あなたのWebサイトは格段に「泥棒が入りにくい家」になります。
セキュリティは、派手なハッキングを防ぐことだけではありません。こうして一つひとつ、丁寧に「窓の鍵」を閉めていく作業こそが、最強の防衛策なんです。一緒に頑張っていきましょう!

コメント