Azure上にBarracuda CloudGen WAFをHA構成で構築(Azureインフラ編)

2019年7月16日

はじめに

Barracuda CloudGen WAFのBYOLライセンスを2つ借りることが出来ましたので、Azure上にHA構成(冗長化構成)で構築しました。

本エントリは「Azureインフラ編」として、Azure CLIを使った仮想ネットワーク~CloudGen WAFの仮想マシン構築までを記します。

「WAF設定編はこちらです」

Azure構成

今回は以下の構成をAzure CLIで作成します。

VMのイメージはAzure Marketplaceで公開されているBarracuda Cloudgen WAF(BYOL)を使いますが、Azureポータルから作成する場合はManaged Diskが使えなかったり、2台構成で作成するのに細かい所に手が届かなかったのでAzure CLIでスクリプト書きました。

本来であればAzure Resource Manager Template(json)で作成するのが良いのですが、ちょっと面倒だったのでスクリプトで。

Barracudaが公開しているGithubのページにAzure Resource Manager Templateのサンプルがありますので、こちらをベースにカスタマイズするのも手かと思います。

https://github.com/barracudanetworks/waf-azure-templates

スクリプトの実行

作成したスクリプトをただ単に流すのも良いのですが、一応ブロック毎に説明します。

環境変数の設定

Azureにて構築する各種リソースの名前やネットワークアドレス等を設定します。

#!/bin/bash
# common
rgname=Barracuda-Waf-rg
location=japaneast
# vnet
vnet_name=cuda-vnet
vnet_cidr=192.168.64.0/24
vnet_subnet_name=dmz-subnet
vnet_subnet_cidr=192.168.64.0/27
# nsg
nsg_name=dmz-nsg
# waf vm
vm_name1=cudawafvm01
vm_name2=cudawafvm02
vm_ipaddress1=192.168.64.4
vm_ipaddress2=192.168.64.5
vm_size=Standard_D1_v2
wafimage=barracudanetworks:waf:byol:latest
vm_id=azureuser
vm_password=********* (任意のパスワードに変更)
avset=cudawaf-avset
# Load Balancer
lb_name=external-lb
lb_frontend=lbfront
lb_backend=lbbackend
lb_probe=lbprobe
lb_rule=lbrule

関数の準備

WAFの仮想マシンと、ロードバランサのバックエンドプールの追加は2台に対して行うため、効率よく関数化しました。

#
# Functions
#
function create_waf {
    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 $wafimage \
        --size $vm_size \
        --nics ${1}-nic \
        --availability-set $avset \
        --admin-username $vm_id \
        --admin-password $vm_password
}
function add_lb_backend
{
    az network nic ip-config update \
        --nic-name ${1}-nic \
        --resource-group $rgname \
        --name ipconfig1 \
        --lb-name $lb_name \
        --lb-address-pools $lb_backend
}

リソースグループ作成

以下のコマンドでAzureのリソースグループを作成します。

#
# create resource group
#
az group create --name $rgname --location $location

仮想ネットワークの作成

以下のコマンドで仮想ネットワークを作成します。

#
# create vnet
#
az network vnet create \
    --name $vnet_name \
    --resource-group $rgname \
    --location $location \
    --address-prefixes $vnet_cidr \
    --subnet-name $vnet_subnet_name \
    --subnet-prefixes $vnet_subnet_cidr

NSGの作成と適用

以下のコマンドでNetwork Security groupを作成して、ルールとしてInternetからTCP/8000, TCP/8433, TCP/443 を許可します。

最後に仮想ネットワークのdmzサブネットにこのNSGを適用します。

#
# create nsg
#
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 http-mgmt \
    --access allow \
    --protocol Tcp \
    --direction Inbound \
    --priority 1010 \
    --source-address-prefix Internet \
    --source-port-range "*" \
    --destination-address-prefix "*" \
    --destination-port-range 8000
az network nsg rule create \
    --nsg-name $nsg_name \
    --resource-group $rgname \
    --name https \
    --access allow \
    --protocol Tcp \
    --direction Inbound \
    --priority 1020 \
    --source-address-prefix Internet \
    --source-port-range "*" \
    --destination-address-prefix "*" \
    --destination-port-range "443,80"
az network nsg rule create \
    --nsg-name $nsg_name \
    --resource-group $rgname \
    --name https-mgmt \
    --access allow \
    --protocol Tcp \
    --direction Inbound \
    --priority 1030 \
    --source-address-prefix Internet \
    --source-port-range "*" \
    --destination-address-prefix "*" \
    --destination-port-range 8443
