Atualizar a versão do conjunto de regras de CRS ou DRS

Aplica-se a: ✔️ Gateway de Aplicativo V2

O Conjunto de Regras Padrão (DRS) gerenciado pelo Azure no Firewall de Aplicativo Web (WAF) do Gateway de Aplicativo do Azure protege os aplicativos web contra vulnerabilidades e explorações comuns, incluindo os 10 principais tipos de ataque OWASP. O conjunto de regras padrão também incorpora as regras da Coleção de Inteligência contra Ameaças da Microsoft. É recomendável sempre executar a versão mais recente do conjunto de regras, que inclui as atualizações de segurança mais recentes, aprimoramentos de regra e correções.

O DRS (Conjunto de Regras Padrão) gerenciado pelo Azure é a última geração de conjuntos de regras no WAF do Azure, substituindo todas as versões anteriores do CRS (Conjunto de Regras Principais). Entre as versões DRS, sempre use a versão mais alta disponível (por exemplo, DRS 2.2 quando lançada) para garantir que você tenha as proteções mais atualizadas.

Este artigo fornece exemplos do PowerShell para atualizar sua política de WAF do Azure para o DRS 2.1. Embora os exemplos façam referência especificamente ao DRS 2.1, você sempre deve atualizar para a versão mais recente do DRS disponível para garantir a proteção máxima.

Observação

Snippets do PowerShell são apenas exemplos. Substitua todos os placeholders por valores de seu ambiente.

Pré-requisitos

Principais considerações ao atualizar

Ao atualizar sua versão do conjunto de regras do WAF do Azure, certifique-se de:

  • Preserve as personalizações existentes: carregue as substituições da ação de regra, as substituições de status da regra (habilitadas/desabilitadas) e as exclusões.

  • Valide as novas regras com segurança: verifique se as regras recém-adicionadas estão inicialmente definidas como modo de log, para que você possa monitorar o impacto e ajustá-las antes de habilitar o bloqueio.

Preparar seu ambiente e variáveis

  1. Defina o contexto da assinatura selecionada, do grupo de recursos e da política do WAF do Azure.

    Import-Module Az.Network
    Set-AzContext -SubscriptionId "<subscription_id>"
    $resourceGroupName = "<resource_group>"
    $wafPolicyName = "<policy_name>"
    
  2. Obtenha o objeto de política WAF e recupere suas definições.

    $wafPolicy = Get-AzApplicationGatewayFirewallPolicy ` 
    -Name $wafPolicyName ` 
    -ResourceGroupName $resourceGroupName 
    $currentExclusions = $wafPolicy.ManagedRules.Exclusions 
    $currentManagedRuleset = $wafPolicy.ManagedRules.ManagedRuleSets | Where-Object { $_.RuleSetType -eq "OWASP" } 
    $currentVersion = $currentManagedRuleset.RuleSetVersion
    

Preservar personalizações existentes

  1. Não copie substituições ou exclusões que se apliquem a regras removidas no DRS 2.1. A função a seguir verifica se uma regra foi removida:

    function Test-RuleIsRemovedFromDRS21 { 
        param ( 
            [string]$RuleId, 
            [string]$CurrentRulesetVersion 
        ) 
        $removedRulesByCrsVersion = @{ 
            "3.0" = @( "200004", "913100", "913101", "913102", "913110", "913120", "920130", "920140", "920250", "921100", "800100", "800110", "800111", "800112", "800113" ) 
            "3.1" = @( "200004", "913100", "913101", "913102", "913110", "913120", "920130", "920140", "920250", "800100", "800110", "800111", "800112", "800113", "800114" ) 
            "3.2" = @( "200004", "913100", "913101", "913102", "913110", "913120", "920250", "800100", "800110", "800111", "800112", "800113", "800114" ) 
            } 
        # If the version isn't known, assume rule has not been removed 
        if (-not $removedRulesByCrsVersion.ContainsKey($CurrentRulesetVersion)) { 
            return $false 
            } 
        return $removedRulesByCrsVersion[$CurrentRulesetVersion] -contains $RuleId }
    
  2. Ao criar novos objetos de substituição, use os nomes de grupo DRS 2.1. A função a seguir mapeia nomes de grupos CRS legados para grupos DRS 2.1.

    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 
            } 
        }
    
  3. Use o seguinte código do PowerShell para definir os overrides das regras, replicando os overrides da versão existente do conjunto de regras.

    $groupOverrides = @() 
    foreach ($group in $currentManagedRuleset.RuleGroupOverrides) {
      $mappedGroupName = Get-DrsRuleGroupName $group.RuleGroupName 
        foreach ($existingRule in $group.Rules) { 
    if (-not (Test-RuleIsRemovedFromDRS21 $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 } } } }
    
    
  4. Use o seguinte código do PowerShell para duplicar suas exclusões existentes e aplicá-las no DRS 2.1:

    # 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-RuleIsRemovedFromDRS21 $rule.RuleId "3.2"))
    								{
    								$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.1" `
    						-RuleGroup $ruleGroups
    				}
    
    				# Add to the new exclusion object
    				$newExclusion.ExclusionManagedRuleSets += $newRuleSetScope
    			}
    		}
    
    		if (-not $newExclusion.ExclusionManagedRuleSets)
    		{
    			$newExclusion.ExclusionManagedRuleSets = @()
    		}
    
    		$newRuleSetExclusions += $newExclusion
    	}
    }
    

Validar novas regras com segurança

