Настройка политик WAF для отдельного сайта с помощью Azure PowerShell
Параметры брандмауэра веб-приложения (WAF) содержатся в политиках WAF, и для изменения конфигурации WAF необходимо изменить политику WAF.
При сопоставлении с шлюзом приложений политики и все параметры отображаются глобально. Поэтому, если WAF связан с пятью сайтами, все они будут защищены одной и той же политикой WAF. Это замечательно, если вам нужны одинаковые параметры безопасности для каждого сайта. Но вы также можете применить политики WAF к отдельным прослушивателям, чтобы настроить WAF для конкретного сайта.
Применяя политики WAF к прослушивателю, можно настроить параметры WAF для отдельных сайтов, так что изменения не будут затрагивать все сайты. Приоритет имеет наиболее конкретная политика. Если имеется глобальная политика и политика для каждого сайта (политика WAF, связанная с прослушивателем), то политика для каждого сайта переопределяет глобальную политику WAF для этого прослушивателя. Другие прослушиватели без собственных политик будут подчиняться только глобальной политике WAF.
Вы узнаете, как выполнять следующие задачи:
- Настройка сети
- Создание политики WAF
- Создание шлюза приложений с включенным WAF.
- Применение политики WAF глобально, на уровне сайта и на уровне URI
- Создание масштабируемого набора виртуальных машин
- Создание учетной записи хранения и настройка диагностики.
- Тестирование шлюза приложений
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Примечание.
Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Чтобы начать работу, см. статью Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.
Azure Cloud Shell
В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.
Начало работы с Azure Cloud Shell
Вариант | Пример и ссылка |
---|---|
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. | |
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. | |
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. |
Чтобы использовать Azure Cloud Shell, выполните следующие действия:
Запустите Cloud Shell.
Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.
Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.
Нажмите клавишу ВВОД, чтобы запустить код или команду.
Чтобы установить и использовать PowerShell локально для работы с этой статьей, вам понадобится модуль Azure PowerShell 1.0.0 или более поздней версии. Чтобы узнать версию, выполните команду Get-Module -ListAvailable Az
. Если вам необходимо выполнить обновление, ознакомьтесь со статьей, посвященной установке модуля Azure PowerShell. При использовании PowerShell на локальном компьютере также нужно запустить Login-AzAccount
, чтобы создать подключение к Azure.
Создание или изменение группы ресурсов
Группа ресурсов — это логический контейнер, в котором происходит развертывание ресурсов Azure и управление ими. Создайте группу ресурсов Azure с помощью командлета New-AzResourceGroup.
$rgname = New-AzResourceGroup -Name myResourceGroupAG -Location eastus
Создание сетевых ресурсов
Создайте конфигурации подсетей с именами myBackendSubnet и myAGSubnet, выполнив командлет New-AzVirtualNetworkSubnetConfig. Создайте виртуальную сеть с именем myVNet, используя командлет New-AzVirtualNetwork с конфигурациями подсетей. Наконец, создайте общедоступный IP-адрес с именем myAGPublicIPAddress, выполнив командлет New-AzPublicIpAddress. Эти ресурсы используются для обеспечения сетевого подключения к шлюзу приложений и связанным с ним ресурсам.
$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-конфигурации и интерфейсный порт — используются для связывания созданной ранее подсети с шлюзом приложений и назначения порта для доступа к нему.
- Пул по умолчанию — все шлюзы приложения должны иметь по крайней мере один внутренний пул серверов.
- Прослушиватель и правило по умолчанию — прослушиватель по умолчанию ожидает передачи трафика через назначенный порт, а правило по умолчанию отправляет трафик в пул по умолчанию.
Создание IP-конфигураций и интерфейсного порта
Свяжите созданную ранее подсеть myAGSubnet со шлюзом приложений, используя командлет New-AzApplicationGatewayIPConfiguration. Назначьте шлюзу приложений адрес myAGPublicIPAddress с помощью командлета New-AzApplicationGatewayFrontendIPConfig.
$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
Создание серверного пула и настройка параметров
Создайте серверный пул с именем appGatewayBackendPool для шлюза приложений с помощью командлета New-AzApplicationGatewayBackendAddressPool. Настройте параметры для внутренних пулов адресов, используя командлет New-AzApplicationGatewayBackendHttpSettings.
$defaultPool = New-AzApplicationGatewayBackendAddressPool `
-Name appGatewayBackendPool
$poolSettings = New-AzApplicationGatewayBackendHttpSettings `
-Name myPoolSettings `
-Port 80 `
-Protocol Http `
-CookieBasedAffinity Enabled `
-RequestTimeout 120
Создание двух политик WAF
Создайте две политики WAF — одну глобальную и одну для сайта, — а затем добавьте настраиваемые правила.
Размер файла политика для сайта должен быть не более 5 МБ. Все остальные параметры совпадают.
$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-адресе.
Создайте прослушиватель mydefaultListener с конфигурацией внешнего интерфейса и интерфейсным портом, созданными ранее, используя командлет New-AzApplicationGatewayHttpListener. Правило требуется для того, чтобы указать прослушивателю, какой внутренний пул использовать для входящего трафика. Создайте базовое правило rule1 с помощью командлета New-AzApplicationGatewayRequestRoutingRule.
$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. Затем создайте шлюз приложений с именем myAppGateway, используя командлет New-AzApplicationGateway.
$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 или концентратор событий.
Создание учетной записи хранения
Чтобы создать учетную запись хранения с именем myagstore1, используйте командлет New-AzStorageAccount.
$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, показанный ниже).
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