CRS veya DRS kural kümesi sürümünü yükseltme

Şunlar için geçerlidir: ✔️ Application Gateway V2

Azure Application Gateway Web Uygulaması Güvenlik Duvarı'ndaki (WAF) Azure tarafından yönetilen Varsayılan Kural Kümesi (DRS ), OWASP ilk 10 saldırı türü de dahil olmak üzere web uygulamalarını yaygın güvenlik açıklarına ve açıklardan yararlanmalara karşı korur. Varsayılan kural kümesi, Microsoft Tehdit Bilgileri Toplama kurallarını da içerir. Her zaman en son güvenlik güncelleştirmelerini, kural iyileştirmelerini ve düzeltmeleri içeren en son kural kümesi sürümünü çalıştırın.

Azure tarafından yönetilen Varsayılan Kural Kümesi (DRS), Önceki tüm Temel Kural Kümesi (CRS) sürümlerinin yerine Azure WAF'deki en son nesil kural kümeleridir. DRS sürümleri içinde, en güncel korumalara sahip olduğunuzdan emin olmak için her zaman kullanılabilen en yüksek sürümü (DRS 2.2) kullanın.

Bu makalede, Azure WAF ilkenizi CRS 3.0, CRS 3.1, CRS 3.2 veya DRS 2.1'den DRS 2.2'ye yükseltmeye yönelik PowerShell örnekleri sağlanır.

Uyarı

PowerShell kod parçacıkları yalnızca örnektir. Tüm yer tutucuları ortamınızdaki değerlerle değiştirin.

Önkoşullar

Yükseltme sırasında dikkat edilmesi gereken önemli noktalar

Azure WAF kural kümesi sürümünüzü yükseltirken şunları yaptığınızdan emin olun:

  • Mevcut özelleştirmeleri koruyun: kural eylemi geçersiz kılma ayarlarınızı, kural durumu (etkin veya devre dışı) geçersiz kılma ayarlarınızı ve dışlamaları aktarır.

  • Kaldırılan kurallar için özelleştirmeleri kaldırın: DRS 2.2'de artık bulunmayan kurallar için geçersiz kılmaları veya dışlamaları devretmeyin. DRS 2.2’de bulunmayan bir kural için tanımlı geçersiz kılma ayarını devretmek, ilke güncellemesinin The override Rule '<id>' is unknown for RuleGroup '<group>' gibi bir hatayla başarısız olmasına neden olur.

  • Paranoya Düzeyi temeli hesabı: DRS 2.2 varsayılan olarak Paranoya Düzey 1'de (PL1) çalışır ve tüm PL2 kuralları varsayılan olarak devre dışı bırakılır. CRS 3.2 ve DRS 2.1'de PL2 kuralları etkindi. Daha önce özelleştirdiğiniz tüm PL2 kuralları, siz açıkça yeniden etkinleştirene kadar DRS 2.2'de varsayılan olarak devre dışı bırakılır.

  • Yeni kuralları güvenli bir şekilde doğrulayın: Varsayılan olarak etkinleştirilen yeni eklenen kurallar (PL1) başlangıçta günlük moduna ayarlanır, böylece engellemeyi etkinleştirmeden önce etkilerini izleyebilir ve ince ayar yapabilirsiniz.

Ortamınızı ve değişkenlerinizi hazırlama

  1. Seçtiğiniz abonelik, kaynak grubu ve Azure WAF ilkesinin bağlamını ayarlayın.

    Import-Module Az.Network
    Set-AzContext -SubscriptionId "<subscription_id>"
    $resourceGroupName = "<resource_group>"
    $wafPolicyName = "<policy_name>"
    
  2. WAF ilke nesnesini alın ve tanımlarını edinin. Geçerli yönetilen kural kümesi bir CRS (OWASP) veya DRS (Microsoft_DefaultRuleSet) türü olabilir.

    $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
    

Mevcut özelleştirmeleri koru

  1. Geçersiz kılmayı veya dışlama işlemini yalnızca kural DRS 2.2'de hala mevcutsa gerçekleştirin. Aşağıdaki işlev, bir kural kimliğini DRS 2.2 kurallarının tam kümesine göre doğrular ve kaldırılmış olan herhangi bir kural için (eski ve etkin olmayan 920460, 942130 ve 920250 gibi kurallar dahil) $true döndürür. Geçerli kural kimliklerinden oluşan bir izin listesinin kullanılması, her bir kural için bakım yapılması gereksinimini ortadan kaldırır ve ilke güncellemesinin bilinmeyen bir kural nedeniyle başarısız olmasını önler.

    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)
    }
    
  2. Yeni geçersiz kılma nesneleri oluştururken DRS 2.2 grup adlarını kullanın. Aşağıdaki işlev eski CRS grup adlarını DRS gruplarına eşler. Haritada olmayan DRS kaynak grubu adları (örneğin, DRS 2.1'den yükseltirken) değiştirilmeden döndürülür:

    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)
        }
    }
    
  3. Kurallar için geçersiz kılmaları tanımlamak üzere, mevcut kural kümesi sürümündeki geçersiz kılmaları kopyalayarak aşağıdaki PowerShell kodunu kullanın:

    $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
                }
            }
        }
    }
    
  4. Mevcut dışlamalarınızı çoğaltmak ve BUNLARı DRS 2.2'ye uygulamak için aşağıdaki PowerShell kodunu kullanın:

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

Yeni kuralları güvenli bir şekilde doğrulama

Yükseltme yaptığınızda, Paranoya Düzey 1'e ait yeni DRS 2.2 kuralları varsayılan olarak etkinleştirilir. WAF'niz Önleme modundaysa, engellemeyi etkinleştirmeden önce günlükleri gözden geçirebilmeniz için önce bu yeni kuralları günlük moduna ayarlayın.

Paranoya Düzey 2'ye ait kurallar DRS 2.2'de varsayılan olarak devre dışı bırakılır ve trafiği engellemez, bu nedenle bu adımı gerektirmez. Paranoya Düzey 2'de çalışmak istiyorsanız, ilgili PL2 kurallarını açıkça etkinleştirin ve aynı günlükte doğrulama yaklaşımını izleyin.

  1. Yükseltme yaptığınız sürümle eşleşen tanımı kullanın. Her tanım, DRS 2.2'de bu sürümle karşılaştırıldığında varsayılan olarak sunulan ve etkinleştirilen kuralları listeler.

    # 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")
    }
    
  2. Daha önce tanımlanan mevcut $groupOverrides nesneye yeni kural geçersiz kılmalarını eklemek için aşağıdaki PowerShell kodunu kullanın:

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

Özelleştirmeleri ve yükseltmeleri uygulamak

Yinelenen ve güncelleştirilmiş kural geçersiz kılmalarını ve dışlamalarını ekleyerek güncelleştirilmiş Azure WAF ilke nesnenizi tanımlayın:

$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