Migrace zásad Web Application Firewall pomocí Azure PowerShell
Tento skript usnadňuje přechod z konfigurace WAF nebo vlastní zásady WAF jen pro pravidla na úplnou zásadu WAF. Na portálu se může zobrazit upozornění s informacemi o migraci na zásady WAF nebo můžete chtít, aby nové funkce WAF, jako jsou vlastní pravidla Geomatch, zásady WAF pro jednotlivé weby a zásady WAF pro jednotlivé weby (Preview) nebo sada pravidel pro zmírnění rizik robota. Pokud chcete použít některou z těchto funkcí, potřebujete úplnou zásadu WAF přidruženou k vaší aplikační bráně.
Další informace o vytváření nových zásad WAF najdete v tématu Vytvoření zásad Web Application Firewall pro Application Gateway. Informace o migraci najdete v tématu Migrace na zásady WAF.
Migrace na zásady WAF pomocí skriptu migrace
Pomocí následujících kroků spusťte skript migrace:
- Otevřete následující okno cloud shellu nebo ho otevřete z portálu.
- Zkopírujte skript do okna cloud shellu a spusťte ho.
- Skript požádá o ID předplatného, název skupiny prostředků, název Application Gateway, ke kterému je přidružená konfigurace WAF, a název nové zásady WAF, které se mají vytvořit. Po zadání těchto vstupů se skript spustí a vytvoří nové zásady WAF.
- Přidružte nové zásady WAF ke službě Application Gateway. Přejděte na portálu na zásady WAF a vyberte kartu Přidružené služby Application Gateway. Vyberte Přidružit Application Gateway a pak vyberte Application Gateway, ke které chcete přidružit zásady WAF.
Poznámka
Pokud existují následující podmínky, skript migraci nedokon čte:
- Celé pravidlo je zakázané. Pokud chcete migraci dokončit, ujistěte se, že není zakázaná celá skupina pravidel.
- Položky vyloučení s libovolným operátorem Rovná se. Pokud chcete provést migraci, ujistěte se, že položky vyloučení s operátorem Equals Any nejsou k dispozici.
Další informace najdete ve funkci ValidateInput ve skriptu.
<#PSScriptInfo
.DESCRIPTION
Will be used to migrate to the application-gateway to a top level waf policy experience.
.VERSION 1.0
.GUID b6fedd43-ebd0-41ed-9847-4f1c1c43be22
.AUTHOR Venkat.Krishnan
.PARAMETER subscriptionId
Subscription Id of where the resources are present.
.PARAMETER resourceGroupName
Resource-group where the resources are present.
.PARAMETER applicationGatewayName
Application-Gateway name
.PARAMETER wafPolicyName
Name of the web application firewall policy
.EXAMPLE
./migrateToWafPolicy.ps1 -subscriptionId <your-subscription-id> -applicationGatewayName <your-appgw-name> -resourceGroupName <your-resource-group-name> -wafPolicyName <new-waf-policy-name>
#>
param(
[Parameter(Mandatory=$true)]
[string] $subscriptionId,
[Parameter(Mandatory=$true)]
[string] $resourceGroupName,
[Parameter(Mandatory=$true)]
[string] $applicationGatewayName,
[Parameter(Mandatory=$true)]
[string] $wafPolicyName
)
function ValidateInput ($appgwName, $resourceGroupName) {
# Obtain the application-gateway
$appgw = Get-AzApplicationGateway -Name $applicationGatewayName -ResourceGroupName $resourceGroupName
if (-not $appgw) {
Write-Error "ApplicationGateway: $applicationGatewayName is not present in ResourceGroup: $resourceGroupName"
return $false
}
# Check if already have a global firewall policy
if ($appgw.FirewallPolicy) {
$fp = Get-AzResource -ResourceId $appgw.FirewallPolicy.Id
if ($fp.PolicySettings) {
Write-Error "ApplicationGateway: $applicationGatewayName already has a global firewall policy: $fp.Name. Please use portal for changing the policy."
return $false
}
}
if ($appgw.WebApplicationFirewallConfiguration) {
# Throw an error, since ruleGroup disabled case can't be migrated now.
if ($appgw.WebApplicationFirewallConfiguration.DisabledRuleGroups) {
foreach ($disabled in $appgw.WebApplicationFirewallConfiguration.DisabledRuleGroups) {
if ($disabled.Rules.Count -eq 0) {
$ruleGroupName = $disabled.RuleGroupName
Write-Error "The ruleGroup '$ruleGroupName' is disabled. Currently we can't migrate to a firewall policy when an entire ruleGroup is disabled. This feature will be delivered shortly. To continue, kindly ensure the entire rulegroups are not disabled. "
return $false
}
}
}
# Throw an error when exclusion entry with 'EqualsAny' operator is present
if ($appgw.WebApplicationFirewallConfiguration.Exclusions) {
foreach ($excl in $appgw.WebApplicationFirewallConfiguration.Exclusions) {
if ($null -ne $excl.MatchVariable -and $null -eq $excl.SelectorMatchOperator -and $null -eq $excl.Selector) {
Write-Error " You have an exclusion entry(s) with the 'Equals any' operator. Currently we can't migrate to a firewall policy with 'Equals Any' operator. This feature will be delivered shortly. To continue, kindly ensure exclusion entries with 'Equals Any' operator is not present. "
return $false
}
}
}
}
if ($appgw.Sku.Name -ne "WAF_v2" -or $appgw.Sku.Tier -ne "WAF_v2") {
Write-Error " Cannot associate a firewall policy to application gateway :$applicationGatewayName since the Sku is not on WAF_v2"
return $false
}
return $true
}
function Login() {
$context = Get-AzContext
if ($null -eq $context -or $null -eq $context.Account) {
Login-AzAccount
}
}
function createNewTopLevelWafPolicy ($subscriptionId, $resourceGroupName, $applicationGatewayName, $wafPolicyName) {
Select-AzSubscription -Subscription $subscriptionId
$retVal = ValidateInput -appgwName $applicationGatewayName -resourceGroupName $resourceGroupName
if (!$retVal) {
return
}
$appgw = Get-AzApplicationGateway -Name $applicationGatewayName -ResourceGroupName $resourceGroupName
# Get the managedRule and PolicySettings
$managedRule = New-AzApplicationGatewayFirewallPolicyManagedRule
$policySetting = New-AzApplicationGatewayFirewallPolicySetting
if ($appgw.WebApplicationFirewallConfiguration) {
$ruleGroupOverrides = [System.Collections.ArrayList]@()
if ($appgw.WebApplicationFirewallConfiguration.DisabledRuleGroups) {
foreach ($disabled in $appgw.WebApplicationFirewallConfiguration.DisabledRuleGroups) {
$rules = [System.Collections.ArrayList]@()
if ($disabled.Rules.Count -gt 0) {
foreach ($rule in $disabled.Rules) {
$ruleOverride = New-AzApplicationGatewayFirewallPolicyManagedRuleOverride -RuleId $rule
$_ = $rules.Add($ruleOverride)
}
}
$ruleGroupOverride = New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride -RuleGroupName $disabled.RuleGroupName -Rule $rules
$_ = $ruleGroupOverrides.Add($ruleGroupOverride)
}
}
$managedRuleSet = New-AzApplicationGatewayFirewallPolicyManagedRuleSet -RuleSetType $appgw.WebApplicationFirewallConfiguration.RuleSetType -RuleSetVersion $appgw.WebApplicationFirewallConfiguration.RuleSetVersion
if ($ruleGroupOverrides.Count -ne 0) {
$managedRuleSet = New-AzApplicationGatewayFirewallPolicyManagedRuleSet -RuleSetType $appgw.WebApplicationFirewallConfiguration.RuleSetType -RuleSetVersion $appgw.WebApplicationFirewallConfiguration.RuleSetVersion -RuleGroupOverride $ruleGroupOverrides
}
$exclusions = [System.Collections.ArrayList]@()
if ($appgw.WebApplicationFirewallConfiguration.Exclusions) {
foreach ($excl in $appgw.WebApplicationFirewallConfiguration.Exclusions) {
if ($excl.MatchVariable -and $excl.SelectorMatchOperator -and $excl.Selector) {
$exclusionEntry = New-AzApplicationGatewayFirewallPolicyExclusion -MatchVariable $excl.MatchVariable -SelectorMatchOperator $excl.SelectorMatchOperator -Selector $excl.Selector
$_ = $exclusions.Add($exclusionEntry)
}
}
}
$managedRule = New-AzApplicationGatewayFirewallPolicyManagedRule -ManagedRuleSet $managedRuleSet
$exclCount = $exclusions.Count
if ($exclCount -ne 0) {
$managedRule = New-AzApplicationGatewayFirewallPolicyManagedRule -ManagedRuleSet $managedRuleSet -Exclusion $exclusions
}
$policySetting = New-AzApplicationGatewayFirewallPolicySetting -MaxFileUploadInMb $appgw.WebApplicationFirewallConfiguration.FileUploadLimitInMb -MaxRequestBodySizeInKb $appgw.WebApplicationFirewallConfiguration.MaxRequestBodySizeInKb -Mode Detection -State Disabled
if ($appgw.WebApplicationFirewallConfiguration.FirewallMode -eq "Prevention") {
$policySetting.Mode = "Prevention"
}
if ($appgw.WebApplicationFirewallConfiguration.Enabled) {
$policySetting.State = "Enabled"
}
$policySetting.RequestBodyCheck = $appgw.WebApplicationFirewallConfiguration.RequestBodyCheck;
}
if ($appgw.FirewallPolicy) {
$customRulePolicyId = $appgw.FirewallPolicy.Id
$rg = Get-AzResourceGroup -Id $customRulePolicyId
$crPolicyName = $customRulePolicyId.Substring($customRulePolicyId.LastIndexOf("/") + 1)
$customRulePolicy = Get-AzApplicationGatewayFirewallPolicy -ResourceGroupName $rg.ResourceGroupName -Name $crPolicyName
$wafPolicy = New-AzApplicationGatewayFirewallPolicy -ResourceGroupName $rg.ResourceGroupName -Name $wafPolicyName -CustomRule $customRulePolicy.CustomRules -ManagedRule $managedRule -PolicySetting $policySetting -Location $appgw.Location
} else {
$wafPolicy = New-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $resourceGroupName -PolicySetting $policySetting -ManagedRule $managedRule -Location $appgw.Location
}
if (!$wafPolicy) {
return
}
$appgw.FirewallPolicy = $wafPolicy
$appgw = Set-AzApplicationGateway -ApplicationGateway $appgw
Write-Host " firewallPolicy: $wafPolicyName has been created/updated successfully and applied to applicationGateway: $applicationGatewayName!"
return $wafPolicy
}
function Main() {
Login
$policy = createNewTopLevelWafPolicy -subscriptionId $subscriptionId -resourceGroupName $resourceGroupName -applicationGatewayName $applicationGatewayName -wafPolicyName $wafPolicyName
return $policy
}
Main
Další kroky
Přečtěte si další informace o Web Application Firewall skupinách pravidel a pravidlech CRS.