ちょっと話題の記事

AWS上で Sophos UTM 9 の Web Application Firewall (WAF) を使ってSQLインジェクション攻撃を検出・防御してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Sophos somplete security

よく訓練されたアップル信者、都元です。今回のテーマは「WAF on AWS」です。

WAFとは

通常、ファイヤーウォールと言えば、レイヤー2や3(IP, TCP/UDP)における通信制御を思い浮かべると思います。どのIPアドレスから、どのポートに対する通信を許可する、または拒否する、所謂パケットフィルタリングです。これに対してウェブアプリケーションファイヤーウォール(WAF)とは、レイヤー7(アプリケーション層)で動作するファイヤーウォールです。具体的には、SQLインジェクションやXSS等の攻撃を検知して防御する働きを持った、リバースプロキシサーバだと考えると分かりやすいでしょう。

Sophos UTMとは

UTMとは Unified Threat Management の略で、日本語では「統合脅威管理」と訳されたりします。先に紹介したWAFをはじめ、システムにとってのあらゆる脅威を統合的に管理し、防御するソフトウェアです。簡単に言えば、WAF・Anti-Virus・Webサイトフィルタリング・侵入防御等、さまざまなセキュリティ機能の全部入りパッケージです。

Sophos UTM 9(以下、UTM9)は、Sophos社が提供する有償のUTM製品です。形態としては、ハードウェアアプライアンスやソフトウェアアプライアンスをはじめ、仮想マシン(VM)としても提供されています。さらに、AWS上でも簡単に利用できるよう、AWS Marketplaceにおいて、マシンイメージ(AMI)も提供されています。

今回は、このUTM9のAMIを利用して、WAFの機能を検証してみたいと思います。前述の通り、UTM9は有償の製品ですが、Marketplaceで起動したUTM9は、一ヶ月間の試用ライセンスが利用できるように設定済みとなっています。本エントリに沿って機能を試してみる分には、通常のAWS利用料以上のコスト負担はありませんので、気軽に試してみましょう。

UTM9のWAFを試す

このチュートリアルでは、2台のEC2サーバを利用します。1つがWebアプリをホストするもので、本エントリーでは「Webコンテンツサーバ」と呼びましょう。もう1つがUTM9をホストするもので、こちらは「UTMサーバ」と呼びましょう。通常、UTMを設置したいと思うほどセキュリティを気にするのであればVPCの上に環境構築するのは当たり前のことだと思いますが、今回は簡略化のため、素のEC2(非VPC)で検証環境を構築します。

保護対象のサーバを構築する

まずは、WAFによって防御されるWebコンテンツサーバを起動しましょう。通常にAmazon Linux (64bit)をmicroインスタンスで立ち上げ、SSHで接続の後、Apache httpdをインストールし、起動しておきます。もちろん、Security Group設定でTCP/80を開けておきましょう。

$ sudo yum -y install httpd
$ sudo service httpd start

これで、Amazon Linuxのテストページの表示を確認します。 2013-02-15_1028-sophos-web-launched

UTM9を起動する

続いて、UTM9のインスタンスを起動します。AWS MarketplaceにおけるUTM9のページから起動できます。このページの右カラムにある「Continue」ボタンをクリックし、起動設定画面に遷移します。 sophos-launch-1

基本的にデフォルトの設定で構いません。UTM9は最低1GBのメモリを要求するため、インスタンスタイプはsmallが適切でしょう。一応各種設定を確認して「Accept Terms & Launch with 1-Click」ボタンをクリックし、しばらく待機します。 sophos-launch-2

ポップアップに促されるまま待機(しばらく時間が掛かります)すると、以下のような画面が現れ、起動は完了です。 sophos-launch-5

ちなみに、このページの下部に、英語でインストールの手順が表示されていることにも注目しておきましょう。 sophos-launch-6

起動が完了すると、EC2コンソールにインスタンスが見えるようになるはずです。 sophos-launch-7

続いて、先の「インストール手順」に従って、https://(utm-hostname):4444 にアクセスします。プロトコルはHTTPSですが証明書のインストールはされていませんので警告が出ますが、「このまま続行」を選びます。この後何度かこの画面が表れる機会がありますが、それぞれ続行するようにしてください。 sophos-setting-1

初回アクセス時には、初期設定画面が表れます。必要事項を埋め、右下のボタンを押下します。この処理のレスポンスにはしばらく時間が掛かる(40秒ほど?)ので辛抱強く待って下さい。 sophos-setting-2

