Azure上にBarracuda CloudGen WAFをHA構成で構築(WAF設定編)

2019年7月16日

はじめに

前回のポストでAzure上にHA構成でBarracuda CloudGen WAFの仮想マシンを2台構築しましたが、本エントリではWAF内のHA設定とSSLオフロードによるWebサーバへのアクセス設定を試した結果を記します。

「Azureインフラ編」はこちらです。

ライセンスの投入

※本作業はWAFサーバ2台に対して実施します

WAFのライセンス初期画面にて「I Already Have a License Token」をクリックします。

貰った試用版ライセンスのトークンを入力して、「Provision」をクリックします。

暫く待つとログイン画面が出ますので、ユーザ名は「admin」で。パスワードはWAFの仮想マシン作成時に指定したパスワードを入力して、「ログイン」をクリックします。

初回のみファーストステップの設定を行うか聞いてきますが、今回はウイザードは使わずに全部1から設定するので「Do it later」をクリックします。

使用許諾の画面が出ますので、下部にある「Name」「Email Address」を入力して「Accept」をクリックします。

初期設定

※本作業はWAFサーバ2台に対して実施します

「基本設定」→「IP設定」画面から、デフォルトホスト名にVM名、デフォルトドメイン名は何でも良さそうですが、自身が持っていればそのドメイン名を入力して、最後に「保存」をクリックします。

「基本設定」→「管理」画面から、「システム連絡先メールアドレス」に自身の連絡がつくメールアドレスを入力して、最後に「保存」をクリックします。

同じく「基本設定」→「管理」画面から「タイムゾーン」を「アジア: Japan – Tokyo」を選択します。

こちらを選択すると、システムの再起動を行う旨メッセージが表示されますので、「OK」をクリックします。その後の再起動完了までには少し時間がかかるので待ちます。

これでひとまずダッシュボード画面に色々と未設定の旨のメッセージが表示されなくなり、ログ情報も日本時間で表示されるので後からの設定・確認がはかどりますね。

HAクラスタの登録

※本作業はWAFサーバ2台に対して実施します

先ずは2台のWAFそれぞれ、「高度な設定」→「HA(高可用性)」画面から、「クラスタ共有秘密鍵」に同じ文字列を設定して、「保存」をクリックします。

2台とも設定が終わったら、同じ画面から「ピアIPアドレス」に対抗VMのプライベートIPアドレスを入力して「クラスタに参加」をクリックします。

以下の警告画面が出るので「OK」をクリックします。

両系で上記操作を行うと、クラスタシステムのステータスが両方共「Up」となります。

この状態でHA構成は設定完了です。WAFサーバの片方にルールの追加等を行うと、自動的にもう片方にも設定が反映されるので、その後の作業は任意の片方のWAFサーバにのみ実施していきます。

テスト用Webサーバの作成(2台)

WAFとは別のサブネットにUbuntuサーバを2台立てて、nginxをインストールします。

構成としては以下の感じを予定しているので、InternalサブネットにVMを2台立てます。

VMを立てる手順は前回のポストで作成した仮想ネットワークに新規にInternalサブネットを作成して、そこにVMを2台立てるだけなので、Azureポータルで操作しても良いのですが、Azure CLIのスクリプトを書いたので以下に示します。

#!/bin/sh
# common
rgname=Barracuda-Waf-rg
location=japaneast
# vnet
vnet_name=cuda-vnet
# vnet
vnet_subnet_name=private-subnet
vnet_subnet_cidr=192.168.64.32/27
# nsg
nsg_name=private-nsg
# web vm
vm_name1=linuxwebvm01
vm_ipaddress1=192.168.64.36
vm_name2=linuxwebvm02
vm_ipaddress2=192.168.64.37
vm_size=Standard_D1_v2
linuximage=UbuntuLTS
vm_id=azureuser
vm_password=********* (任意のパスワードに変更)
az network vnet subnet create \
    --name $vnet_subnet_name \
    --resource-group $rgname \
    --vnet-name $vnet_name \
    --address-prefixes $vnet_subnet_cidr
az network nsg create \
    --name $nsg_name \
    --resource-group $rgname \
    --location $location
az network nsg rule create \
    --nsg-name $nsg_name \
    --resource-group $rgname \
    --name allow-ssh \
    --access allow \
    --protocol Tcp \
    --direction Inbound \
    --priority 1000 \
    --source-address-prefix Internet \
    --source-port-range "*" \
    --destination-address-prefix "*" \
    --destination-port-range 22
az network vnet subnet update \
    --resource-group $rgname \
    --vnet-name $vnet_name \
    --name $vnet_subnet_name \
    --network-security-group $nsg_name
function create_vm {
    az network public-ip create \
        --name ${1}-pip \
        --resource-group $rgname \
        --location $location \
        --allocation-method static
    az network nic create \
        --name ${1}-nic \
        --resource-group $rgname \
        --vnet-name $vnet_name \
        --subnet $vnet_subnet_name \
        --private-ip-address $2 \
        --public-ip-address ${1}-pip
    az vm create \
        --name $1 \
        --resource-group $rgname \
        --location $location \
        --image $linuximage \
        --size $vm_size \
        --nics ${1}-nic \
        --admin-username $vm_id \
        --admin-password $vm_password
}
create_vm $vm_name1 $vm_ipaddress1
create_vm $vm_name2 $vm_ipaddress2

