NEC社主催 国内唯一のAWS対応WAF『InfoCage SiteShellハンズオンセミナー』に参加しました

記事タイトルとURLをコピーする

みなさん、こんにちは。

営業の中嶋(@mnakajima18)です。

先週10月5日(金)に開催された、NEC社主催の「国内唯一のAWS対応WAF『InfoCage SiteShellハンズオンセミナー』」に参加してきました。
「InfoCage SiteShell」はNEC社のソフトウェア型Web Application Firewall(WAF)製品です。
WAFとはWebアプリケーションの脆弱性を突いた攻撃をブロックするファイアーウォールのことをいいます。
アプライアンス製品やSaaS型の製品が多い中、「InfoCage SiteShell」は対象のサーバーにソフトウェアをインストールして利用します。
そして今年の5月からAWS対応が発表されましたので、「これはしっかり理解しておかないと」ということでハンズオンセミナーに参加することにしました。

製品紹介

「InfoCage SiteShell」はソフトウェア型WAF製品でありサーバーインストール型ということは上述した通りです。
ほかに、特徴的なのはブラックリストの更新についてです。
インド、中国、日本の拠点にてハッカーサイトや様々な情報源から最新情報を集めブラックリストを作成しています。 そのブラックリストは利用している製品に自動的に更新作業が行われます。 
自動更新の初期設定をセミナー内で行いましたが、自動更新のシェルスクリプトを動かしいくつか質問に答えるだけで完了します。
更新は最初にWebサイトにアクセスがあった時点で適用されるため、サーバーの再起動は一切必要ないという手軽さ。
サービスを止めることなく安心して運用できるのは、サービス運営側にとっては非常に大きいと思います。
さらに詳しい情報はこちらの製品サイトをご覧ください。
http://www.nec.co.jp/soft/siteshell/

導入編

実際にインストールを体験させていただきましたが、本当に簡単です!
今回はInfoCage SiteShellモジュールが入ったAMIを用意していただいていたので、そのAMIからWebサーバー用と管理サーバー用のインスタンスを立ち上げました。
まず、WebサーバーにInfoCage SiteShell本体をインストールするにはいくつかのコマンドを叩いて完了します。
以下が簡単な流れです。
1. rpmファイルの展開
2. セットアップシェルスクリプトの実行
3. Javaのパスを入力
4. ライセンスIDを入力
5. Apacheのバージョン選択
6. Apacheの設定ファイルのパスを入力
7. Apache再起動
そうするとこのようなショッピングサイトが作成され、インストール前はSQLインジェクションによって
 
個人情報が漏れてしまっていたものが
 
インストールした後では、こういったエラーページへ飛ばされます。
 
管理コンソールのインストールもほぼ同様です。
提供されているzipファイルを解凍し、セットアップシェルスクリプトを実行すると本体インストールと同じような質問に回答することでインストール完了です。
ブラウザからすぐにアクセスできるようになります。
営業の私でも30分程度でインストールができ、導入の手間は全く感じさせませんでした。
 

様々な攻撃対策方法

こちらに掲載がある通り、InfoCage SiteShellでは10の攻撃から防御する機能が備わっています。
その中でも以下の3つの攻撃対策方法をセミナー内で実践しました。
1. パストラバーサル攻撃対策
2. バッファオーバーフロー対策
3. 強制的ブラウズ対策

1. パストラバーサル攻撃対策

パストラバーサル攻撃とはWebページを指定するパスに細工を行うことによって、開発者がユーザーに公開していないディレクトリやファイルが閲覧できる脆弱性、またはそれを利用した攻撃のことをいいます。(セミナー資料引用)
今回は「/etc/passwd」の不正参照を実施しました。
このようにパスを叩かれると、ユーザーには見せてはいけない「/etc/passwd」ファイルが表示されてしまいます。
 
パストラバーサル攻撃の場合はデフォルト設定のままで問題ないので、インストールすればすぐにブロックされます。
InfoCage SiteShellのブラックリストにより「../」は攻撃と判断しているためです。

2. バッファオーバーフロー対策