az network vnet subnet update \
    --resource-group $rgname \
    --vnet-name $vnet_name \
    --name $vnet_subnet_name \
    --network-security-group $nsg_name

Load Balancerの作成

以下のコマンドでLoad Balancerを作成して、フロントエンド、正常性プローブ、負荷分散ルールを設定します。

正常性プローブも負荷分散ルールもTCP/80, TCP/443どちらも分散させる設定にしましたが、お好みで。

#
# Load Balancer
# 
az network public-ip create \
    --name ${lb_name}-pip \
    --resource-group $rgname \
    --location $location \
    --allocation-method static
az network lb create \
    --name $lb_name \
    --resource-group $rgname \
    --location $location \
    --sku Basic \
    --public-ip-address ${lb_name}-pip \
    --frontend-ip-name $lb_frontend \
    --backend-pool-name $lb_backend 
az network lb probe create \
    --name ${lb_probe}-https \
    --resource-group $rgname \
    --lb-name $lb_name \
    --protocol Tcp \
    --port 443 \
    --interval 5 \
    --threshold 2
az network lb probe create \
    --name ${lb_probe}-http \
    --resource-group $rgname \
    --lb-name $lb_name \
    --protocol Tcp \
    --port 80 \
    --interval 5 \
    --threshold 2
az network lb rule create \
    --lb-name $lb_name \
    --resource-group $rgname \
    --name ${lb_rule}-https \
    --frontend-ip-name $lb_frontend \
    --frontend-port 443 \
    --protocol Tcp \
    --backend-port 443 \
    --backend-pool-name $lb_backend \
    --probe-name ${lb_probe}-https
az network lb rule create \
    --lb-name $lb_name \
    --resource-group $rgname \
    --name ${lb_rule}-http \
    --frontend-ip-name $lb_frontend \
    --frontend-port 80 \
    --protocol Tcp \
    --backend-port 80 \
    --backend-pool-name $lb_backend \
    --probe-name ${lb_probe}-http

可用性セットの作成

以下のコマンドでWAF仮想マシン用の可用性セットを作成します。

#
# availability set
#
az vm availability-set create \
    --name $avset \
    --resource-group $rgname \
    --location $location

プログラムからのデプロイを許可

通常Azure MarketplaceのサードパーティーのイメージはAzureポータルから実施する際に利用承諾のチェックを行う必要があります。

これをプログラム(Azure CLIやPowershellなど)から自動でデプロイさせる場合には、以下の様に事前にAzureサブスクリプションに対してデプロイを有効にしておく必要があります。

#
# Virtual Machine
#
# Allow program deploy to Barracuda WAF
az vm image accept-terms --publish barracudanetworks --offer waf --plan byol

Azureポータルから「サブスクリプション」にて「プログラムによるデプロイ」を開くと、以下のようにBarracuda CloudGen WAF – BYOLが有効化されました。

WAF仮想マシンのデプロイとLoad Balancerのバックエンドに追加

以下のコマンドを実行します。
先に定義した関数が実行されて、仮想マシン2台とLoad BalancerのバックエンドプールにプライマリNICが設定されます。

# VM01
create_waf $vm_name1 $vm_ipaddress1
add_lb_backend $vm_name1
# VM02
create_waf $vm_name2 $vm_ipaddress2
add_lb_backend $vm_name2

WAFの管理画面への接続

無事前述のスクリプトが最後まで実行されると、Azureポータルからも以下のように指定リソースグループ内に各種リソースが作成されていることが確認できます。

とりあえず、1台目のWAF仮想マシンのPublic IP Addressを確認します。

新しいブラウザのタブを開き、http://(Public IP Address):8000/ に接続します。

初回起動時に表示される「Licensing」画面が表示されればひとまずAzure基盤側の構築は完了です。2台目のWAF仮想マシンも同様に確認します。

おわりに

本エントリはここまでです。
次回は引き続き以下の事を試す予定です。

  • ライセンスの投入
  • 2台のWAF仮想マシンのHA設定(WAF内の設定から)
  • テスト用Webサーバの作成
  • SSL証明書のWAFへの設定とWebサーバへのSSLオフロード設定
  • クライアントPCからの(WAF経由による)Webサーバ接続確認

「WAF設定編」はこちらです。