| « PHP 5.3の名前空間仕様が変更されました | ホワイトリストと出力 » |
ホワイトリストとブラックリスト - Firewallの場合
ホワイトリストとブラックリストの議論はFirewallの利用が一般的になる過程で十分に議論され、90年代に議論され尽くした、と思っていました。しかし、解説の余地はまだまだあるようです。Firewallによるセキュリティ対策を簡単に振り返り、セキュアコーディングの現状を考察したいと思います。
Follow up:
繰り返しになりますが定義から
ホワイトリスト=許可リスト
ブラックリスト=拒否リスト
セキュリティ対策の原則の一つに、攻撃可能な範囲の最小化、があります。この原則に従うにはリソースへのアクセス許可を最小化(ホワイトリストで可能な限り限定)します。
Firewallによるセキュリティ対策
Firewwallが一般的になり始めたころはインバウンドのパケットフィルタリングに「ブラックリストでも十分効果がある。フィルタリングより脆弱なアプリケーションをアップデートするのが本筋である」のような意見も散見されました。
まさか、今現在このような意見を持つセキュリティ専門家はいないと思いますが昔は専門家と言われるような人でもこのような意見を持つ方もいました。
現在ではFirewallでインバウンドパケットをホワイトリストを作成し、限定したパケットのみを許可する構成にする事に異論がある方はいないと思います。
少し遅れてアウトバウンドパケットのフィルタリングも当たり前になりました。インバウンドパケットのフィルタリングだけでは十分なセキュリティは確保できないので、アウトバウンドパケットのフィルタリングも必要である、と考えられました。そして、アウトバウンドパケットもホワイトリストを作成し、限定したパケットのみ通過させる構成が当たり前になりました。(少なくとも組織レベルのネットワークでは)
現在では、プロキシやステートフルフィルタリング、クライアントレベルでのネットワーク利用の制御などを行い、アウトバウンドパケットに対してホワイトリストを作成して制限するのは当たり前になっています。最近ではあまり使われていないと思いますが、ZoneAlarmをWindowsに必須のアプリケーションとして利用していた方も少なくないと思います。
Firewallにはゲートウェイ型、クライアント型の2種類がありますが、その両方ともにインバウンドとアウトバウンドパケットにホワイトリストを作成し、パケットをフィルタリングする事が当たり前になっています。
言葉を変えると、ネットワークセキュリティ対策として、入力(インバウンドパケット)と出力(アウトバウンドパケット)両方にホワイトリストと適用し、安全性を向上させる事はセキュリティ専門家でなくても当たり前になっていると言えます。
同じコンセプトの適用が遅れるシステム開発
一方、システム開発におけるセキュリティ対策はどうでしょうか?入力のバリデーションがやっと当たり前になったのようですが、出力のセキュリティ対策は不十分なシステムが多数存在します。コーディングレベルでは入力検査は可能な限りホワイトリスト方式で限定的に検査する事が当たり前になりつつありますが、出力のセキュリティレベルを向上させるためにホワイトリスト方式で限定的(安全に)に出力するスタイルはまだまだ一般的とは言えないようです。
セキュリティに真剣に取り組む姿勢がある企業は、出力に対するホワイトリスト方式の導入は数年前から本格的に取り組んでいます。しかし、一般的になったか?というと、残念ながらどうもそうではないと言えるようです。
4 comments
うちで扱ってる製品も、ホワイトリストを搭載してます。
一部の方は、ホワイトリストでは万全な対応が出来ないような解釈をされていますが、WAFの設置場所が微妙に違うと思うんですが・・・。
WEB - WAF - DB とすれば、DBに到達する様々な悪意有る行動を停められますし、WEBとDBの間にあるからこそ、WEBアプリの仕様次第で、完全なホワイトリストが設定できるんじゃないかと思います。
XSSやCSRF等は停められませんが、SQLインジェクション系はすべて停められると思うんですが、こういう考えはあのパネラーには、無かったのでしょうか。
この製品とWAFとの違いは、DBMS専用であるかないか、ですね。
WAFの問題は検査対象の入力が複数の用途に利用され、出力される事がほとんどであることです。HTML、XML、SQLなど出力先が複数でその出力先にあったエスケープ処理を行わないと、安全性を維持できません。しかし、エスケープ方式や出力時の制約が異なるので全てを守る事は不可能です。つまりダメなアプリはWAFでは守れないことを意味します。「WAFで守る」というよりは「WAFで予防する」(未知の脆弱性を予防する)という考え方で使用すべきです。
なぜ、そこまでして「ホワイトリスト」という言葉にこだわるのでしょうか?
単純に「勘違いしてました」で済む話だと思うのですが・・・
勘違いとはどこを勘違いしているのでしょうか?
勘違いしているのはあなたの方ではないでしょうか?
プログラマには出力時に変数の安全性に十分な注意をしていない人が多過ぎます。最も分り易いと思われるコンセプトが変数をホワイトリスト方式で取り扱う方法です。
変数の取り扱いがいい加減なプログラマの方でどのように変数を取り扱えばより安全なコードとなるか理解できない方なら、勘違いしている、と思っても仕方ないかも知れません。
ホワイトリストとブラックリストは元々、入力用のチェックリストの作り方のコンセプトを表す用語だという事は初めから百も承知です。用語を元々の用途から拡張して使うのはごく普通の事です。「間違っている」とか「勘違いしている」ととらえるのは頭が固過ぎるように思えます。