なぜPHPアプリにセキュリティホールが多いのか?

第28回 あまり語られないセキュリティの基本 ── トラストバウンダリ

この記事を読むのに必要な時間:およそ 4 分

何事も基本が一番大切です。システム開発/コンピュータプログラミングも同じく基本が大切です。基本を守らないシステム設計やコーディングは問題発生の原因となる可能性が高いことは経験上理解できると思います。

セキュリティ対策の基本も非常に大切ですが,何故か基本はあまり語られていません。今回は安全性確保の基本中の基本を紹介したいと思います。

あまり語られない核心

正しいセキュリティ対策を行うには,セキュリティ問題の原因を理解する必要があります。

セキュリティ対策の記事などでは個々のセキュリティ問題に対する具体的な原因と対策が紹介されていることが多いです。私のブログも含め個人ブログなどでは「こういう場合はこうする」といった簡単な対処例が紹介されることが多いです。例えば,「SQLインジェクション対策にはプリペアードクエリだけを使えば大丈夫」などです。

読者の方もセキュリティ対策はどうすればよいのか,具体的な対策だけを知りたいと考えている方も多く,

Xの場合はYを行う

のような例外を無視したセキュリティ対策が広く流通しているのが現状です。Xの場合はYを行う,といったセキュリティ対策の解説は解りやすいですが問題も多いです。

例えば,「SQLインジェクション対策はプリペアードクエリだけ使えば大丈夫」との解説は間違ってはいませんが完全ではありません。人気の高い組み込み型データベースのSQLiteにはプリペアードクエリがありません。

またいくらプリペーアードクエリをサポートするデータベースサーバでプリペアードクエリを使っていても,

SELECT * FROM $_GET['table'] ORDER BY $_GET['order'];

のようなクエリを書いてしまってはSQLインジェクションを防ぐことはできません。「SQLインジェクション対策はプリペアードクエリだけ使えば対丈夫」は完全な対策ではないのですSQLインジェクションの回を参照)。

JavaScriptiインジェクションも同じです。「GET, POSTで渡された<, >, ", &」だけエスケープすればよいとだけ解説されている場合が少なくありません。この連載で解説した通り,これだけではまったく不十分ですJavaScriptインジェクションの回を参照)。

完全なJavaScriptインジェクション,SQLインジェクション対策を行うには,インジェクション攻撃の原因と対策の基本を正しく理解する必要があります。個々のセキュリティ問題を理解するこも重要です。しかし,もっと重要なことはセキュリティ維持に不可欠な基本的な概念を正しく理解することです。

現実世界でのセキュリティ対策

現実の世界でセキュリティ対策を行う場合はどのような対策が取られるか考えてみましょう。多少現実的なリスクが無いと話にならないので,アメリカの高校で実際に行われているセキュリティ対策を例に考えてみましょう。

入り口での対策

コロンバイン高校での銃乱射事件を覚えている方もいると思います。事件後,多くの高校でセキュリティ対策として危険物の持ち込みをチェックするガードマンと銃やナイフなどの危険物を検知するための金属探知機を入り口に設置しました。ガードマンはカバンの中身までチェックし,金属探知機に反応した生徒は身体検査をされるようになりました。

もし,学校への入り口でセキュリティチェックをしないのであれば教師がクラスで危険物の確認を行うことになるでしょう。しかし,教師がクラスの生徒が危険物を持ってきているか確認することは非効率です。

金属探知機を各クラスに設置するのは無駄ですし,女生徒の身体検査をするために男性教師には必ず女性の補助が必要になります(逆も必要かも知れません)。しかも,教室内でセキュリティチェックを行ったのでは,学校内で暴力事件を起こそうとしている生徒に対する抑止力になりません。

現実の世界では危険物や危険人物を除去するため,入り口でしっかり安全性をチェックすることが当たり前に行われています。中に重要な情報や人物が居れば居るほど,つまりリスクに対する損失が大きければ大きいほど入り口でのチェックは厳しくなります。

出口での対策

セキュリティ対策は入り口だけで行われるものではありません。現実のセキュリティ対策では外に漏れては困るものや漏れると都合が悪いものがでないよう出口でチェックすることは普通に行われています。衣料品で「検針済み」という表記を見た覚えのある方も多いと思います。衣料品などは誤って針が残っていないかすべての製品で検針している場合がほとんではないでしょうか? 食品でも誤って機械の破片などが入っていないかチェックする仕組みを導入している場合もあります。

衣料品に針,食品に金属などのチェックのように全量検査は行っていなくても,サンプルを抜き出し安全に出荷できるか規格にあった製品であるかチェックする品質管理は一般的に行われています。

会社や施設内での対策

一般の会社でもサーバルームへは権限を持った社員だけが入室できるようセキュリティ対策が取られているはずです。遺伝子組み替えを行うような研究施設では遺伝子を組み替えた生き物が外部に流出しないようセキュリティ対策をとっています。

出入口におけるセキュリティチェックに加えて,内部でもさらなる入退室の管理を行っていることが多くあります。これは会社の社員や研究所の研究員という分類からさらに細分化されたセキュリティ要件に合わせるために,追加の入退出管理を行わないと安全性を維持できないからです。

トラストバウンダリの管理がセキュリティ対策の基本

実世界ので出入口での管理や入退出管理の考え方は,プログラマがアプリケーションのセキュリティ管理を行う際の考え方に利用できます。しかし,残念ながら実世界のメタファを利用したセキュリティ管理が広く浸透していると言えない状況ではないでしょうか?

現実の世界と同じくコンピュータアプリケーションの場合もセキュリティ対策で最も重要なのはトラストバウンダリの管理です。トラストバウンダリを日本語に訳すなら信頼境界線となるでしょう。名前の通り線を引き,危険物が混ざっている可能性があっても境界線を超える時にチェックし,危険な物が含まれている物とそうでない物を区別する,トラストバウンダリ管理が実世界でもアプリでもセキュリティ対策の基本になります。

拙著Webアプリセキュリティ対策入門ではトラストバウンダリという用語は使っていなかったと思います。その代わりに徹底した入力と出力のチェックを行うようにお薦めしています。食品工場の製品に虫が混入したり,縫製工場の衣料品に針が混入しないようにするため,これらの工場で入り口と出口での徹底した検査が有効であることは議論の余地はないでしょう。プログラムも同じで徹底した入力と出力の管理が安全対策に欠かせません。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

コメント

コメントの記入