Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: ✔️ Application Gateway V2
El conjunto de reglas predeterminado (DRS) administrado por Azure en El firewall de aplicaciones web (WAF) de Azure Application Gateway protege las aplicaciones web frente a vulnerabilidades comunes y vulnerabilidades de seguridad, incluidos los 10 tipos de ataque principales de OWASP. El conjunto de reglas predeterminado también incorpora las reglas de recopilación de inteligencia sobre amenazas de Microsoft. Ejecute siempre la versión más reciente del conjunto de reglas, que incluye las actualizaciones de seguridad, las mejoras de reglas y las correcciones más recientes.
El conjunto de reglas predeterminado (DRS) administrado por Azure es la última generación de conjuntos de reglas de Azure WAF, reemplazando todas las versiones anteriores del conjunto de reglas principales (CRS). Entre las versiones de DRS, use siempre la versión más alta disponible (DRS 2.2) para asegurarse de que tiene las protecciones más up-to-date.
En este artículo se proporcionan ejemplos de PowerShell para actualizar la directiva de WAF de Azure a DRS 2.2 desde CRS 3.0, CRS 3.1, CRS 3.2 o DRS 2.1.
Nota:
Los fragmentos de código de PowerShell son solo ejemplos. Reemplace todos los marcadores de posición por valores de su entorno.
Prerrequisitos
Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Una directiva de Azure WAF existente con un conjunto de reglas principales (CRS) o un conjunto de reglas predeterminado (DRS) aplicado. Si aún no tiene una directiva de WAF, consulte Creación de directivas de firewall de aplicaciones web para Application Gateway.
Versión más reciente de Azure PowerShell instalada localmente. En este artículo se requiere el módulo Az.Network.
Consideraciones clave al actualizar
Al actualizar la versión del conjunto de reglas de Azure WAF, asegúrese de:
Conservar las personalizaciones existentes: conserve las anulaciones de la acción de las reglas, las anulaciones del estado de las reglas (habilitadas o deshabilitadas) y las exclusiones.
Eliminar las personalizaciones de las reglas eliminadas: no conservar las anulaciones ni las exclusiones de las reglas que ya no existen en DRS 2.2. Arrastrar una anulación para una regla que no está incluida en DRS 2.2 hace que la actualización de la directiva falle con un error como
The override Rule '<id>' is unknown for RuleGroup '<group>'.Tenga en cuenta el valor de referencia del Nivel de paranoia: DRS 2.2 opera en el nivel de paranoia 1 (PL1) de forma predeterminada, y todas las reglas de PL2 están deshabilitadas por defecto. En CRS 3.2 y DRS 2.1, las reglas PL2 estaban activas. Las reglas PL2 que haya personalizado anteriormente están deshabilitadas de forma predeterminada en DRS 2.2 hasta que vuelva a habilitarlas explícitamente.
Validar reglas nuevas de forma segura: las reglas recién agregadas que están habilitadas de forma predeterminada (PL1) se establecen inicialmente en modo de registro, por lo que puede supervisar su impacto y ajustarlas antes de habilitar el bloqueo.
Preparación del entorno y las variables
Configure el contexto de la suscripción, el grupo de recursos y la directiva de WAF de Azure seleccionados.
Import-Module Az.Network Set-AzContext -SubscriptionId "<subscription_id>" $resourceGroupName = "<resource_group>" $wafPolicyName = "<policy_name>"Obtenga el objeto de directiva WAF y recupere sus definiciones. El conjunto de reglas administrado actual puede ser un tipo CRS (
OWASP) o DRS (Microsoft_DefaultRuleSet).$wafPolicy = Get-AzApplicationGatewayFirewallPolicy ` -Name $wafPolicyName ` -ResourceGroupName $resourceGroupName $currentExclusions = $wafPolicy.ManagedRules.Exclusions $currentManagedRuleset = $wafPolicy.ManagedRules.ManagedRuleSets | Where-Object { $_.RuleSetType -eq "OWASP" -or $_.RuleSetType -eq "Microsoft_DefaultRuleSet" } $currentVersion = $currentManagedRuleset.RuleSetVersion
Conservar las personalizaciones existentes
Realice una invalidación o exclusión solo si la regla todavía existe en DRS 2.2. La función siguiente valida un identificador de regla en el conjunto completo de reglas de DRS 2.2 y devuelve
$truepara cualquier regla que se quitó (incluidas las reglas heredadas e inactivas, como920460,942130y920250). El uso de una lista de identificadores de regla válidos permitidos evita el mantenimiento individual de cada regla e impide que la actualización de la directiva falle debido a una regla desconocida.function Test-RuleIsRemovedFromDRS22 { param ( [string]$RuleId, [string]$CurrentRulesetVersion # Retained for compatibility; not used ) # Complete set of rule IDs that exist in DRS 2.2. # Any override or exclusion for a rule NOT in this set is dropped during migration. $drs22RuleIds = @( "200002","200003", "911100", "920100","920120","920121","920160","920170","920171","920180","920181","920190","920200","920201","920210","920220","920230","920240","920260","920270","920271","920280","920290","920300","920310","920311","920320","920330","920340","920341","920350","920420","920430","920440","920450","920470","920480","920500","920530","920620", "921110","921120","921130","921140","921150","921151","921160","921190","921200","921422", "930100","930110","930120","930130", "931100","931110","931120","931130", "932100","932105","932110","932115","932120","932130","932140","932150","932160","932170","932171","932180", "933100","933110","933120","933130","933140","933150","933151","933160","933170","933180","933200","933210", "934100", "941100","941101","941110","941120","941130","941140","941150","941160","941170","941180","941190","941200","941210","941220","941230","941240","941250","941260","941270","941280","941290","941300","941310","941320","941330","941340","941350","941360","941370","941380", "942100","942110","942120","942140","942150","942160","942170","942180","942190","942200","942210","942220","942230","942240","942250","942260","942270","942280","942290","942300","942310","942320","942330","942340","942350","942360","942361","942370","942380","942390","942400","942410","942430","942440","942450","942470","942480","942500","942510", "943100","943110","943120", "944100","944110","944120","944130","944200","944210","944240","944250", "99005002","99005003","99005004","99005005","99005006", "99030001","99030002","99030003","99030004","99030005","99030006", "99031001","99031002","99031003","99031004","99031005","99031006", "99001001","99001002","99001003","99001004","99001005","99001006","99001007","99001008","99001009","99001010","99001011","99001012","99001013","99001014","99001015","99001016","99001017","99001018", "99032001","99032002" ) return -not ($drs22RuleIds -contains $RuleId) }Al crear nuevos objetos de sobrescritura, utilice los nombres de grupo de DRS 2.2. La siguiente función asigna los nombres de los grupos heredados de CRS a los grupos de DRS. Los nombres de grupo de origen de DRS que no están en el mapa (por ejemplo, al actualizar desde DRS 2.1) se devuelven sin cambios:
function Get-DrsRuleGroupName { param ( [Parameter(Mandatory = $true)] [string]$SourceGroupName ) $groupMap = @{ "REQUEST-930-APPLICATION-ATTACK-LFI" = "LFI" "REQUEST-931-APPLICATION-ATTACK-RFI" = "RFI" "REQUEST-932-APPLICATION-ATTACK-RCE" = "RCE" "REQUEST-933-APPLICATION-ATTACK-PHP" = "PHP" "REQUEST-941-APPLICATION-ATTACK-XSS" = "XSS" "REQUEST-942-APPLICATION-ATTACK-SQLI" = "SQLI" "REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION" = "FIX" "REQUEST-944-APPLICATION-ATTACK-JAVA" = "JAVA" "REQUEST-921-PROTOCOL-ATTACK" = "PROTOCOL-ATTACK" "REQUEST-911-METHOD-ENFORCEMENT" = "METHOD-ENFORCEMENT" "REQUEST-920-PROTOCOL-ENFORCEMENT" = "PROTOCOL-ENFORCEMENT" "REQUEST-913-SCANNER-DETECTION" = $null # No direct mapping "Known-CVEs" = "MS-ThreatIntel-CVEs" "General" = "General" } if ($groupMap.ContainsKey($SourceGroupName)) { return $groupMap[$SourceGroupName] } else { return $SourceGroupName # No known mapping; pass through (DRS source group names) } }Utilice el siguiente código de PowerShell para definir las anulaciones de las reglas, duplicando las anulaciones de la versión existente del conjunto de reglas:
$groupOverrides = @() foreach ($group in $currentManagedRuleset.RuleGroupOverrides) { $mappedGroupName = Get-DrsRuleGroupName $group.RuleGroupName if (-not $mappedGroupName) { continue } # Skip groups with no DRS equivalent foreach ($existingRule in $group.Rules) { if (-not (Test-RuleIsRemovedFromDRS22 $existingRule.RuleId $currentVersion)) { $existingGroup = $groupOverrides | Where-Object { $_.RuleGroupName -eq $mappedGroupName } if ($existingGroup) { if (-not ($existingGroup.Rules | Where-Object { $_.RuleId -eq $existingRule.RuleId })) { $existingGroup.Rules.Add($existingRule) } } else { $newGroup = New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride ` -RuleGroupName $mappedGroupName ` -Rule @($existingRule) $groupOverrides += $newGroup } } } }Use el siguiente código de PowerShell para duplicar las exclusiones existentes y aplicarlas en DRS 2.2:
# Create new exclusion objects $newRuleSetExclusions = @() if ($currentExclusions -ne $null -and $currentExclusions.Count -gt 0) { foreach ($exclusion in $currentExclusions) { $newExclusion = New-AzApplicationGatewayFirewallPolicyExclusion ` -MatchVariable $exclusion.MatchVariable ` -SelectorMatchOperator $exclusion.SelectorMatchOperator ` -Selector $exclusion.Selector # Migrate scopes: RuleSet, RuleGroup, or individual Rules if ($exclusion.ExclusionManagedRuleSets) { foreach ($scope in $exclusion.ExclusionManagedRuleSets) { # Create RuleGroup objects from existing RuleGroups $ruleGroups = @() foreach ($group in $scope.RuleGroups) { $drsGroupName = Get-DrsRuleGroupName $group.RuleGroupName if ($drsGroupName) { $exclusionRules = @() foreach ($rule in $group.Rules) { if (-not (Test-RuleIsRemovedFromDRS22 $rule.RuleId $currentVersion)) { $exclusionRules += New-AzApplicationGatewayFirewallPolicyExclusionManagedRule ` -RuleId $rule.RuleId } } if ($exclusionRules -ne $null -and $exclusionRules.Count -gt 0) { $ruleGroups += New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup ` -Name $drsGroupName ` -Rule $exclusionRules } else { $ruleGroups += New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleGroup ` -Name $drsGroupName } } } # Create the ManagedRuleSet scope object with the updated RuleGroups if ($ruleGroups.Count -gt 0) { $newRuleSetScope = New-AzApplicationGatewayFirewallPolicyExclusionManagedRuleSet ` -Type "Microsoft_DefaultRuleSet" ` -Version "2.2" ` -RuleGroup $ruleGroups # Add to the new exclusion object $newExclusion.ExclusionManagedRuleSets += $newRuleSetScope } } } if (-not $newExclusion.ExclusionManagedRuleSets) { $newExclusion.ExclusionManagedRuleSets = @() } $newRuleSetExclusions += $newExclusion } }
Validar reglas nuevas de forma segura
Al actualizar, las nuevas reglas de DRS 2.2 que pertenecen al nivel 1 de Paranoia están habilitadas de forma predeterminada. Si el WAF está en modo de prevención , establezca estas nuevas reglas en el modo de registro en primer lugar para que pueda revisar los registros antes de habilitar el bloqueo.
Las reglas que pertenecen al nivel 2 de Paranoia están deshabilitadas de forma predeterminada en DRS 2.2 y no bloquean el tráfico, por lo que no requieren este paso. Si desea operar en el Nivel de Paranoia 2, habilite explícitamente las reglas pertinentes de PL2 y siga el mismo enfoque de validar en el registro.
Use la definición que coincida con la versión de la que va a actualizar. Cada definición enumera las reglas que se introducen y habilitan de forma predeterminada en DRS 2.2 en comparación con esa versión.
# Added and enabled by default in DRS 2.2 compared to CRS 3.0 $rulesAddedInThisVersionByGroup = @{ "General" = @("200002", "200003") "PROTOCOL-ENFORCEMENT" = @("920171", "920181", "920470", "920480", "920500", "920530", "920620") "PROTOCOL-ATTACK" = @("921190", "921200") "RCE" = @("932180") "PHP" = @("933200", "933210") "NODEJS" = @("934100") "XSS" = @("941360", "941370") "SQLI" = @("942500") "JAVA" = @("944100", "944110", "944120", "944130") "MS-ThreatIntel-CVEs" = @("99001018") "MS-ThreatIntel-XSS" = @("99032001") }# Added and enabled by default in DRS 2.2 compared to CRS 3.1 $rulesAddedInThisVersionByGroup = @{ "General" = @("200002", "200003") "PROTOCOL-ENFORCEMENT" = @("920181", "920500", "920530", "920620") "PROTOCOL-ATTACK" = @("921190", "921200") "PHP" = @("933200", "933210") "NODEJS" = @("934100") "XSS" = @("941360", "941370") "SQLI" = @("942500") "MS-ThreatIntel-CVEs" = @("99001018") "MS-ThreatIntel-XSS" = @("99032001") }# Added and enabled by default in DRS 2.2 compared to CRS 3.2 $rulesAddedInThisVersionByGroup = @{ "PROTOCOL-ENFORCEMENT" = @("920181", "920500", "920530", "920620") "PROTOCOL-ATTACK" = @("921190", "921200") "NODEJS" = @("934100") "XSS" = @("941370") "MS-ThreatIntel-CVEs" = @("99001018") "MS-ThreatIntel-XSS" = @("99032001") }# Added and enabled by default in DRS 2.2 compared to DRS 2.1 $rulesAddedInThisVersionByGroup = @{ "PROTOCOL-ENFORCEMENT" = @("920530", "920620") "MS-ThreatIntel-XSS" = @("99032001") }Use el siguiente código de PowerShell para agregar las nuevas invalidaciones de regla al objeto existente
$groupOverridesdefinido anteriormente:foreach ($groupName in $rulesAddedInThisVersionByGroup.Keys) { $ruleOverrides = @() foreach ($ruleId in $rulesAddedInThisVersionByGroup[$groupName]) { $existingGroup = $groupOverrides | Where-Object { $_.RuleGroupName -eq $groupName } $alreadyExists = $false if ($existingGroup) { $alreadyExists = $existingGroup.Rules | Where-Object { $_.RuleId -eq $ruleId } } if (-not $alreadyExists) { $ruleOverrides += New-AzApplicationGatewayFirewallPolicyManagedRuleOverride ` -RuleId $ruleId ` -Action "Log" ` -State "Enabled" } } # Only create or update the group override if we added rules to it if ($ruleOverrides.Count -gt 0) { $existingGroup = $groupOverrides | Where-Object { $_.RuleGroupName -eq $groupName } if ($existingGroup) { foreach ($ruleOverride in $ruleOverrides) { $existingGroup.Rules.Add($ruleOverride) } } else { $groupOverrides += New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride ` -RuleGroupName $groupName ` -Rule $ruleOverrides } } }
Aplicación de personalizaciones y actualización
Defina el objeto de directiva actualizado de Azure WAF, incorporando las anulaciones de reglas y exclusiones duplicadas y actualizadas:
$managedRuleSet = New-AzApplicationGatewayFirewallPolicyManagedRuleSet `
-RuleSetType "Microsoft_DefaultRuleSet" `
-RuleSetVersion "2.2" `
-RuleGroupOverride $groupOverrides
# Replace the existing CRS (OWASP) or DRS (Microsoft_DefaultRuleSet) managed rule set
for ($i = 0; $i -lt $wafPolicy.ManagedRules.ManagedRuleSets.Count; $i++) {
if ($wafPolicy.ManagedRules.ManagedRuleSets[$i].RuleSetType -eq "OWASP" -or
$wafPolicy.ManagedRules.ManagedRuleSets[$i].RuleSetType -eq "Microsoft_DefaultRuleSet") {
$wafPolicy.ManagedRules.ManagedRuleSets[$i] = $managedRuleSet
break
}
}
# Assign the migrated exclusions to the policy
$wafPolicy.ManagedRules.Exclusions = $newRuleSetExclusions
# Apply the updated WAF policy
Set-AzApplicationGatewayFirewallPolicy -InputObject $wafPolicy