Barracuda WAFのAutoScalingを試してみた

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

はじめに

こんにちは。
くコ:彡がトレードマークの阿部です。

Barracuda WAF(Web Application Firewall)は、AWS上でバーチャルアプライアンス型のWAFとして利用出来ます。
EC2インスタンスとして動作するため、ユーザーの自由が効きますが、冗長化やスケーリングは考慮する必要があります。
Barracuda社では、AutoScalingに対応したCloudFormationテンプレートを公開しています。
ユーザーの負担を減らす素晴らしいアイディアですね。
実際に試してみましたので、ご紹介します。

概要

CloudFormationで作成される環境を確認しましょう。
WAFインスタンスはELB配下に配置されます。AutoScaligを利用し負荷に応じてインスタンスが増減します。
負荷が少ない場合、インスタンスは減少し、負荷が高くなると、インスタンスは増加します。

全体構成図

事前準備

Barracuda社のテンプレートで環境を作る際に、ELBの名前や保護対象のDNS名を入力する必要があります。
そのため、事前にVPC、ELB、WebServerインスタンスを作成しておきます。

構成図

すぐに試せるように、CloudFormationテンプレート(webserver-template.template)を作成しておきました。
以降の説明はwebserver-template.templateの利用を前提にすすめます。

パラメーターを以下のように入力すると、VPC,ELB,EC2がプロビジョニングされます。
検証ではAmazon Linuxを指定しhttpdをインストールの上、index.htmlを配置しました。

  • webserver-template.templateのパラメーター
EC2KeyName WebServerのキーペア
WebServerImageId WebServerのAMI ID
MaintenanceIP WebServerにSSH出来る接続元IPアドレス(xx.xx.xx.xx/xxの形式で指定)

CloudFormationテンプレートからのデプロイ

手順は、Importing the Barracuda Web Application Firewall CloudFormation Template and Deploying the Instanceにて公開されています。
詳しい手順はリンク先に任せるとして、ポイントをご紹介します。

aws marketplaceからの起動

aws marketplaceにアクセスし、[Barracuda Web Application Firewall]を選択します。

1


TokyoリージョンとDelivery Methods[Barracuda Web Application Firewall]を選択し、Continueを選択します。

2


初回は[Accept Sosfware Terms]の選択が必要です。
[Custom Launch]を選択し、以下のように入力します。

項目 入力値
Select a Version 最新のバージョン
Select a Region Asia Pacific(Tokyo)
Deployment Options Deployment Options
Software Pricing Hourly

入力後、[Launch with CloudFormation Console]を選択します。
Stackの作成画面に移ります。
パラメーターに以下のように入力し、Stack(=CloudFormationで管理される環境)を作成しました。

Parameter 入力内容 備考
[Specify Details]
Stack name AWSMPBarracudaWebApplicationFirewall スタック名の指定。デフォルト値で問題ありません
[Networking Configuration]
Availability Zone(s) ap-northeast1a、ap-northeast-1c WAFをデプロイするAZ
Subnet Id(s) WAF1a、WAF1c WAFをデプロイするサブネット
Elastic Load Balancer ELBWAF WAFクラスターにトラフィックを分配するELBの名前
Auto scaling Configuration
Instance Type m3.medium WAFのインスタンスタイプ
Minimum Instances 1 最小のWAF数 (AutoScalingの最小インスタンス数)
Maximum Instances 4 最大のWAF数 (AutoScalingの最大インスタンス数)
Notification Email Eメールアドレス SNSにセットされ、通知に利用されます
[Barracuda Web Application Firewall Bootstrapping Configuration]
Service Name WebServer WAF内で使われる任意のサービス名
Service Port 80 WAFが受け付けるサービス用のポート
Server IP/FQDN internal-ELBWebServer-XXXXXXXXX.ap-northeast-1.elb.amazonaws.com 保護対象(WebServerにトラフィックを分配するInternal ELBの名前)
Server Port 80 WAFがInternal ELBに分配するポート

Minimum Instancesは"1"を選択しましょう。
2つのインスタンスが同時に起動した場合に、クラスタリングが動作しない場合があります。
この問題は修正される予定のようです。
Auto Scaling of Barracuda Web Application Firewall using CloudFormation Template on Amazon Web Services - Number of Instances

SNS受信登録の確認

指定したメールアドレス宛に件名:「AWS Notification - Subscription Confirmation」のメールが送信されます。
Confirm subscriptionを選択すると、有効化されます。

デプロイ結果

CloudFormation画面にて、スタックのStatusがCREATE_COMPLETEになれば、成功です。
EC2インスタンスとして、WAFが作成されます。

セキュリティグループの変更(WAF)

WAFインスタンス用のルールを変更します。
WAFインスタンスのセキュリティグループは、AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXXとして作成されます。
デフォルトのルールでは、全ての送信元が0.0.0.0/0に指定されています。
今回は以下のように変更しました。

  • AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXXのルール
