市谷:…。ちょっと待ってください。アプリケーションでフィルタリングするって,実際には難しい場合もあるんじゃないですか。

室長:そうかのう?

市谷:出来上がっているWebアプリケーションを改修するのは,そう簡単じゃないと思いますよ。お金もかかるし,ひょっとしたら開発者が辞めているかもしれないし…。

桃谷:そういえば,Webサイトの開発を任せた会社は,もうありません。

室長:ううむ…。メンテナンスできないWebサイトは閉鎖してしまった方がよいと言いたいところじゃが,そうもいかんじゃろうなあ。そういうときは,「Webアプリケーション・ファイアウォール」を使うのがよいじゃろう。

桃谷:Webアプリケーション・ファイアウォール?

 すでに動き出しているWebアプリケーションを改修するのは,なかなか大変だ。Webアプリを使うサイトの多くは,パラメータを入力するページが複数ある。このすべてを漏れなく改修することが必要だ。またWebアプリによっては,ほかのアプリを呼び出して一部の処理をやらせたりするものもある。

 アプリケーションが複雑に絡み合ったWebアプリにきちんとSQLインジェクション対策を組み込むのは,けっこうな手間だ。誰が対策するとしても,ある程度の時間はかかってしまう。Webアプリケーションの開発を外注していると,話はさらにややこしくなる。

 それでも,Webアプリケーションに脆弱性があるなら対策を取らなければならない。そういうときには, Webアプリケーションが処理すべきフィルタリングを代わりに処理するWebアプリケーション・ファイアウォールが使える(図4)。

図4●SQLインジェクションによる攻撃は問題のある文字列を止めることでブロックする
図4●SQLインジェクションによる攻撃は問題のある文字列を止めることでブロックする
本来はアプリケーションでブロックすべきだが、そうはいかないこともある。そのような場合は、チェック機能を備えたWebアプリケーション・ファイアウォールを追加してブロックする
[画像のクリックで拡大表示]

アプリの代わりにチェックする

 Webアプリケーション・ファイアウォールは,市販製品とフリーソフトがある。市販製品とフリーソフトで差があるのはサポートの有無で,機能はほとんど同じだ。

 Apache(アパッチ)というHTTPサーバーに追加して使う,mod_securityというフリーソフトの場合,あらかじめ記述しておいたルールに合致する入力については,取り扱わずにエラー画面を出す。

 mod_securityに限らず,Webアプリケーション・ファイアウォールを使うときにはルールをあらかじめ記述しておく必要がある。ほとんどのWebアプリケーション・ファイアウォールは設定サンプルを用意しているので,それを参考にすればよいだろう。

 ただし,フィールド単位でどんな文字が送られてくるべきなのかを正確に把握しておく必要がある。例えば,SQLで特別の意味を持つ「SELECT」という文字列の扱い。通常は「SELECT」が入力に含まれていたら排除といったルールを設定しておく。だが,このような設定にすると,例えばID入力で「SELECT」という名前のユーザーがログインできなくなってしまう。

 反対に,排除に漏れが出ることもある。例えば,住所入力用フィールドが二つあって,町名までと番地を別に入れさせ,アプリケーションが内部で二つのフィールドの値を結合するようになっているようなときだ。このような場合,それぞれのフィールドごとにチェックするようにしているとチェック漏れが起こる。例えば「SEL」と「ECT」と二つに分けて入力した文字は,それぞれチェックをすり抜けて内部で「SELECT」になってしまうのだ。

 つまり,アプリケーションでどのようにパラメータを処理するかを熟知していないと,Webアプリケーション・ファイアウォールを的確に設定できないわけだ。漏れなく排除するのは現実的には難しい場合もある。

 漏れなくチェックするには,アプリケーションが文字列を処理した後,データベース操作コマンドにはめ込む直前にチェックするのが望ましい。ところがWebアプリケーション・ファイアウォールは,アプリケーションが入力を受け取るところでチェックするのでどうしても限界がある

 ただ,限界があることを承知で,補完的,あるいは暫定的に使うのであればそれでもよいだろう。限界があるとはいえ,よく使われているSQLインジェクション・ツールを使った攻撃に対しては十分対抗できる。

市谷:ひょっとして,Webアプリケーション・ファイアウォールを使うと,Webサーバーとして使うハードウエアの性能も上げなければならないなんてこと,ありませんか?

室長:そうじゃなあ。何らかの処理をしとる以上,負荷がかかるのは避けられんじゃろう。

桃谷:もしかして,もう1台サーバーが必要かもしれませんね。

室長:ん? そうじゃったら,Webアプリケーション・ファイアウォールを外付けにするという手もあるじゃろう。

 Webアプリケーションの改修や,Webサーバーへモジュール型のWebアプリケーション・ファイアウォールを追加するといった対策は,サーバーに余計な処理をさせてしまうことになる。Webサイトによっては,処理能力が限界を超えてしまう可能性がある。