設定が完了すると、ログイン画面になります。ユーザ名は「admin」、パスワードは先ほど設定したものを入力し、ログインしてください。 sophos-setting-4

初回ログイン時は、利用調査の協力お願いが出ますが、こちらはお好きなように。 sophos-setting-5

以上で、まずダッシュボードが表れます。壮観ですね。 sophos-dashboard

まずは、タイムゾーンと言語の設定を済ませてしまいましょう。ここでは「Aisa / Tokyo」の「Japanese」に設定します。設定場所は、以下のスクリーンショットを参考にしてください。 sophos-timezone sophos-lang

言語の設定を変更すると、再ログインを求められます。ログイン画面が既に日本語化されていると思います。先ほどと同じようにログインすると、ダッシュボードも日本語化された状態になります。 sophos-lang-dashboard

WAFの設定

本Webサーバの登録

続いて、WAFの設定を行います。ダッシュボードから「Webアプリケーションファイアウォール はインアクティブ」と書いてある部分(上図)をクリックし、続いて「本Webサーバ」のタブを選択してください。本Webサーバとは、実際にコンテンツを持っているサーバ、つまり「Webコンテンツサーバ」を指します。 sophos-rws-1

「新規本Webサーバ」ボタンをクリックし、必要事項を入力します。さらに、ホストの項で緑色の+記号をクリックし、「ネットワークオブジェクトを追加」というポップアップに対して、以下のように「Webコンテンツサーバ」のホスト名を入力します。下図を参考にしてください。 sophos-rws-2 sophos-rws-3

これにより、ホスト欄が埋まります。 sophos-rws-4

以上で保存をクリックすると、「本Webサーバ」が登録されます。 sophos-rws-5

仮想Webサーバの登録

本Webサーバに対して、リバースプロキシとなるのが「仮想Webサーバ」です。こちらも、本Webサーバと同じように登録していきます。まずは「仮想Webサーバ」タブを選択し、「新規仮想Webサーバ」ボタンをクリックましょう。 sophos-vws-1

入力内容は以下の通りです。ドメインの項では緑色の「+」をクリックして、UTMサーバのホスト名を入力し、適用をクリックします。 sophos-vws-2 sophos-vws-3

以上で保存をクリックすると、「仮想Webサーバ」が登録されます。しかし、まだ「無効」の状態であるため、ステータスの赤信号をクリックして、青信号に変えておきましょう。 sophos-vws-6 sophos-vws-7

WAFの有効化

最後に、WAF機能自体を有効化します。一番左の「グローバル」タブを選択し、「Enable」ボタンを押下すると、青信号になりWAFが動き出します。 sophos-global-1 sophos-global-2

WAFで設定した「仮想Webサーバ」の動作チェックと擬似的な攻撃

ここまで設定が終わると、http://(utm-hostname) にアクセスすることによって、Webコンテンツサーバにアクセスできる状態になっています。先ほどアクセスしたのは「Webコンテンツサーバ」ですが、今回アクセスしてみるは「UTMサーバ」の方なので、注意してください。 sophos-proxy-check

そして、あまり意味はありませんが、こんなクエリ文字列をつけたとしても、アクセスできることを確認します。 sophos-query-check

最後に、SQLインジェクション攻撃風のクエリ文字列をつけてみましょう。 sophos-sqlinjection-check

やりました。WAFによって攻撃を検知し、Forbiddenのレスポンスを返したのです。

ログチェック

このような攻撃の痕跡は「ライブログ」というところにログが記録されます。 sophos-livelog-1

2013:02:15-11:21:56 ec2-23-XX-XXX-XXX reverseproxy: srcip="XXX.XXX.XX.XX" localip="10.110.51.167" size="179" user="-" host="XXX.XXX.XX.XX" method="GET" statuscode="403" reason="waf" extra="Anomaly Score Exceeded (score 40): SQL Injection Attack" time="2313" url="/" server="ec2-23-XX-XXX-XXX.compute-1.amazonaws.com" referer="-" ...

ログ中に「SQL Injection Attack」という記述がある通り、WAFがしっかり攻撃を認識していたことが分かります。

まとめ

今回は、Sophos UTM 9 という製品のWAF機能を使って、SQLインジェクション攻撃の検出・防御をしてみました。その他、UTM9には様々なセキュリティ機能が入っています。今後もその機能の幾つかをご紹介していこうと思っています。お楽しみに。

本日のエントリーは、Developers Summit 2013 Action!の会場からお送りしました :) これで、心置きなく残りのセッションを楽しめるというもの…。