1. はじめに
1-1 ご挨拶
初めまして、井村と申します。
インターネット経由からの通信について、指定したIPアドレスを制限したい。
上記要望が案件にて発生したため、Azureの「Application Gateway」および「Azure Web アプリケーション ファイアウォール (WAF) ポリシー」を用いて検証を実施。
構築はAzureCloudShellのPowerShellを利用します。
1-2 対象読者
- Azureに興味がある
- AzurePowerShellに興味がある
- 「Application Gateway」および「WAFポリシー」を触ったことある
1-3 成果物
成果物は以下になります。
- 「WAFポリシー」:今回は指定したIPアドレスを制限する設定を行うため必要となるサービス(他にも多数の機能あり)
- 「Application Gateway」:L7ロードバランサー。「WAFポリシー」をこのサービスに紐づける。
- 「Virtaul Machine」:検証用としてIISをインストールして利用する。
※その他、上記を構成するうえで必要なパブリックIPアドレス、仮想ネットワーク、NSG等も作成しています。

※事前にAzureアカウントは作成済みです。
1-4 検証内容
- 成果物を作成後、クライアント端末のWEBブラウザに「Application Gateway」のパブリックIPアドレスを入力し、IISが表示されることを確認する。
- 「WAFポリシー」のカスタムルールを作成する。内容としてはクライアント端末のIPアドレスをブロックする。
- 再度、クライアント端末のWEBブラウザに「Application Gateway」のパブリックIPアドレスを入力し、IISが表示されないことを確認する。
2. 構築
それでは、PowerShellで作成します。仮想マシンを作成するまで記載します。
2-1 仮想マシンの作成およびIIS表示確認
# 変数の設定 ====================================================================
$rgname = "waf-rg" # リソースグループ名
$location = "japaneast" # ロケーション
$appgwName = "waf-agw" # アプリケーションゲートウェイ名
$wafPolicy = 'waf-waf' # WAFポリシー名
$wafPolicyCustomRules = 'ToLimitIPAddress' # WAFポリシーのカスタムルール名
$vnetName = 'waf-vnet' # 仮想ネットワーク名
$snetName1 = 'waf-snet-agw' # アプリケーションゲートウェイ用サブネット名
$snetName2 = 'waf-snet-backend' # バックエンド用サブネット名
$VnetPrefixes = '10.0.0.0/16' # VNetのIPアドレス プレフィックス
$SnetPrefixes1 = '10.0.0.0/24' # アプリケーションゲートウェイ用サブネットのIPアドレス プレフィックス
$SnetPrefixes2 = '10.0.1.0/24' # バックエンド用サブネットのIPアドレス プレフィックス
$vmName = 'waf-vm' # 仮想マシン名
$nsg = 'waf-nsg' # ネットワークセキュリティグループ名
$vmPip = 'waf-pip-vm' # 仮想マシン用パブリックIPアドレス名
$vmPip = 'waf-pip-vm' # 仮想マシン用パブリックIPアドレス名
$appgwPip = "waf-pip-agw" # アプリケーションゲートウェイ用パブリックIPアドレス名
# ==============================================================================
# 構築 =========================================================================
# リソースグループの作成
$resourceGroup = New-AzResourceGroup -Name $rgname -Location $location
# 仮想ネットワークの作成
$sub1 = New-AzVirtualNetworkSubnetConfig -Name $snetName1 -AddressPrefix $SnetPrefixes1
$sub2 = New-AzVirtualNetworkSubnetConfig -Name $snetName2 -AddressPrefix $SnetPrefixes2
$vnet = New-AzvirtualNetwork -Name $vnetName -ResourceGroupName $rgname -Location $location `
-AddressPrefix $VnetPrefixes -Subnet @($sub1, $sub2)
# 仮想マシンの作成
New-AzVm `
-ResourceGroupName $rgname `
-Name $vmName `
-Location $location `
-VirtualNetworkName $vnetName `
-SubnetName $snetName2 `
-SecurityGroupName $nsg `
-PublicIpAddressName $vmPip `
-OpenPorts 80,3389 `
-Image 'Win2019Datacenter' `
-Size 'Standard_B2s'
# ==============================================================================
上記で「Application Gateway」、「WAFポリシー」以外のAzureサービスの構築完了になります。仮想マシン作成の時に「ログインアカウント」、「パスワード」の作成が求められます。
下記はリモートデスクトップ経由で仮想マシンにログイン後、IISを仮想マシン上のPowerShellでインストールします。インストール後、クライアント端末のWEBブラウザで仮想マシンのパブリックIPアドレスを入力し既定のIIS Webサイトが表示されることを確認しましょう。
# 仮想マシンのIPアドレス確認
Get-AzPublicIpAddress -ResourceGroupName $rgname | Select-Object -Property 'IpAddress'
# 仮想マシン上のPowerShellでIISをインストール
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
2-2 「WAFポリシー」の作成
「WAFポリシー」を作成します。ポリシーモードは防止、状態は有効で作成します。
# WAFポリシーのポリシーモードを'防止'、状態を'有効'で設定
$policySetting = New-AzApplicationGatewayFirewallPolicySetting -Mode Prevention -State Enabled
# WAFポリシーの作成
$wafPolicy = New-AzApplicationGatewayFirewallPolicy -Name $wafPolicy `
-ResourceGroup $rgname -Location $location -PolicySetting $PolicySetting
2-3 「Application Gateway」の作成および「WAFポリシー」の紐づけ
「Application Gateway」を作成します。2-2で作成した「WAFポリシー」の紐づけも同時に実施します。
# アプリケーションゲートウェイ用のパブリックIPアドレス作成 ==========================
$publicip = New-AzPublicIpAddress -ResourceGroupName $rgname -name $appgwPip `
-location $location -AllocationMethod Static -Sku Standard
# ==============================================================================
# 「フロントエンドIP構成」、「フロントエンドポート」、「バックエンドプール」の作成 ====
# 「フロントエンドIP構成」
$gwSubnet = Get-AzVirtualNetworkSubnetConfig -Name $snetName1 -VirtualNetwork $vnet
$gipconfig = New-AzApplicationGatewayIPConfiguration -Name "AppGwIpConfig" -Subnet $gwSubnet
$fipconfig01 = New-AzApplicationGatewayFrontendIPConfig -Name "fipconfig" -PublicIPAddress $publicip
# 仮想マシンのプライベートアドレスを取得
$NICs = Get-AzNetworkInterface
$PrivateIpAddresses = $NICs | foreach { $_.IpConfigurations.PrivateIpAddress }
# 「バックエンドプール」の作成
$pool = New-AzApplicationGatewayBackendAddressPool -Name "pool1" `
-BackendIPAddresses $PrivateIpAddresses
# 「フロントエンドポート」の作成
$fp01 = New-AzApplicationGatewayFrontendPort -Name "port1" -Port 80
# ==============================================================================
# 「リスナー」、「HTTP設定」、「ルール(規則)」、「自動スケーリング」の作成 =========
# 「リスナー」の作成
$listener01 = New-AzApplicationGatewayHttpListener -Name "listener1" -Protocol Http `
-FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01
# 「HTTP設定」の作成
$poolSetting01 = New-AzApplicationGatewayBackendHttpSettings -Name "setting1" -Port 80 `
-Protocol Http -CookieBasedAffinity Disabled
# 「ルール」の作成
$rule01 = New-AzApplicationGatewayRequestRoutingRule -Name "rule1" -RuleType basic `
-Priority 10 -BackendHttpSettings $poolSetting01 -HttpListener $listener01 -BackendAddressPool $pool
# 「自動スケーリング」の作成
$autoscaleConfig = New-AzApplicationGatewayAutoscaleConfiguration -MinCapacity 2
$sku = New-AzApplicationGatewaySku -Name WAF_v2 -Tier WAF_v2
# ==============================================================================
# アプリケーションゲートウェイの作成 ==============================================
$appgw = New-AzApplicationGateway -Name $appgwName -ResourceGroupName $rgname `
-Location $location -BackendAddressPools $pool `
-BackendHttpSettingsCollection $poolSetting01 `
-GatewayIpConfigurations $gipconfig -FrontendIpConfigurations $fipconfig01 `
-FrontendPorts $fp01 -HttpListeners $listener01 `
-RequestRoutingRules $rule01 -Sku $sku -AutoscaleConfiguration $autoscaleConfig `
-FirewallPolicy $wafPolicy
# ==============================================================================
上記で「Application Gateway」の作成および「WAFポリシー」の紐づけが完成です。
備忘録として今回「Application Gateway」のSKUを「WAF_v2」で作成しています。「WAF_v2」、「Standard_v2」で作成する場合は「ルール」作成時の「-Priority」が必須になります。
以下コマンドで「Application Gateway」のパブリックIPアドレスを取得し、クライアント端末のWEBブラウザにアプリケーションゲートウェイのIPアドレスを入力します。
IISが表示されることを確認しましょう。
# アプリケーションゲートウェイのIPアドレス確認
Get-AzPublicIpAddress -ResourceGroupName $rgname -Name $appgwPip | Select-Object -Property 'IpAddress'
以下に「Application Gateway」と「WAFポリシー」のスクショを載せます。枚数が多いので小さく載せます。
お手数をおかけしますが、確認したい場合は画像のクリックを適宜お願いいたします。
3.「Application Gateway」のWeb アプリケーション ファイアウォール
4.「Application Gateway」のバックエンドプール
5.「Application Gateway」のバックエンドプールの編集
6.「Application Gateway」のバックエンド設定
7.「Application Gateway」のフロントエンドIP構成
8.「Application Gateway」のフロントエンドIP構成_詳細
10.「Application Gateway」のリスナー_詳細
12.「Application Gateway」のルール_バックエンドプール
13.「Application Gateway」のルール_リスナー
17.「WAFポリシー」の関連付けられたアプリケーションゲートウェイ
2-4 「WAFポリシー」のカスタムルール更新
最後に「WAFポリシー」のカスタムルールにてIPアドレスの制限を実施します。
# 一致変数を'RemoteAddr'に設定
$variable = New-AzApplicationGatewayFirewallMatchVariable -VariableName RemoteAddr
# 一致の種類をIPアドレスに指定。IPアドレスにクライアントIPアドレスを指定。
$condition = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable `
-Operator IPMatch -MatchValue 'XXX.XXX.XXX.XXX' # ここに制限するIPアドレスを記載する。
# カスタムルールの作成。優先度を10、トラフィックを拒否するに指定。
$rule = New-AzApplicationGatewayFirewallCustomRule -Name $wafPolicyCustomRules `
-Priority 10 -RuleType MatchRule -MatchCondition $condition -Action Block
# WAFポリシーの更新
Set-AzApplicationGatewayFirewallPolicy -Name $wafPolicy -ResourceGroup $rgname -CustomRule $rule
クライアント端末のWEBブラウザにアプリケーションゲートウェイのIPアドレスを入力します。
IISが表示されないことを確認しましょう。
以下が「WAFポリシー」のカスタムルール更新後の画像になります。
※赤枠は拒否するIPアドレスになります。
3. おわりに
本記事を最後まで読んで頂きましてありがとうございます。
普段はAzureCLIで記載することが多いのですが、今回はPowerShellで構築してみました。
GUI、CUI、IaC等いろんな構築方法がありますが、縛らずに楽しめたらと思います。