タイプ プロトコル ポート範囲 送信元 役割
HTTP TCP 80 0.0.0.0/0 WEBサーバサービスポート
カスタム TCP ルール TCP 8000 拠点IPアドレス Barracuda WAF管理用
カスタム TCP ルール TCP 8002 AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXX クラスタリング
カスタム TCP ルール UTP 32576 AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXX クラスタリング
カスタム UDP ルール UDP 32575 AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXXXX クラスタリング

セキュリティグループの変更(SgWebELB)

WebServerにトラフィックを分配する[ELBWebServer]に割り当てられたセキュリティグループ(SgWebELB)のルールを変更します。
WAFインスタンスからの80番アクセスを許可しましょう。
送信元にWAFインスタンスに割り当てられたセキュリティグループを指定します。
本変更により、WAFを経由しないHTTPアクセスは遮断されます。

  • SgWebELBのルール
タイプ プロトコル ポート範囲 送信元
HTTP TCP 80 AWSMPBarracudaWebApplicationFirewall-BWAFAutoScaleSecurityGroup-XXXX

WAFインスタンスの確認

http://WAFのPublicIP:8000/で管理画面に接続し、「ユーザ名:admin、パスワード:インスタンスID」でログインします。
[サービス]を確認すると、パラメーターに入力した内容が反映されています。
保護対象のELBのIPアドレスが変わったり、スケールした時の挙動は未検証です。

6

WEBブラウザからの接続

WAFにトラフィックを分配するELB(ELBWAF)にアクセスしてみます。
http://elbwaf-XXXXXX.ap-northeast-1.elb.amazonaws.com/に接続すると、Webサーバーに接続出来るはずです。

AutoScaling詳細

CloudFormationで構築されたAutoScalingに関連する内容を整理しましょう。

Auto Scaling グループ

スタック作成時のパラメーター値が反映されています。
最大数などを変更する場合、本内容を変更する事になります。
メールアドレスはSNSに登録され、インスタンスの[起動],[終了],[起動失敗],[終了失敗]の通知に利用されます。

  • AutoScalingグループの主な設定項目
ロードバランサー ELBWAF
最小 1
最大 4
アベイラビリティーゾーン ap-northeast-1c, ap-northeast-1a
サブネット  WAF1a、WAF1c
通知の送信先 AWSMPBarracudaWebApplicationFirewall-NotificationTopic-XXXX (XX.XXX@XXXXXX.XX)

起動設定(Launch Config)

Launch Configもスタック作成時のパラメーター値が反映されている事がわかります。
また、s3にアクセスするためにIAMプロファイルが設定されています。

  • Launch Configの主な設定項目
AMI ami-5eddc530
IAM インスタンスプロファイル
AWSMPBarracudaWebApplicationFirewall-BWAFAutoScalingInstanceProfile-XXXXX
インスタンスタイプ
m3.medium

s3

s3バケットawsmpbarracudawebapplicationfirewall-s3bucket-XXXXXXXXXが作成されていました。
バケットには、WAFインスタンスのIPアドレス、シリアルナンバーを記載したファイルが格納されます。
スケールアウトが発生すると、新しいWAFインスタンスはバケットに接続し既存インスタンスの設定に同期します。
スケールインした場合にはファイルは削除されます。
バケットにファイルが見つからない場合、CloudFormationのパラメーターの内容に同期します。

スケールイン、スケールアウト

CloudWatch画面を確認してみます。
「AWSMPBarracudaWebApplicationFirewall」から始まるアラームが6つ作成されていました。
NetworkIn,NetworkOut,CPUUtilizationの結果を元に、スケールイン、スケールアウトするようになっています。

7

スケールアウト

スケールアウトした時の挙動を確認しましょう。
今回は負荷に応じた自動スケーリングではなく、手動でスケールアウトさせてみました。

手動スケールアウト

手動でスケールアウトしたインスタンスが削除されては、面倒です。
スケールインアクションを削除しておきます。
CloudWatch画面から、アラームを選択し開きます。アクション中の[削除]を選択します。
設定ステータスが[アクションなし]になれば、OKです。

9

WAFインスタンスを4台にスケールアウトしましょう。
AutoScalig Groupの[希望]を4にします。

10

ELBへの組み込み

WAFインスタンスが起動し、自動的にELB配下に組み込まれます。

11

HAへの組み込み

WAFのコンソール画面を確認してみます。。。
[HA(高可用性)]に組み込まれている事がわかります!
スケールアウトした場合でも設定が同期されるため、ユーザー側の操作は不要になります。

12

参考

おわりに

Barracuda社が公開しているCloudFormationを使ってWAFのAutoScaling構成を試してみました。
CloudFormationテンプレートを使う事で、一見複雑に思えるAutoScalingとHA構成をすぐに試す事が出来ました。
AWSでのセキュリティ対策には、AWSとの親和性が高い製品や技術を導入する事が重要だと思います。

では、また。