Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: ✔️ Anwendungsgateway V2
Der von Azure verwaltete Standardregelsatz (DEFAULT Rule Set, DRS) in azure Application Gateway Web Application Firewall (WAF) schützt Webanwendungen vor allgemeinen Sicherheitsrisiken und Exploits, einschließlich der OWASP-Top-10-Angriffstypen. Der Standardregelsatz enthält auch die Microsoft Threat Intelligence Collection-Regeln. Führen Sie immer die neueste Regelsatzversion aus, die die neuesten Sicherheitsupdates, Regelverbesserungen und Fixes enthält.
Der von Azure verwaltete Standardregelsatz (DEFAULT Rule Set, DRS) ist die neueste Generation von Regelets in Azure WAF, wobei alle vorherigen Hauptregelsatzversionen (Core Rule Set, CRS) ersetzt werden. Verwenden Sie bei den DRS-Versionen immer die höchste verfügbare Version (DRS 2.2), um sicherzustellen, dass Sie über die aktuellsten Schutzfunktionen verfügen.
Dieser Artikel enthält PowerShell-Beispiele für das Upgrade Ihrer Azure WAF-Richtlinie auf DRS 2.2 von CRS 3.0, CRS 3.1, CRS 3.2 oder DRS 2.1.
Hinweis
PowerShell-Codeausschnitte sind nur Beispiele. Ersetzen Sie alle Platzhalter durch Werte aus Ihrer Umgebung.
Voraussetzungen
Ein Azure-Konto mit einem aktiven Abonnement. Kostenlos ein Konto erstellen.
Eine vorhandene Azure WAF-Richtlinie mit einem angewendeten Kernregelsatz (Core Rule Set, CRS) oder einem Standardregelsatz (Default Rule Set, DRS). Wenn Sie noch keine WAF-Richtlinie besitzen, lesen Sie " Erstellen von Webanwendungsfirewallrichtlinien für das Anwendungsgateway".
Die neueste Version von Azure PowerShell ist lokal installiert. Dieser Artikel erfordert das Az.Network-Modul.
Wichtige Überlegungen beim Upgraden
Stellen Sie beim Aktualisieren der Azure WAF-Regelsatzversion Folgendes sicher:
Beibehalten vorhandener Anpassungen: Übernehmen der Regelaktionsüberschreibungen, Regelstatus (aktiviert oder deaktiviert) und Ausschlüsse.
Anpassungen für entfernte Regeln verwerfen: Übernehmen Sie keine Außerkraftsetzungen oder Ausschlüsse für Regeln, die in DRS 2.2 nicht mehr existieren. Das Übernehmen einer Außerkraftsetzung für eine Regel, die DRS 2.2 nicht enthält, führt dazu, dass die Richtlinienaktualisierung mit einer Fehlermeldung wie etwa
The override Rule '<id>' is unknown for RuleGroup '<group>'fehlschlägt.Berücksichtigen der Ausgangsbasis der Paranoia-Stufe: DRS 2.2 arbeitet standardmäßig mit Paranoia-Stufe 1 (PL1), und alle PL2-Regeln sind standardmäßig deaktiviert. In CRS 3.2 und DRS 2.1 waren PL2-Regeln aktiv. Alle zuvor angepassten PL2-Regeln werden standardmäßig in DRS 2.2 deaktiviert, bis Sie sie explizit erneut aktivieren.
Sichere Überprüfung neuer Regeln: Neu hinzugefügte Regeln, die standardmäßig aktiviert sind (PL1), werden zunächst auf den Protokollmodus festgelegt, sodass Sie ihre Auswirkungen überwachen und optimieren können, bevor Sie die Blockierung aktivieren.
Bereiten Sie Ihre Umgebung und Variablen vor
Legen Sie den Kontext für Ihr ausgewähltes Abonnement, die Ressourcengruppe und Azure WAF-Richtlinie fest.
Import-Module Az.Network Set-AzContext -SubscriptionId "<subscription_id>" $resourceGroupName = "<resource_group>" $wafPolicyName = "<policy_name>"Rufen Sie das WAF-Richtlinienobjekt auf und holen Sie dessen Definitionen ein. Das aktuelle verwaltete Regelset kann vom Typ CRS (
OWASP) oder DRS (Microsoft_DefaultRuleSet) sein.$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
Beibehalten vorhandener Anpassungen
Übernehmen Sie eine Ausnahme oder einen Ausschluss nur, wenn die Regel in DRS 2.2 noch existiert. Mit der folgenden Funktion wird eine Regel-ID anhand des vollständigen Satzes von DRS 2.2-Regeln überprüft und
$truefür jede Regel zurückgegeben, die entfernt wurde (einschließlich legacy- und inaktiver Regeln wie920460,942130und920250). Die Verwendung einer Zulassungsliste gültiger Regel-IDs verhindert die Wartung pro Regel und verhindert, dass das Richtlinienupdate bei einer unbekannten Regel fehlschlägt.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) }Verwenden Sie beim Erstellen neuer Außerkraftsetzungsobjekte die DRS 2.2-Gruppennamen. Die folgende Funktion ordnet ältere CRS-Gruppennamen DRS-Gruppen zu. DRS-Quellgruppennamen, die sich nicht in der Zuordnung befinden (z. B. beim Upgrade von DRS 2.1) werden unverändert zurückgegeben:
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) } }Verwenden Sie den folgenden PowerShell-Code, um die Außerkraftsetzungen der Regeln zu definieren und Außerkraftsetzungen aus der vorhandenen Regelsatzversion zu duplizieren:
$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 } } } }Verwenden Sie den folgenden PowerShell-Code, um Ihre vorhandenen Ausschlüsse zu duplizieren und auf DRS 2.2 anzuwenden:
# 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 } }
Sicheres Überprüfen neuer Regeln
Wenn Sie ein Upgrade durchführen, sind neue DRS 2.2-Regeln, die zu Paranoia Level 1 gehören, standardmäßig aktiviert. Wenn sich Ihr WAF im Verhinderungsmodus befindet, legen Sie diese neuen Regeln zuerst auf den Protokollmodus fest, damit Sie Protokolle überprüfen können, bevor Sie die Blockierung aktivieren.
Regeln, die zu Paranoia Level 2 gehören, sind in DRS 2.2 standardmäßig deaktiviert und blockieren keinen Datenverkehr, sodass dieser Schritt nicht erforderlich ist. Wenn Sie auf Paranoia Level 2 arbeiten möchten, aktivieren Sie die relevanten PL2-Regeln explizit, und befolgen Sie den gleichen Validate-in-Log-Ansatz.
Verwenden Sie die Definition, die der Version entspricht, von der aus Sie aktualisieren. Jede Definition listet die Regeln auf, die im Vergleich zu dieser Version standardmäßig in DRS 2.2 eingeführt und aktiviert werden.
# 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") }Verwenden Sie den folgenden PowerShell-Code, um dem zuvor definierten vorhandenen
$groupOverridesObjekt die neuen Regelüberschreibungen hinzuzufügen: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 } } }
Anpassungen und Upgrades anwenden
Definieren Sie Ihr aktualisiertes Azure WAF-Richtlinienobjekt mit den duplizierten und aktualisierten Regelüberschreibungen und Ausschlüssen:
$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