2台のVMが作成できたら、sshでログインして、以下のコマンドでnginxをインストールしておきます。

$ sudo apt install nginx -y

これで、それぞれのVMでTCP/80で通信が行えるようになりました。

DNSレコードの登録

httpのみの接続であれば、独自ドメインは不要なのですが、今回はhttps接続も試すのでDNSにAzure Load BalancerのPublic IP AddressをDNSレコードに登録します。

私は独自ドメイン「nya-n.net」を所有しておりまずので、今回は「waftest.nya-n.net」を登録します。

ドメインのレコード管理にはAzure DNSを例に説明しますが、別に他のネームサーバを利用していても大丈夫です。

こちらの説明は簡単にしますが、Azureポータルから作成したexternal-lb-ipリソースのIPアドレスを控えます。

Azure DNSにてAレコードに先に控えたIPアドレスをAレコードとして登録します。

これで、「waftest.nya-n.net」でAzure Load Balancer(その先にはWAFサーバ、Webサーバ)にアクセス可能になりますね。

http(TCP/80)によるWAF経由のアクセス

それでは、WAFの設定に戻りましょう。まずはhttp(TCP/80)によるWAF経由でのWebサーバアクセスです。

任意のWAFサーバの管理画面から「基本設定」→「サービス」を開き、サービス名に「service-http」、タイプを「HTTP」、ポートを「80」、実サーバはWebサーバの1台目のIPアドレスを入力して、「追加」をクリックします。

Services欄に登録した1台目のWebサーバが表示されるので、画面右の「Server」をクリックして、2台目を追加します。

サーバ名は適当に、IPアドレスには2台目のWebサーバのIPアドレスを入力します。ポートは「80」、最後に「保存」をクリックします。

無事2台目のWebサーバも追加されました。

後は任意のブラウザで「http://waftest.nya-n.net」にアクセスします。

WAFからWebサーバへのアクセスはデフォルトではラウンドロビン方式になるため、ブラウザでリロードを繰り返すと2回に1回それぞれのWebサーバにアクセスがされているようでした。

以下は1台目のWebサーバのnginxのアクセスログです。

https(TCP/443)によるWAF経由のアクセス

Barracuda WAFには当然ですが、SSLオフロード機能もありますので、試します。

フロントではhttpsで受けて、内側のWebサーバにはhttpで送る方式です。

まずはSSL証明書をインポートします。私はnya-n.netのワイルドカード証明書を所有しているので今回はこれを使います。

Let’s Encryptの証明書取得機能もWAFに備わっていますので、そちらを利用する方は以下のエントリを参考にしてください。

Let’s Encryptの証明書取得機能もWAFに備わっていますので、そちらを利用する方は以下のエントリを参考にしてください。

「基本設定」→「証明書」画面を開きます。

証明書のアップロードの為の必要な設定を入力します。こちらは所有している証明書のタイプによって異なるため詳細は割愛します。
最後に「今すぐアップロード」をクリックします。

無事登録されました。

「基本設定」→「サービス」画面にて、サービス名に「service-https」、タイプに「HTTPS」、ポートに「443」、実サーバ はWebサーバの1台目のIPアドレスを入力して、「追加」をクリックします。 はWebサーバの1台目のIPアドレスを入力して、「追加」をクリックします。

無事追加されました。受付ポートは443ですが、バックエンドのWebサーバは80で接続する設定になっていることを確認します。
続いて2台目のWebサーバを登録するために「Server」をクリックします。

サーバ名は適当に、IPアドレスには2台目のWebサーバのIPアドレスを入力します。ポートは「80」、最後に「保存」をクリックします。

無事2台目の追加されました。

任意のブラウザで「https://waftest.nya-n.net」にアクセスします。
ちゃんと表示されて、SSL証明書の内容も正常です。

WAFの防御の確認

SQLインジェクションなどを仕向けて、WAFの防御確認を行おうと考えていましたが、これまでの検証を進めている間に、既にあちこちからアタックされていました。

まだ1日そこらしか動かしていませんが、まあお察しの通りですかね。
しばらく放置して様子を見てみます。

HA確認

まずはWebサーバの片方を停止しましたが、当たり前ですがWAFのバックエンドから自動的に外されてブラウズはアクティブなWebサーバだけで継続します。

WAFサーバの片方を停止させても、今度はAzure Load BalancerのバックエンドからWAFが外されるのでこちらもサービス継続できます。

おわりに

WAFサーバとWebサーバ共に冗長構成とすることで、多重障害にも耐えられるWebシステムがIaaSだけで構成できることが確認できました。

WebサーバをApp ServiceでPaaS化したり、WAF側もAzureのZone冗長構成を組むことで更に高いSLAを確保できるでしょう。

AzureにもApplication GatewayにWAF機能があるため、用途によってはそちらで十分なケースも多いと思いますが、本格的なWAFを利用する場合の選択肢の一つとしてBarracuda CloudGen WAFも有効なのではと思います。

「Azureインフラ編」はこちらです。