Azureで構築できるWAFについて

この記事はMisoca+弥生+ALTOA Advent Calendar 2018の17日目のエントリーになります。

こんにちは、弥生のつじのです。
普段は弥生のインフラ環境の構築・運用などを主に担当しています。
今回は私が普段担当する事が多いMicrosoft Azureに上にApplicatonGatewayを作成しWebApplicationFirewallとして使用する方法を紹介します。

はじめに


今回使用するMicrosoft Azureとそこに作成するApplicatonGatewayについて軽くご紹介します。

Microsoft Azure
azure.microsoft.com その名の通りMicrosoftが提供しているクラウド環境です。
他には有名ところですと、AmazonのAWS、GoogleのGCPなどがありますね。
Microsoft Azureに限らず、Webブラウザ上から数クリックと必要な情報を入力することで、仮想マシンやDBなどを作成できる素晴らしい環境です。

ApplicatonGateway
Azure Application Gateway のドキュメント - チュートリアル、API リファレンス | Microsoft Docs
Microsoft Azure内に作成可能なWebトラフィックロードバランサーです。
今回はこの製品が持つWAF機能を使用します。


作業環境と構築環境


今回はApplicatonGatewayを使用したWAFを構築するにあたり以下のような環境を作成します。

f:id:ym_AdventC:20181217072114p:plain
No_17_001_構成概要
インターネットからWAFを通過した先のWebページは今回簡単なWebAppsを構築し使用します。
そのため以下環境で作業していますので参考までに。
Windows 7
Visual Studio 2015

WebAppsの構築


Visual Studio 2015上からWebのテンプレートのプロジェクトを作成し、MVCのテンプレートを初期状態のままデプロイ。
とりあえず作業環境から作成環境にアクセスし、アクセスできるか確認。

f:id:ym_AdventC:20181217073913p:plain
No_17_002_初回デプロイアクセス確認

なにもないサイトを公開しておいてもしょうがないので、アクセスできること確認したらWebAppsは停止しておきましょう。

ApplicationGatewayの構築


今回はAzurePortalとPowershellを使用してApplicationGatewayのリソースを作成していきたいと思います。
そこでまずPowershellで以下コマンドを実行します。
最初のログインで使用するアカウントはWebAppsを作成したアカウントと同じです。

#Microsoft Azureに接続
#接続先は先程WebAppsを作成したアカウント
Connect-AzureRmAccount

#共通処理(仮想ネットワーク作成処理)
#ResourceGroupNameはWebappsを作成した際に新規作成したものを使用
$gwSubnet = New-AzureRmVirtualNetworkSubnetConfig -Name appgwsubnet -AddressPrefix 10.200.0.0/24
$nicSubnet = New-AzureRmVirtualNetworkSubnetConfig  -Name appsubnet -AddressPrefix 10.200.2.0/24
$vnet = New-AzureRmvirtualNetwork -Name AdventCalendar-WAF-vnet -ResourceGroupName AdventCalendar2018No17 -Location japaneast -AddressPrefix 10.200.0.0/16 -Subnet $gwSubnet, $nicSubnet

$vnet = Get-AzureRmvirtualNetwork -Name AdventCalendar-WAF-vnet -ResourceGroupName AdventCalendar2018No17
$gwSubnet = Get-AzureRmVirtualNetworkSubnetConfig -Name appgwsubnet -VirtualNetwork $vnet
$nicSubnet = Get-AzureRmVirtualNetworkSubnetConfig -Name appsubnet -VirtualNetwork $vnet

#GIPを作成
$publicip = New-AzureRmPublicIpAddress -ResourceGroupName AdventCalendar2018No17 -Name AdventCalendar-WAF-GIP -Location japaneast -AllocationMethod Dynamic

#ApplicationGatewayオブジェクト構成処理
$gipconfig = New-AzureRmApplicationGatewayIPConfiguration -Name gwconfig -Subnet $gwSubnet
$fipconfig = New-AzureRmApplicationGatewayFrontendIPConfig -Name fip01 -PublicIPAddress $publicip

#先程作成したWebAppsのFQDNをApplicationGatewayのバックエンドに設定
$pool = New-AzureRmApplicationGatewayBackendAddressPool -Name pool01 -BackendFqdns adventcalendar2018no1720181216010319.azurewebsites.net
$fp = New-AzureRmApplicationGatewayFrontendPort -Name port01 -Port 80
$Weblistener = New-AzureRmApplicationGatewayHttpListener -Name WebListener -Protocol Http -FrontendIPConfiguration $fipconfig -FrontendPort $fp
$poolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name httpssetting01 -Port 80 -Protocol Http -CookieBasedAffinity Enabled

