Web アプリケーション ファイアウォール (WAF) の設定は WAF ポリシーに含まれています。WAF 構成を変更するには、WAF ポリシーを変更します。
Application Gateway に関連付けられているとき、ポリシーとすべての設定がグローバルに反映されます。 そのため、WAF の背後にサイトが 5 つあるとしたら、5 つすべてのサイトが同じ WAF ポリシーで保護されます。 すべてのサイトに同じセキュリティ設定が求められる場合に便利です。 ただし、個々のリスナーに WAF ポリシーを適用し、サイト固有の WAF 構成を許可することもできます。
WAF ポリシーをリスナーに適用することによって、すべてのサイトに変更を適用することなく、個々のサイトの WAF 設定を構成できます。 最も限定的なポリシーが優先されます。 グローバル ポリシーとサイト別ポリシー (リスナーに関連付けられている WAF ポリシー) がある場合、サイト別ポリシーは、そのリスナーのグローバル WAF ポリシーより優先されます。 独自のポリシーのない他のリスナーには、グローバル WAF ポリシーのみが適用されます。
この記事では、次の方法について説明します。
- ネットワークのセットアップ
- WAF ポリシーを作成する
- WAF 対応のアプリケーション ゲートウェイの作成
- WAF ポリシーをグローバルに、サイト別に、URI 別に適用する
- 仮想マシン スケール セットを作成する
- ストレージ アカウントの作成と診断の構成
- アプリケーション ゲートウェイのテスト
Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
注
Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を始めるには、「Azure PowerShell をインストールする」を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。
Azure Cloud Shell
Azure では、ブラウザーを介して使用できる対話型のシェル環境、Azure Cloud Shell がホストされています。 Cloud Shell で Bash または PowerShell を使用して、Azure サービスを操作できます。 ローカル環境に何もインストールしなくても、Cloud Shell にプレインストールされているコマンドを使用して、この記事のコードを実行できます。
Azure Cloud Shell を開始するには、以下のようにします。
| オプション | 例とリンク |
|---|---|
| コードまたはコマンド ブロックの右上隅にある [使ってみる] を選択します。 [使ってみる] を選択しても、コードまたはコマンドは Cloud Shell に自動的にはコピーされません。 |
|
| https://shell.azure.com に移動するか、[Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。 |
|
| Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。 |
|
Azure Cloud Shell を使用するには、以下のようにします。
Cloud Shell を開始します。
コード ブロック (またはコマンド ブロック) の [コピー] ボタンを選択し、コードまたはコマンドをコピーします。
Windows と Linux では Ctrl+Shift+V キーを選択し、macOS では Cmd+Shift+V キーを選択して、コードまたはコマンドを Cloud Shell セッションに貼り付けます。
Enter キーを選択して、コードまたはコマンドを実行します。
PowerShell をローカルにインストールして使用することを選択する場合、この記事では Azure PowerShell モジュール バージョン 1.0.0 以降が必要になります。 バージョンを確認するには、Get-Module -ListAvailable Az を実行します。 アップグレードする必要がある場合は、Azure PowerShell モジュールのインストールに関するページを参照してください。 PowerShell をローカルで実行している場合、Login-AzAccount を実行して Azure との接続を作成することも必要です。
リソース グループを作成する
リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 New-AzResourceGroup を使用して Azure リソース グループを作成します。
$rgname = New-AzResourceGroup -Name myResourceGroupAG -Location eastus
ネットワーク リソースを作成する
New-AzVirtualNetworkSubnetConfig を使用して、サブネット構成 myBackendSubnet および myAGSubnet を作成します。 New-AzVirtualNetwork とサブネット構成を使用して、myVNet という名前の仮想ネットワークを作成します。 最後に、New-AzPublicIpAddress を使用して myAGPublicIPAddress という名前のパブリック IP アドレスを作成します。 こうしたリソースは、アプリケーション ゲートウェイとその関連リソースにネットワーク接続を提供するために使用されます。
$backendSubnetConfig = New-AzVirtualNetworkSubnetConfig `
-Name myBackendSubnet `
-AddressPrefix 10.0.1.0/24
$agSubnetConfig = New-AzVirtualNetworkSubnetConfig `
-Name myAGSubnet `
-AddressPrefix 10.0.2.0/24
$vnet = New-AzVirtualNetwork `
-ResourceGroupName myResourceGroupAG `
-Location eastus `
-Name myVNet `
-AddressPrefix 10.0.0.0/16 `
-Subnet $backendSubnetConfig, $agSubnetConfig
$pip = New-AzPublicIpAddress `
-ResourceGroupName myResourceGroupAG `
-Location eastus `
-Name myAGPublicIPAddress `
-AllocationMethod Static `
-Sku Standard
アプリケーション ゲートウェイの作成
このセクションでは、アプリケーション ゲートウェイをサポートするリソースを作成し、最終的にアプリケーション ゲートウェイと WAF を作成します。 作成するリソースは次のとおりです。
- IP 構成とフロントエンド ポート - 以前に作成したサブネットをアプリケーション ゲートウェイに関連付け、それへのアクセスに使用するポートを割り当てます。
- 既定のプール - すべてのアプリケーション ゲートウェイには、サーバーのバックエンド プールが 1 つ以上必要です。
- 既定のリスナーとルール - 既定のリスナーは、割り当てられたポートでトラフィックをリッスンし、既定のルールは、既定のプールにトラフィックを送信します。
IP 構成とフロントエンド ポートの作成
New-AzApplicationGatewayIPConfiguration を使用して、前に作成した myAGSubnet をアプリケーション ゲートウェイに関連付けます。 New-AzApplicationGatewayFrontendIPConfig を使用して、myAGPublicIPAddress をアプリケーション ゲートウェイに割り当てます。
$vnet = Get-AzVirtualNetwork `
-ResourceGroupName myResourceGroupAG `
-Name myVNet
$subnet=$vnet.Subnets[1]
$gipconfig = New-AzApplicationGatewayIPConfiguration `
-Name myAGIPConfig `
-Subnet $subnet
$fipconfig = New-AzApplicationGatewayFrontendIPConfig `
-Name myAGFrontendIPConfig `
-PublicIPAddress $pip
$frontendport80 = New-AzApplicationGatewayFrontendPort `
-Name myFrontendPort `
-Port 80
$frontendport8080 = New-AzApplicationGatewayFrontendPort `
-Name myFrontendPort `
-Port 8080
バックエンド プールと設定の作成
New-AzApplicationGatewayBackendAddressPool を使用して、アプリケーション ゲートウェイに対して appGatewayBackendPool という名前のバックエンド プールを作成します。 New-AzApplicationGatewayBackendHttpSettings を使用して、バックエンド アドレス プールの設定を構成します。
$defaultPool = New-AzApplicationGatewayBackendAddressPool `
-Name appGatewayBackendPool
$poolSettings = New-AzApplicationGatewayBackendHttpSettings `
-Name myPoolSettings `
-Port 80 `
-Protocol Http `
-CookieBasedAffinity Enabled `
-RequestTimeout 120
2 つの WAF ポリシーを作成する
グローバル用に 1 つ、サイト別用に 1 つで 2 つの WAF ポリシーを作成し、カスタム ルールを追加します。
サイト別ポリシーでは、ファイルのアップロード上限を 5 MB に設定します。 他はすべて同じです。
$variable = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable -Operator Contains -MatchValue "globalAllow"
$rule = New-AzApplicationGatewayFirewallCustomRule -Name globalAllow -Priority 5 -RuleType MatchRule -MatchCondition $condition -Action Allow
$variable1 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition1 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable1 -Operator Contains -MatchValue "globalBlock"
$rule1 = New-AzApplicationGatewayFirewallCustomRule -Name globalBlock -Priority 10 -RuleType MatchRule -MatchCondition $condition1 -Action Block
$variable2 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition2 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable2 -Operator Contains -MatchValue "siteAllow"
$rule2 = New-AzApplicationGatewayFirewallCustomRule -Name siteAllow -Priority 5 -RuleType MatchRule -MatchCondition $condition2 -Action Allow
$variable3 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition3 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable3 -Operator Contains -MatchValue "siteBlock"
$rule3 = New-AzApplicationGatewayFirewallCustomRule -Name siteBlock -Priority 10 -RuleType MatchRule -MatchCondition $condition3 -Action Block
$variable4 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition4 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable4 -Operator Contains -MatchValue "URIAllow"
$rule4 = New-AzApplicationGatewayFirewallCustomRule -Name URIAllow -Priority 5 -RuleType MatchRule -MatchCondition $condition4 -Action Allow
$variable5 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition5 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable5 -Operator Contains -MatchValue "URIBlock"
$rule5 = New-AzApplicationGatewayFirewallCustomRule -Name URIBlock -Priority 10 -RuleType MatchRule -MatchCondition $condition5 -Action Block
$policySettingGlobal = New-AzApplicationGatewayFirewallPolicySetting `
-Mode Prevention `
-State Enabled `
-MaxRequestBodySizeInKb 100 `
-MaxFileUploadInMb 256
$wafPolicyGlobal = New-AzApplicationGatewayFirewallPolicy `
-Name wafpolicyGlobal `
-ResourceGroup myResourceGroupAG `
-Location eastus `
-PolicySetting $PolicySettingGlobal `
-CustomRule $rule, $rule1
$policySettingSite = New-AzApplicationGatewayFirewallPolicySetting `
-Mode Prevention `
-State Enabled `
-MaxRequestBodySizeInKb 100 `
-MaxFileUploadInMb 5
$wafPolicySite = New-AzApplicationGatewayFirewallPolicy `
-Name wafpolicySite `
-ResourceGroup myResourceGroupAG `
-Location eastus `
-PolicySetting $PolicySettingSite `
-CustomRule $rule2, $rule3
既定のリスナーとルールの作成
アプリケーション ゲートウェイがバックエンド アドレス プールに対して適切にトラフィックをルーティングするためにはリスナーが必要です。 この例では、ルート URL でトラフィックをリッスンする基本的なリスナーを作成します。
New-AzApplicationGatewayHttpListener と、前に作成したフロントエンド構成およびフロントエンド ポートを使用して、myDefaultListener という名前のリスナーを作成します。 着信トラフィックに使用するバックエンド プールをリスナーが判断するには、ルールが必要です。 New-AzApplicationGatewayRequestRoutingRule を使用して、rule1 という名前の基本ルールを作成します。
$globalListener = New-AzApplicationGatewayHttpListener `
-Name mydefaultListener `
-Protocol Http `
-FrontendIPConfiguration $fipconfig `
-FrontendPort $frontendport80
$frontendRule = New-AzApplicationGatewayRequestRoutingRule `
-Name rule1 `
-RuleType Basic `
-HttpListener $globallistener `
-BackendAddressPool $defaultPool `
-BackendHttpSettings $poolSettings
$siteListener = New-AzApplicationGatewayHttpListener `
-Name mydefaultListener `
-Protocol Http `
-FrontendIPConfiguration $fipconfig `
-FrontendPort $frontendport8080 `
-FirewallPolicy $wafPolicySite
$frontendRuleSite = New-AzApplicationGatewayRequestRoutingRule `
-Name rule2 `
-RuleType Basic `
-HttpListener $siteListener `
-BackendAddressPool $defaultPool `
-BackendHttpSettings $poolSettings
WAF のあるアプリケーション ゲートウェイの作成
必要な関連リソースを作成したら、New-AzApplicationGatewaySku を使用してアプリケーション ゲートウェイのパラメーターを指定します。 New-AzApplicationGatewayFirewallPolicy を使用して、ファイアウォール ポリシーを指定します。 その後、New-AzApplicationGateway を使用して myAppGateway という名前のアプリケーション ゲートウェイを作成します。
$sku = New-AzApplicationGatewaySku `
-Name WAF_v2 `
-Tier WAF_v2 `
-Capacity 2
$appgw = New-AzApplicationGateway `
-Name myAppGateway `
-ResourceGroupName myResourceGroupAG `
-Location eastus `
-BackendAddressPools $defaultPool `
-BackendHttpSettingsCollection $poolSettings `
-FrontendIpConfigurations $fipconfig `
-GatewayIpConfigurations $gipconfig `
-FrontendPorts $frontendport80 `
-HttpListeners $globallistener `
-RequestRoutingRules $frontendRule `
-Sku $sku `
-FirewallPolicy $wafPolicyGlobal
URI 別ポリシーを適用する
URI 別ポリシーを適用するには、新しいポリシーを作成し、それをパス ルール構成に適用します。
$policySettingURI = New-AzApplicationGatewayFirewallPolicySetting `
-Mode Prevention `
-State Enabled `
-MaxRequestBodySizeInKb 100 `
-MaxFileUploadInMb 5
$wafPolicyURI = New-AzApplicationGatewayFirewallPolicy `
-Name wafPolicyURI `
-ResourceGroup myResourceGroupAG `
-Location eastus `
-PolicySetting $PolicySettingURI `
-CustomRule $rule4, $rule5
$appgw = Get-AzApplicationGateway `
-ResourceGroupName myResourceGroupAG `
-Name myAppGateway
$PathRuleConfig = New-AzApplicationGatewayPathRuleConfig -Name "base" `
-Paths "/base" `
-BackendAddressPool $defaultPool `
-BackendHttpSettings $poolSettings `
-FirewallPolicy $wafPolicyURI
$PathRuleConfig1 = New-AzApplicationGatewayPathRuleConfig `
-Name "base" -Paths "/test" `
-BackendAddressPool $defaultPool `
-BackendHttpSettings $poolSettings
$URLPathMap = New-AzApplicationGatewayUrlPathMapConfig -Name "PathMap" `
-PathRules $PathRuleConfig, $PathRuleConfig1 `
-DefaultBackendAddressPoolId $defaultPool.Id `
-DefaultBackendHttpSettingsId $poolSettings.Id
Add-AzApplicationGatewayRequestRoutingRule -ApplicationGateway $appgw `
-Name "RequestRoutingRule" `
-RuleType PathBasedRouting `
-HttpListener $siteListener `
-UrlPathMap $URLPathMap
仮想マシン スケール セットを作成する
この例では、アプリケーション ゲートウェイのバックエンド プールにサーバーを提供する仮想マシン スケール セットを作成します。 スケール セットは、IP 設定を構成するときにバックエンド プールに割り当てます。
-AdminUsername と -AdminPassword は、該当する値で置換します。
$vnet = Get-AzVirtualNetwork `
-ResourceGroupName myResourceGroupAG `
-Name myVNet
$appgw = Get-AzApplicationGateway `
-ResourceGroupName myResourceGroupAG `
-Name myAppGateway
$backendPool = Get-AzApplicationGatewayBackendAddressPool `
-Name appGatewayBackendPool `
-ApplicationGateway $appgw
$ipConfig = New-AzVmssIpConfig `
-Name myVmssIPConfig `
-SubnetId $vnet.Subnets[0].Id `
-ApplicationGatewayBackendAddressPoolsId $backendPool.Id
$vmssConfig = New-AzVmssConfig `
-Location eastus `
-SkuCapacity 2 `
-SkuName Standard_DS2 `
-UpgradePolicyMode Automatic
Set-AzVmssStorageProfile $vmssConfig `
-ImageReferencePublisher MicrosoftWindowsServer `
-ImageReferenceOffer WindowsServer `
-ImageReferenceSku 2016-Datacenter `
-ImageReferenceVersion latest `
-OsDiskCreateOption FromImage
Set-AzVmssOsProfile $vmssConfig `
-AdminUsername <username> `
-AdminPassword <password> `
-ComputerNamePrefix myvmss
Add-AzVmssNetworkInterfaceConfiguration `
-VirtualMachineScaleSet $vmssConfig `
-Name myVmssNetConfig `
-Primary $true `
-IPConfiguration $ipConfig
New-AzVmss `
-ResourceGroupName myResourceGroupAG `
-Name myvmss `
-VirtualMachineScaleSet $vmssConfig
IIS のインストール
$publicSettings = @{ "fileUris" = (,"https://raw.githubusercontent.com/Azure/azure-docs-powershell-samples/master/application-gateway/iis/appgatewayurl.ps1");
"commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File appgatewayurl.ps1" }
$vmss = Get-AzVmss -ResourceGroupName myResourceGroupAG -VMScaleSetName myvmss
Add-AzVmssExtension -VirtualMachineScaleSet $vmss `
-Name "customScript" `
-Publisher "Microsoft.Compute" `
-Type "CustomScriptExtension" `
-TypeHandlerVersion 1.8 `
-Setting $publicSettings
Update-AzVmss `
-ResourceGroupName myResourceGroupAG `
-Name myvmss `
-VirtualMachineScaleSet $vmss
ストレージ アカウントの作成と診断の構成
この記事では、アプリケーション ゲートウェイは、検出および防止の目的で、ストレージ アカウントを使用してデータを格納します。 Azure Monitor ログまたはイベント ハブを使用して、データを記録することもできます。
ストレージ アカウントの作成
New-AzStorageAccount を使用して、myagstore1 という名前のストレージ アカウントを作成します。
$storageAccount = New-AzStorageAccount `
-ResourceGroupName myResourceGroupAG `
-Name myagstore1 `
-Location eastus `
-SkuName "Standard_LRS"
診断の構成
Set-AzDiagnosticSetting を使用して、ApplicationGatewayAccessLog、ApplicationGatewayPerformanceLog、および ApplicationGatewayFirewallLog ログにデータが記録されるように診断を構成します。
$appgw = Get-AzApplicationGateway `
-ResourceGroupName myResourceGroupAG `
-Name myAppGateway
$store = Get-AzStorageAccount `
-ResourceGroupName myResourceGroupAG `
-Name myagstore1
Set-AzDiagnosticSetting `
-ResourceId $appgw.Id `
-StorageAccountId $store.Id `
-Category ApplicationGatewayAccessLog, ApplicationGatewayPerformanceLog, ApplicationGatewayFirewallLog `
-Enabled $true `
-RetentionEnabled $true `
-RetentionInDays 30
アプリケーション ゲートウェイのテスト
Get-AzPublicIPAddress を使用して、アプリケーション ゲートウェイのパブリック IP アドレスを取得できます。 次に、この IP アドレスを使用して (下の画像の 1.1.1.1 を置き換えます) curl コマンドを実行します。
Get-AzPublicIPAddress -ResourceGroupName myResourceGroupAG -Name myAGPublicIPAddress
#should be blocked
curl 1.1.1.1/globalBlock
curl 1.1.1.1/?1=1
#should be allowed
curl 1.1.1.1/globalAllow?1=1
#should be blocked
curl 1.1.1.1:8080/siteBlock
curl 1.1.1.1/?1=1
#should be allowed
curl 1.1.1.1:8080/siteAllow?1=1
#should be blocked
curl 1.1.1.1/URIBlock
curl 1.1.1.1/?1=1
#should be allowed
curl 1.1.1.1/URIAllow?1=1
リソースをクリーンアップする
必要がなくなったら、Remove-AzResourceGroup を使用して、リソース グループ、アプリケーション ゲートウェイ、およびすべての関連リソースを削除します。
Remove-AzResourceGroup -Name myResourceGroupAG