Barracuda Firewall を使用して Azure アプリケーションをセットアップ/保護する方法
このポストは、1 月 28 日に Ashwin Palekar が投稿した How to Setup and Protect an Azure Application with a Barracuda Firewall の翻訳です。
編集メモ: 今回は、シニア アプリケーション開発マネージャーを務める Tim Omta の投稿をご紹介します。
1 はじめに
Windows Azure でアプリケーションをホストする企業は、どこかの時点で、商業的に活用する目的でアプリケーションをインターネット上に公開する必要があります。インターネットへの公開は、顧客と攻撃者の両方の興味を引きつけることになり、アプリケーション内のデータの価値が上がるにつれ、攻撃者にとってそのアプリケーションの魅力はさらに高まっていきます。企業は、Azure で Web アプリケーションをホストすることによって得られる経済的メリットについては把握していますが、顧客に有益なエクスペリエンスを提供しつつ攻撃者からデータを保護するということに関しては、不安を抱いています。オンプレミスのデータセンターに関しては、攻撃者からアプリケーションを保護するためのインターネット エッジ デバイスが多数存在します。今日では、こうしたデバイスを製造するメーカーの何社かが、Windows Azure をはじめとするホスティング プロバイダー向けのソリューションの提供を開始しています。
Barracuda Networks はその 1 社であり、Windows Azure 向けに Web Application Firewall 仮想デバイスを開発しました。このデバイスでは、Azure IaaS Web サーバーや PaaS Web ロールを保護することが可能です。この記事では、シンプルな PaaS アプリケーションのセットアップ方法を段階的に説明しながら、Barracuda が提供する Windows Azure 向けネットワーク セキュリティ ソリューションについてご紹介していきます。ここでは主に以下の重要な項目についてご紹介します。
- ネットワークのセットアップ
- Azure PaaS アプリケーション
- Barracuda Web Application Firewall (WAF) のセットアップ
- アプリケーションの公開
このガイドでは、以下の構成図に示すようなシステムを作成します。
2 ネットワークのセットアップ
最初に行うのはネットワークのセットアップです。ネットワークは、Azure 内で PaaS アプリケーション、Web Application Firewall (WAF)、インターネットを接続するにあたっての基礎となります。後から変更することはできないため、ここでは慎重な判断が必要とされます。まず、1 つのネットワーク、その中に 2 つのサブネット、さらに 1 つのアフィニティ グループを作成していきます。ネットワークは、全リソースが参照する IP アドレスの総合プールとなります。また、2 つのサブネットには、Subnet-1 と Subnet-2 という名前を付けます。Subnet-1 は WAF サブネットとなり、WAF のみを含みます。Subnet-2 はアプリケーション サブネットとなり、アプリケーション PaaS ロールのみを含みます。このようにサブネットを区別する理由は、通信するリソースのタイプを、そのアドレスによって把握できるようにするためです。また、区別することによって、各タイプのリソースのセキュリティをサブネットごとに確保できるようになります (サブネットは基本的にリソース タイプでグループ化するため、グループを適切に扱うことができます)。サブネットは、セキュリティとアドレス割り当ての境界を規定します。
最後に、アフィニティ グループを作成することにより、すべてのマシンと新規に作成されたネットワークとをグループ化するように、Azure に通知することができます。また、アフィニティ グループは、通信の待機時間 (レイテンシ) を短縮するためにリソースを地理的に併置します。
2.1 ネットワークとアフィニティグループを作成する
まず、Azure 管理ポータル (https://manage.windowsazure.com/) にサインインします。
左側のウィンドウから [NETWORKS] をクリックします。
ページ上部中央の [VIRTUAL NETWORKS] をクリックします。
左下部にある [NEW] をクリックします。
[NETWORK SERVICES] をクリックします。
[VIRTUAL NETWORK] をクリックします。
[CUSTOM CREATE] をクリックします。
このダイアログで、慎重に名前を選択するようにします。以降、このインフラストラクチャ全体を通じてこのネットワーク名とアフィニティ グループ名を使用することになるため、後からこれらを変更することは推奨されません (変更するとすべて台無しになります)。
[NAME] テキスト ボックスにネットワーク名を入力します。
[AFFINITY GROUP] で「Create a new affinity group」が選択されていることを確認します。
ネットワークを作成し、リソースを地理的に配置するリージョンを選択します。
アフィニティ グループの名前を入力します。
[OK] をクリックします。
2.2 ネットワークアドレスとサブネットアドレスの範囲を決定する
次に、下の画像のようなページが表示されます。
ネットワークのアドレス空間を選択します。ここでは「172.16.x.x」という全体的なネットワーク アドレス範囲を選択したため、最初の 2 つのドット付き数字 (オクテット) は、このネットワーク上のすべてに共通して使用されます。「172.16.1.0/16」は、IP アドレスの割り当てを「172.16.1.0」から開始するつもりであり、最後の 16 ビット (最下位の 2 つのオクテット) をアドレスとして変化させるということを Azure に通知します。最下位の 2 つのオクテットを、それぞれサブネット番号とデバイス アドレスとして使用します。
[ADDRESS SPACE] に「172.16.1.0/16」と入力します。
「172.16.1.0/24」のアドレス空間に「Subnet-1」という名前のサブネットを追加します。
「172.16.2.0/24」のアドレス空間に「Subnet-2」という名前のサブネットを追加します。
ネットワークは、以下の画像のとおりに作成され、ポータルに表示されます。
以上で、Subnet-1 に WAF を配置し、Subnet-2 にアプリケーションを配置するための準備ができました。
次に、保護対象となるアプリケーションの作成と構成を行います。
3 Azure PaaS アプリケーション
このステップでは、アプリケーションを作成し、Paas Web ロールにそのアプリケーションをデプロイします。ここで重要なのは、アプリケーションそのものではなく、アプリケーションの構成になります。構成は、WAF で保護するすべての Web ロールに対して行う必要があります。また、この構成は、ここまでの手順で作成したネットワーク レイアウトが準備されていることを前提としています。ネットワーク名、アフィニティ グループ、サブネット名は、アプリケーションの構成に不可欠です。デプロイされたアプリケーションはインターネットからのトラフィックを直接受け取ることはできず、自身のサブネット (Subnet-2、アプリケーション サブネット) と WAF サブネット (Subnet-1、WAF サブネット) 上のロールとのみ通信できます。
3.1 デモ アプリケーションを作成する
Visual Studio で、[File] メニューを開き、[New] を選択して、[Project] をクリックします。
左側のウィンドウで [Cloud] を選択します。
中央のウィンドウで [Windows Azure Cloud Service] テンプレートをクリックします。
プロジェクトの名前を入力するか、既定の名前 (WindowsAzure1) をそのまま使用します。ここでは「DemoApp」という名前を付けたので、これ以降、この名前がアプリケーション名として表示されます。
[OK] をクリックします。
次のダイアログで、[ASP.NET Web Role] をクリックします。
[>] ボタンをクリックして、この Web ロールを追加します。
[OK] をクリックします。
Default.aspx を開いて、<h2> タグ コンテンツを以下のように変更します。
変更前: Modify this template to jump-start your ASP.NET application
から
変更後: This application is protected by the Barracuda Web Application Firewall
ここまでの手順で、標準の Azure Web ロール アプリケーションが作成されました。以降の修正は、Azure の WAF の背後に配置する必要があるすべてのアプリケーションに対して行うべき重要な修正です。
3.2 アプリケーションを構成する
まずアプリケーションの構成を変更して、それをネットワークのアプリケーション サブネット (Subnet-2) に配置します。
Visual Studio クラウド プロジェクトで、ServiceConfiguration.Cloud.cscfg ファイルを開きます。
下の図に示すように、ServiceConfiguration タグ内に次の NetworkConfiguration セクションを追加します。Role の終了タグの直後に追加できます。
<NetworkConfiguration>
<VirtualNetworkSite name="DemoVNet"/>
<AddressAssignments>
<InstanceAddress roleName="WebRole1">
<Subnets>
<Subnet name="Subnet-2"/>
</Subnets>
</InstanceAddress>
</AddressAssignments>
</NetworkConfiguration>
ネットワーク名に VirtualNetworkingSite の名前属性を割り当てます。先ほど付けたものと同じ名前を使用している場合、ネットワーク名は「DemoVNet」となります。
既にこのファイルにある Role タグの名前属性と同じ値に InstanceAddress タグの roleName 属性を割り当てます。
さきほど作成し、アプリケーション サブネットの「Subnet-2」として指定したサブネットの名前に、Subnet タグの名前属性を割り当てます。
これで ServiceConfiguration.Cloud.cscfg は、以下のようになります。
ファイルを保存します。
3.3 アプリケーションファイアウォールの構成のためにコマンドファイルを追加する
この作業の主な目的は、WAF サブネット (Subnet-1) からのトラフィックを受け入れるために、PaaS ロールのファイアウォールを開放するコードを追加することです。ここでは、netsh (英語) を呼び出すロール起動タスクを使用して、ファイアウォール ルールを追加する方法をご紹介します。これは、他の方法 (ロールの OnStart メソッドでの C# コードなど) でも実現できます。
WebRole1 プロジェクトを右クリックします。
[Add] をクリックします。
[Text File] を選択します。
ファイルに「Start.cmd」という名前を付けます。
[OK] をクリックします。
start.cmd に以下の行を追加します。
eventcreate /ID 1 /L APPLICATION /T INFORMATION /SO demoWebApp /D "Webrole start task complete" netsh firewall add portopening protocol=TCP port=80 name="demoWebApp" mode=ENABLE scope=CUSTOM addresses=172.16.1.0/255.255.255.0 profile=CURRENT
最初の行は、start.cmd が起動したことを示すイベントを Windows Server アプリケーションのイベント ログにポストします。
2 番目の行は、WAF サブネットからのトラフィックのために、Paas Web ロール上で TCP トラフィック用にポート 80 を開放します (前の段階で、172.16.1.x アドレス空間に Subnet-1 を作成しました)。
既定では、Visual Studio は start.cmd を Unicode で保存しますが、cmd コマンド プロセッサはこれを実行できません。cmd が実行されるように、ファイルは確実に ASCII エンコーディングで保存する必要があります。
この設定を行うには、Visual Studio の [File] メニューをクリックして [Advanced Save Options] を選択します。
[encoding] を「US-ASCII – Codepage 20127」に変更します。
[OK] をクリックします。
ソリューション エクスプローラーで start.cmd を選択します。
start.cmd ファイルの [Properties] で、[Build Action] を「None」に設定します。
[Copy to Output Directory] を「Copy Always」に設定します。
start.cmd ファイルを保存します ([File]、[Save] の順にクリック)。
これで、ロールが起動されたときに実行するバッチ ファイルが作成されました。次に、ロールを構成して、インターネット トラフィックを受け入れず、実際に start.cmd ファイルを実行するようにする必要があります。
3.4 アプリケーションエンドポイントと起動タスクを構成する
クラウド プロジェクトで、ServiceDefinition.csdef ファイルを開きます。
InputEndpoint タグを InternalEndpoint に変更します。
Endpoints の終了タグの下に、start.cmd を実行する Startup タグを追加します。
<Startup>
<Task commandLine="start.cmd" executionContext="elevated" taskType="simple"></Task>
</Startup>
ServiceDefinition.csdef は、以下のようになります。
ファイルを保存します。
3.5 適切なアフィニティグループにアプリケーションのクラウドサービスを追加する
次に、アプリケーションをホストするクラウド サービスをカスタム作成する必要があります。クラウド サービスのカスタム作成によって、ここで作成したネットワークのアプリケーション サブネット (Subnet-2) 内にアプリケーションを配置できることを後で確認するアフィニティ グループを指定できるようにします。
Azure 管理ポータルで、左側のウィンドウにある [CLOUD SERVICES] をクリックします。
左下にある [NEW] をクリックします。
[COMPUTE]、[CLOUD SERVICE] を順に選択します。
[CUSTOM CREATE] をクリックします。
アプリケーション クラウド サービスに、任意の URL を指定します。ここでは、アプリケーションと同じ名前を使用します。
ネットワークの作成時に作成したアフィニティ グループを選択します。この手順は重要です。これによって、ネットワークと同じグループにアプリケーション クラウド サービスを配置できるためです。
OK チェック マークをクリックします。
3.6 アプリケーションを発行する
最後に、カスタム作成したクラウド サービスにアプリケーションを発行します。
Visual Studio で [Cloud Project] を右クリックして、[Publish…] を選択します。
サブスクリプションを選択します。
[Next] をクリックします。
直前に作成したクラウド サービスを選択します。サービスと関連付けたアフィニティ グループが表示されることを確認してください。
RDP やその他の必要な設定を構成します。
[Next] をクリックします。
最後に、以下のような概要が表示されます。
[Publish] をクリックします。
数分後、アプリケーションが Azure に発行され、実行されます。RDP を有効にすると、PaaS ロール インスタンスにログオンしてイベント ログを見ることができます。起動タスクが正しく動作していれば、ロール アプリケーション ログに「Webrole start task complete」というメッセージが表示されます。ここで作成した start.cmd ファイルの詳細を見ると、最初の行がこのイベント メッセージをポストしていることがわかります。また、このロールの Windows Firewall コンソールにリストされたファイアウォール ルールを確認することもできます。このルールは、start.cmd の netsh 行で付けられた名前で表示されます。
アプリケーションが正常に起動し、動作しているので、WAF のセットアップに移ります。
4. WAF のセットアップ
WAF VHD ファイルをお持ちでない場合は、Barracuda Networks から入手する (英語) 必要があります。「Barracuda Web Application Firewall Azure Virtual Device」をリクエストしてください。
4.1 Azure ストレージアカウントに Barracuda VHD をアップロードする
以下に示すような add-azurevhd (英語) Azure PowerShell コマンドレットを使用することができます。基になる変数は、Barracuda 社のサイトからダウンロードした vhd への完全なパスです。対象になる変数は、ストレージ アカウントの URL、コンテナー、および vhd のアップロード先となるファイル名です。Azure PowerShell コマンドレットのセットアップ手順については、https://msdn.microsoft.com/ja-jp/library/windowsazure/jj156055.aspx を参照してください。
4.2 VHD から仮想マシンディスクを作成する
Azure 管理ポータルで、左側にある [VIRTUAL MACHINES] を選択します。
ページ上部中央の [DISKS] をクリックします。
[CREATE] をクリックします。
次のダイアログで、ディスクに名前を付けます。
[VHD URL] に、アップロードした vhd のパスとファイル名を設定します。
[The VHD contains an operating system] チェック ボックスをオンにします。
オペレーティング システムとして「Linux」を選択します。
チェック マークをクリックします。
これでディスクが作成されます。次のステップでは、ディスクから仮想マシンを作成します。
4.3 IaaS Barracuda 仮想マシンを作成する
ディスクから仮想マシンを作成するには、管理ポータルで [VIRTUAL MACHINES] を選択します。
ページ下部の [NEW] ボタンをクリックします。
[COMPUTE]、[VIRTUAL MACHINE] を順に選択します。
[FROM GALLARY] をクリックします。
次のダイアログで、左側にある [MY DISKS] をクリックします。
右側のリストを一番下までスクロールします。
今作成したディスクをクリックします。
この仮想マシンに名前を付けます。
仮想マシンのサイズを選択します。サイズの選択は、WAF が処理しなければならないトラフィックの量により変わります。サイトのトラフィックが極端に少ないのでなければ、最低でも [Medium] を選択するとよいでしょう。
[Next] 矢印をクリックします。
[CLOUD SERVICE] リスト ボックスで、「Create a new cloud service」を選択します。
クラウド サービスの DNS 名を選択します。
仮想ネットワークを、手順 1 で作成した仮想ネットワーク「DemoVNet」に設定します。
サブネットを、手順 1 で作成した WAF サブネット「Subnet-1」に設定します。
[Next] 矢印をクリックします。
HTTPS エンドポイントを追加することにより、WAF に TCP ポート 443 を開放します。
OK チェック マークをクリックします。
Azure は仮想マシンを作成し、起動します。WAF 仮想マシンの起動までしばらく待つと (30 分程度)、安定した状態になります。仮想マシンの状態は、Azure 管理ポータルの仮想マシン ダッシュボードで確認できます。ダッシュボードで、CPU 使用率の登録が開始されます。
4.4 Barracuda 仮想デバイスをプロビジョニングする
ブラウザーを開いて、WAF 管理ページに移動します。WAF 管理ページの URL は、前のセクションで指定した仮想マシンのクラウド サービスの DNS 名です。ここでは、https://omtaDemoWAF.cloudapp.net となっています。技術情報として、Barracuda のサイト (https://techlib.barracuda.com/display/BWAFv76/Barracuda%2BWeb%2BApplication%2BFirewall%2BVx%2BQuick%2BStart%2BGuide%2B-%2BWindows%2BAzure、英語) に、起動中は SSL 管理サイトにアクセスできない場合がある旨が掲載されています。このことが問題になる場合は、前のステップで Azure ポータルから作成したクラウド サービスに、エンドポイントとしてポート 8000 を追加し、次にポート 8000 で明白な HTTP (この例では https://omtaDemoWAF.cloudapp.net:8000) の管理サイトにアクセスしてデバイスの状態について確認します。
今回初めて WAF にアクセスしたので、以下の管理ページが表示されます。
Barracuda のライセンス トークンを入力します。
アプリケーションが配置される DNS ドメイン (contoso.net または、任意のドメイン) を入力します。
[Provision] ボタンをクリックします。
ブラウザーを閉じて、WAF のプロビジョニングが完了するまで数分待ちます。WAF は自動的に再起動して、しばらくすると元に戻ります。
これで、次の手順のアプリケーションの発行を行う準備ができました。
5. アプリケーションの公開
最後に、インターネットから WAF 経由でアプリケーションにつながるリンクを作成します。
5.1 WAF 仮想サービスを作成する
ブラウザーを開いて、手順 3 のステップと同様に、WAF 管理ページに移動します。
今回はログイン ページが表示されるため、ここに Barracuda の既定の管理ユーザー名を入力します。
管理ユーザー用の既定のパスワードを入力します。
[Login] ボタンをクリックします。
WAF 管理ポータルにログインし、[BASIC] タブをクリックします。
リボンで [Services] をクリックします。
WAF サービスと、仮想サービスを追加するセクションをリストしたページが表示されます。WAF サービスは、WAF に入ってくるトラフィックと PaaS アプリケーション間のリンクです。PaaS アプリケーションは内部エンドポイント付きで作成されているため、インターネットからファイアウォールで遮断されています。
[Service Name] テキスト ボックスに仮想サービスの名前を入力します。
[Virtual IP Address] テキスト ボックスに WAF の IP アドレスを入力します。WAF は Subnet-1 (WAF サブネット) の最初のデバイスなので、「172.16.1.4」というアドレスになります。Azure のアドレスは DHCP アドレスですが、所定のサブネット内で Azure が提供する最初のアドレスは常にネットワーク範囲の最初から 4 番目のアドレスです。
[Port] テキスト ボックスに「81」と入力します。
[Real Servers] テキスト ボックスに最初の PaaS ロール サーバーの IP アドレスを入力します。このアドレスは「172.16.2.4」になります (Subnet-2 (アプリケーション サブネット) の最初のサーバーであるため)。
[Add] ボタンをクリックします。
ここまでの手順で、WAF に仮想サービスを作成しました。仮想サービスは WAF にポート 81 でインターネットから入ってくるトラフィックを調査し、ポリシーと照合し、これが準拠していればそのトラフィックをポート 80 のバックエンド PaaS アプリケーション サーバーに渡します。ここではポート 81 を選択しましたが、これは、アプリケーションが公開されるものと同じポートを選択する必要がないことを示すためです。仮想サービス用にポート 80 を選ぶこともできますので、ご自身でお試しください。
サービス ページは、以下のようになります。
5.2 WAF 仮想サービスをインターネットに公開する
次に、インターネットから WAF へのトラフィックを許可するように、Azure に通知する必要があります。これには、ポート 81 を WAF クラウド サービスのエンドポイントに追加します。
Azure 管理ポータルで、左側のウィンドウにある [VIRTUAL MACHINES] をクリックします。
WAF 仮想マシン名をクリックします。
ページ上部中央の [ENDPOINTS] をクリックします。
ページ下部中央の [ADD] ボタンをクリックします。
[Add a Stand-Alone Endpoint] を選択します。
[Next] 矢印をクリックします。
[Name] テキスト ボックスに、エンドポイントの名前を入力します。
プロトコルとして「TCP」を選択します。
パブリック ポートを「81」に設定します。
プライベート ポートを「81」に設定します。
チェック マーク ボタンをクリックして、エンドポイントを追加します。
これで、エンドポイントのリストは以下のようになるはずです。これらは、インターネットから WAF 仮想マシンへの通信を Azure が許可するポートです。
この時点で、WAF IaaS マシンをホストするクラウド サービスに付けた DNS 名を使用して、アプリケーションにアクセスすることが可能になっているはすです。このデモでは omtaDemoWAF を使用したので、URL は https://omtaDemoWAF.cloudapp.net:81/default.aspx になります。
これで設定は完了です。
6. 負荷分散とフォールトトレランス
ここまでの手順では、操作の基本を学習しました。次に、フォールト トレラントと負荷分散を実現するシステムを作成するステップに進みます。Barracuda 仮想デバイスをクラスター化して、セクション 5.1 で作成した WAF サービスに複数の PaaS ロールを配置することができます。
この記事の執筆時点では、仮想デバイスのクラスター化に関する資料はリリースされていませんが、物理デバイスの場合に関する情報は、https://techlib.barracuda.com/display/BWAFV76/How+to+Set+Up+a+High+Availability+Environment+with+Two+Barracuda+Web+Application+Firewalls (英語) からご確認いただけます。
この情報のうち、LAN、MGMT、ブリッジ モードに関する記述は無視してください (LAN と MGMT インターフェイスは、仮想デバイス上では同一です)。
セットアップが完了したら、システム間の構成は、複数の WAF ノードのアクティブ/アクティブ クラスターで同期することができます。クラスター内の 1 つのデバイスに加えられた構成の変更は、その構成クラスター内の他の全デバイスに伝達されます。
以下の設定は、クラスター化された WAF 間では伝達されません。クラスター化の時点であらかじめ設定が済んでいない場合は、クラスター内の各 WAF でこれらを手動で構成する必要があります。
- WAN IP アドレス/ネットマスク/ゲートウェイ
- システム DNS サーバー
- システムのホスト名
- クラスターの共有シークレット
- システムのタイム ゾーン
- システム IP/パスワード/シリアル
- HTTP/HTTPS ポート (全マシン上で同じ値にしなければなりません)
- HTTPS 証明書/設定
- アピアランス名、ロゴ、または URL
- リンク監視設定
- リモート サポート オプション
- NIC 速度/二重化設定
PaaS ロールに関しては、セクション 5.1 で最初の PaaS ロールを WAF サービスに追加したのと同じ要領で、他のロールも追加することができます。WAF は REST API を有しているため、このプロセスは自動化できます。PaaS ロールの OnStart メソッドに、起動時にそのロールを WAF サービスに追加するコードを記述することができます。今回の設定では、WAF が特定のサブネットに配置され、また、Azure は常にサブネットのアドレス範囲の 4 番目の IP を最初のデバイスに割り当てるため (この説明では最初の WAF に常に 172.10.1.4 が割り当てられます)、PaaS ロールが最初の WAF を検出して、自らを既知の WAF サービスに追加するように、構成設定を PaaS ロールに追加することができます。
反対に、PaaS ロールの OnStop メソッドに、ロールの終了時に WAF サービスからそのロールを削除するコードを記述することもできます。
説明は以上で終了です。この情報が、皆様のデータ保護とビジネスの拡大に少しでも役立つことを願っています。