$rule = New-AzureRmApplicationGatewayRequestRoutingRule -Name httprule01 -RuleType basic -BackendHttpSettings $poolSetting -HttpListener $Weblistener -BackendAddressPool $pool

#ApplicationGatewayのWAF設定
$sku = New-AzureRmApplicationGatewaySku -Name WAF_Medium -Tier WAF -Capacity 2
$SSLPolicy = New-AzureRmApplicationGatewaySSLPolicy -PolicyType Custom -MinProtocolVersion TLSv1_2 -CipherSuite "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256"

#ApplicationGatewayの作成
$appgw = New-AzureRmApplicationGateway -Name AdventCalendar-WAF -ResourceGroupName AdventCalendar2018No17 -Location japaneast -BackendAddressPools $pool -BackendHttpSettingsCollection $poolSetting -FrontendIpConfigurations $fipconfig -GatewayIpConfigurations $gipconfig -FrontendPorts $fp -HttpListeners $Weblistener -RequestRoutingRules $rule -Sku $sku


コマンドが完了したらAzurePortalからApplicationGatewayのリソースが作成されていることを確認しましょう。
この時概要画面でレベルがWAFになっている事が確認ポイントですね。

f:id:ym_AdventC:20181217072939p:plain
No_17_003_WAF作成状況確認
次にHTTP設定メニューを開きます。
今回はバックエンドがWebAppsなので、AppServiceで使用するのチェックを入れて保存。
Webアプリケーションファイアウォールメニューを開き、以下のように設定して保存。
f:id:ym_AdventC:20181217073420p:plain
No_17_004_WAF設定値


動作確認

まず作業環境からAzurePortal上から作成したWebAppsを起動します。
そしてApplicationGatewayの概要画面にあるエンドポイントへブラウザでアクセスし、WebAppsを作成した時に表示された画面が表示される事を確認します。

f:id:ym_AdventC:20181217072427p:plain
No_17_005_ApplicationGateway動作確認

次にWAFが正常に動作していることの確認です。
まず作業環境からApplicationGatewayの概要画面にあるエンドポイントへブラウザでアクセスする際に、以下のようにURLを編集します。
http://【ApplicationGatewayのGIP】/?<script>waf-test</script>
そしてアクセスした際にしっかり弾かれることを確認します。
f:id:ym_AdventC:20181217081820p:plain
No_17_006_WAF動作確認
成功!

}}
{ "resourceId": "/SUBSCRIPTIONS/0894E320-7EB0-4651-B201-3F3A13784A1D/RESOURCEGROUPS/ADVENTCALENDAR2018NO17/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/ADVENTCALENDAR-WAF", "operationName": "ApplicationGatewayFirewall", "time": "2018-12-16T22:53:55.5371505Z", "category": "ApplicationGatewayFirewallLog", "properties": {
  "instanceId": "ApplicationGatewayRole_IN_1",
  "clientIp": "XXX.XXX.XXX.XXX",
  "clientPort": "0",
  "requestUri": "/?%3Cscript%3Ewaf-test%3C/script%3E",
  "ruleSetType": "OWASP",
  "ruleSetVersion": "2.2.9",
  "ruleId": "960017",
  "message": "Host header is a numeric IP address",
  "action": "Blocked",
  "site": "Global",
  "details": {
    "message": "Access denied with code 403 (phase 2). Pattern match \"^[\\\\d.:]+$\" at REQUEST_HEADERS:Host.",
    "data": "13.78.26.85",
    "file": "base_rules/modsecurity_crs_21_protocol_anomalies.conf",
    "line": "98"
  },
  "hostname": "13.78.26.85"
}}

※clientIpの内容は編集しています。
診断ログにもアクセスがブロックされたと残っています。

最後に

今回はMicrosoft Azure上にある製品を使用し、WAFを作成しました。
はじめにでも記載しましたが、クラウド環境が普及し環境構築は非常に短時間で可能となりました。
しかし環境構築とセキュリティ対策は切っても切れない関係ですので、たとえ構築期間が短くなってもしっかりと対策をしていきたいですね。

次回の内容は@yayoi_shiraiさんのslackのログ分析です。