Quando você atualiza, as novas regras do DRS 2.1 estão ativas por padrão. Se o WAF estiver no modo prevenção, defina as novas regras para o modo de registro primeiro. O modo de log permite que você examine os logs antes de habilitar o bloqueio.

  1. As seguintes definições do PowerShell são para regras introduzidas no DRS 2.1 em comparação com cada versão do CRS:

    # Added in DRS 2.1 compared to CRS 3.0 
    $rulesAddedInThisVersionByGroup = @{ 
        "General" = @("200002", "200003") 
        "PROTOCOL-ENFORCEMENT" = @("920121", "920171", "920181", "920341", "920470", "920480", "920500") 
        "PROTOCOL-ATTACK" = @("921190", "921200") 
        "RCE" = @("932180") 
        "PHP" = @("933200", "933210") 
        "NODEJS" = @("934100") 
        "XSS" = @("941101", "941360", "941370", "941380") 
        "SQLI" = @("942361", "942470", "942480", "942500", "942510") 
        "JAVA" = @("944100", "944110", "944120", "944130", "944200", "944210", "944240", "944250") 
        "MS-ThreatIntel-WebShells" = @("99005002", "99005003", "99005004", "99005005", "99005006") 
        "MS-ThreatIntel-AppSec" = @("99030001", "99030002") 
        "MS-ThreatIntel-SQLI" = @("99031001", "99031002", "99031003", "99031004") 
        "MS-ThreatIntel-CVEs" = @( "99001001","99001002","99001003","99001004","99001005","99001006", "99001007","99001008","99001009","99001010","99001011","99001012", "99001013","99001014","99001015","99001016","99001017" ) 
    }
    
    # Added in DRS 2.1 compared to CRS 3.1 
        $rulesAddedInThisVersionByGroup = @{ 
        "General" = @("200002", "200003") 
        "PROTOCOL-ENFORCEMENT" = @("920181", "920500") 
        "PROTOCOL-ATTACK" = @("921190", "921200") 
        "PHP" = @("933200", "933210") 
        "NODEJS" = @("934100") 
        "XSS" = @("941360", "941370", "941380") 
        "SQLI" = @("942500", "942510") 
        "MS-ThreatIntel-WebShells" = @("99005002", "99005003", "99005004", "99005005", "99005006") 
        "MS-ThreatIntel-AppSec" = @("99030001", "99030002") 
        "MS-ThreatIntel-SQLI" = @("99031001", "99031002", "99031003", "99031004") "MS-ThreatIntel-CVEs" = @( "99001001","99001002","99001003","99001004","99001005","99001006", "99001007","99001008","99001009","99001010","99001011","99001012", "99001013","99001014","99001015","99001016","99001017" ) 
    }
    
    # Added in DRS 2.1 compared to CRS 3.2 
    $rulesAddedInThisVersionByGroup = @{ 
        "General" = @("200002", "200003") 
        "PROTOCOL-ENFORCEMENT" = @("920181", "920500") 
        "PROTOCOL-ATTACK" = @("921190", "921200") 
        "PHP" = @("933200", "933210") 
        "NODEJS" = @("934100") 
        "XSS" = @("941360", "941370", "941380") 
        "SQLI" = @("942100", "942500", "942510") 
        "MS-ThreatIntel-WebShells" = @("99005002", "99005003", "99005004", "99005005", "99005006") 
        "MS-ThreatIntel-AppSec" = @("99030001", "99030002") 
        "MS-ThreatIntel-SQLI" = @("99031001", "99031002", "99031003", "99031004") 
        "MS-ThreatIntel-CVEs" = @( "99001001","99001002","99001003","99001004","99001005","99001006", "99001007","99001008","99001009","99001010","99001011","99001012", "99001013","99001014","99001015","99001016","99001017" ) 
    }
    
    
  2. Use o seguinte código do PowerShell para adicionar novas substituições de regra ao objeto existente $groupOverrides definido anteriormente:

    foreach ($groupName in $rulesAddedInDRS21.Keys) { 
        $ruleOverrides = @() 
        foreach ($ruleId in $rulesAddedInDRS21[$groupName]) { 
            $alreadyExists = $existingOverrides | 
                Where-Object { $_.RuleId -eq $ruleId } 
            if (-not $alreadyExists) { 
                $ruleOverrides += New-AzApplicationGatewayFirewallPolicyManagedRuleOverride ` 
                -RuleId $ruleId ` 
                -Action "Log" ` 
                -State "Enabled" 
                } 
            } # Only create group override if we added rules to it 
        if ($ruleOverrides.Count -gt 0) { 
            $groupOverrides += New-AzApplicationGatewayFirewallPolicyManagedRuleGroupOverride ` 
                -RuleGroupName $groupName ` 
                -Rule $ruleOverrides } 
                }
    

Aplicar personalizações e atualização

Defina seu objeto de política atualizado do WAF do Azure, incorporando as substituições e exclusões de regras duplicadas e atualizadas:

$managedRuleSet = New-AzApplicationGatewayFirewallPolicyManagedRuleSet ` 
    -RuleSetType "Microsoft_DefaultRuleSet" ` 
    -RuleSetVersion "2.1" ` 
    -RuleGroupOverride $groupOverrides 
for ($i = 0; $i -lt $wafPolicy.ManagedRules.ManagedRuleSets.Count; $i++) { 
    if ($wafPolicy.ManagedRules.ManagedRuleSets[$i].RuleSetType -eq "OWASP") { 
    $wafPolicy.ManagedRules.ManagedRuleSets[$i] = $managedRuleSet 
    break 
    } 
} 
# Assign to policy
if ($newRuleSetExclusions) {
    $wafPolicy.ManagedRules.Exclusions = $currentExclusions + $newRuleSetExclusions 
}
# Apply the updated WAF policy 
Set-AzApplicationGatewayFirewallPolicy -InputObject $wafPolicy