バッファオーバーフローとはプログラムがメモリ上に確保した領域を超える大きさのデータを送り込むことで、システムが誤動作を引き起こしたり、悪意のあるプログラムが実行されたりする脆弱性、またはそれを利用した攻撃のことをいいます。プログラムの強制終了や任意のコードを実行されるといった問題が発生します。(セミナー資料引用)
今回のサンプル攻撃では影響がないものでしたが、アクセスしてきた値をInfoCage SiteShellがバッファオーバーフロー攻撃と判断しブロックしていることを確認しました。
サンプル攻撃の内容は、通常のパスの後ろにaを200文字程度入力するといったものです。

無効の場合は特にページに変わりはありません。
有効にするためには2つのパラメータを変更することで対応できます。
管理画面のメニュー画面からSiteShell操作定義をクリックします。
 

 

バッファオーバーフロー対策を有効にします。

ONに変更します。

続いて、URLの長さを指定します。

今回は100に設定変更します。

これで完了です。
バッファオーバーフローの場合、アプリケーションによってURLの長さは変わりますのでこのように文字数をカスタマイズができるようになっています。
 

3. 強制的ブラウズ対策

強制的ブラウズとは、公開されているURLから様々なURLを推測して参照を試みられることをいいます。
本来表示してはいけないバックアップファイルやテストファイルが参照されてしまい、攻撃のヒントなどを与えてしまう恐れがあります。(セミナー資料引用)
サンプル攻撃の内容は、FQDNの後ろに/test/search.phpを入力し本来はユーザーに表示してはいけないページにアクセスするというものです。
この攻撃を防ぐためには、公開したいディレクトリ配下を指定する設定を行います。
まずは、強制的ブラウズ対策の設定を有効にします。
値をONにします。
続いて、公開したいURLのパスを指定します。ここではユーザールール定義をクリックします。
レシピ追加をクリックします。
Recipe NameとAttack Typeは任意の名前を指定します。ルールセットの追加をクリックします。
 
今回はFQDN/demoAP/以外のアクセスはブロックします。
 
これで完了です。
強制的ブラウズの場合、バッファオーバーフローと同様にアプリケーションによって値が異なるためカスタマイズができるようになっています。

その他の設定

アプリケーション特有の脆弱性を防ぐためにユーザルール定義という設定ができます。
例えば、文字列が少ないものは過剰検知を多発させてしまうことがあるためInfoCage SiteShellのブラックリストのデフォルトでは登録されていません。
しかし、登録されていない文字列が攻撃となってしまうアプリケーションの場合、個別に設定することが可能です。
反対にブラックリストに載っている文字列がアプリケーションでは正常系の動作のためブロックしないようにする、「チェック対象外定義」という設定も可能となっています。
しかし、ブラックリストとして登録されている攻撃を通すことになるとセキュリティホールができてしまうので、なるべくアプリケーション側の改修を行っていただくことを推奨とされていました。
また、ブロックされた場合のエラーページは管理画面からHTML形式でカスタマイズすることが可能です。
攻撃者ではない通常のユーザーの方が誤って入力してしまった場合や過剰検知してしまった場合を見込んで、問い合わせ先等を記載するようにしたほうがよいとのことでした。
最後にログの集計結果はこのようにビジュアル的に確認できます。
レポートとして提出しやすいかと思います。

まとめ

最後の質疑応答の際には、よりAWSに適したサービスにするための意見交換という流れでした。
AWSを使い込んでいる私達のようなソリューションプロバイダがもっとこうしたほうが使いやすい、運用しやすいといった意見をお伝えすることでさらにバージョンアップを進めていかれるとのことです。
「SIerのみなさんと製品を育てていきたい」という担当者の方の言葉が印象的でした。
また、セミナーに参加してみて、できるだけこういった製品の導入は必要ではないかと感じました。
アプリケーション側ではフレームワークを使ったりバリデーションによって防御したりすることも大事ですが、長期間運用すればするほど脆弱性は改修できなくなってきます。 ますます増えていく攻撃手法に対抗するためには、専門的にブラックリストを更新しているサービスを使うことで安全な運用が実現できるのではないでしょうか。
こちらから試用版が提供されているので、是非お試しいただいてもよいかと思います。
InfoCage SiteShellは今後さらにAWSで利用しやすい形に変わっていくとのことなので、実運用にて導入するのが楽しみです。
"; doc.innerHTML = entry_notice + doc.innerHTML; }
' } }) e.innerHTML = codeBlock; });