Partager via


Mettre à niveau la version de l’ensemble de règles CRS ou DRS

L’ensemble de règles par défaut géré par Azure dans Azure Application Gateway Web Application Firewall (WAF) protège les applications web contre les vulnérabilités et les attaques courantes, y compris les 10 principaux types d’attaques OWASP. L’ensemble de règles par défaut incorpore également les règles de collecte Microsoft Threat Intelligence. Nous vous recommandons d’exécuter toujours la dernière version de l’ensemble de règles, qui inclut les mises à jour de sécurité les plus récentes, les améliorations des règles et les correctifs.

Le jeu de règles par défaut géré par Azure (DRS) est la dernière génération d’ensembles de règles dans Azure WAF, en remplaçant toutes les versions précédentes de l’ensemble de règles de base (CRS). Parmi les versions de DRS, utilisez toujours la version la plus haute disponible (par exemple, DRS 2.2 lors de la publication) pour vous assurer que vous disposez des protections les plus up-to-date.

Cet article fournit des exemples PowerShell pour mettre à niveau votre stratégie Waf Azure vers DRS 2.1. Bien que les exemples référencent spécifiquement DRS 2.1, vous devez toujours effectuer une mise à niveau vers la dernière version de DRS disponible pour garantir une protection maximale.

Note

Les extraits de code PowerShell sont des exemples uniquement. Remplacez tous les espaces réservés par des valeurs de votre environnement.

Prerequisites

Considérations clés lors de la mise à niveau

Lors de la mise à niveau de votre version de l’ensemble de règles Azure WAF, veillez à :

  • Conservez les personnalisations existantes : reportez les remplacements de votre action de règle, l’état de la règle (activé/désactivé) et les exclusions.

  • Validez les nouvelles règles en toute sécurité : assurez-vous que les règles nouvellement ajoutées sont initialement définies sur le mode journal, afin de pouvoir surveiller leur impact et les ajuster avant d’activer le blocage.

Préparer votre environnement et vos variables

  1. Définissez le contexte de votre abonnement, groupe de ressources et stratégie WAF Azure sélectionnés.

    Import-Module Az.Network
    Set-AzContext -SubscriptionId "<subscription_id>"
    $resourceGroupName = "<resource_group>"
    $wafPolicyName = "<policy_name>"
    
  2. Obtenez l’objet de stratégie WAF et récupérez ses définitions.

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

Conserver les personnalisations existantes

  1. Ne copiez pas les remplacements ou les exclusions qui s’appliquent aux règles supprimées dans DRS 2.1. La fonction suivante vérifie si une règle a été supprimée :

    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. Lors de la création d’objets de remplacement, utilisez les noms de groupe DRS 2.1. La fonction suivante mappe les noms de groupes CRS hérités aux groupes 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. Utilisez le code PowerShell suivant pour définir les remplacements des règles, dupliquer les remplacements à partir de la version du jeu de règles existante :

    $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. Utilisez le code PowerShell suivant pour dupliquer vos exclusions existantes et les appliquer à 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
    	}
    }
    

Valider les nouvelles règles en toute sécurité

Lorsque vous effectuez une mise à niveau, les nouvelles règles DRS 2.1 sont actives par défaut. Si votre WAF est en mode Prévention , définissez d’abord de nouvelles règles sur le mode journal . Le mode journal vous permet d’examiner les journaux avant d’activer le blocage.

  1. Les définitions PowerShell suivantes sont destinées aux règles introduites dans DRS 2.1 par rapport à chaque version 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. Utilisez le code PowerShell suivant pour ajouter de nouvelles substitutions de règle à l’objet existant $groupOverrides défini précédemment :

    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 } 
                }
    

Appliquer des personnalisations et une mise à niveau

Définissez votre objet de stratégie Azure WAF mis à jour, en intégrant les remplacements et exclusions de règles en double et mis à jour :

$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