更改 Azure 防火墙 SKU

本文介绍如何在标准版和高级版之间更改 Azure 防火墙 SKU。 你可以从标准升级到高级,以利用增强的安全功能,或者在不再需要这些功能时从高级降级到标准版。 Azure 防火墙高级版提供高级威胁防护功能,包括 IDPS、TLS 检查和 URL 筛选。

可以使用以下两种方法之一更改防火墙 SKU:

  • 简单的 SKU 更改方法 (建议):使用 Azure 门户、PowerShell 或 Terraform 进行零停机升级或降级
  • 手动迁移方法:复杂方案的分步迁移,或者当简单 SKU 更改不可用时

有关 Azure 防火墙高级功能的详细信息,请参阅 Azure 防火墙高级功能

先决条件

在开始之前,请确保具备:

  • 具有已部署 Azure 防火墙的 Azure 订阅
  • 修改防火墙资源的适当权限(网络参与者角色或更高级别的角色)
  • Azure PowerShell 模块版本 6.5.0 或更高版本(适用于 PowerShell 方法)
  • 计划内维护时段(手动迁移方法)

重要

本文仅适用于 Azure 防火墙标准和高级 SKU。 Azure 防火墙基本 SKU 不支持 SKU 更改,必须先迁移到标准 SKU,然后才能升级到高级版。 始终在计划内维护期间执行 SKU 更改作,并首先在非生产环境中彻底测试该过程。

在零停机的情况下更改 Azure 防火墙 SKU 的最简单方法是使用 “更改 SKU ”功能。 此方法既支持从标准升级到高级,又支持从高级升级到标准版。

何时使用简单的 SKU 更改

在以下情况下使用简单的 SKU 更改方法:

  • 具有防火墙策略的 Azure 防火墙(而非经典规则)
  • 防火墙部署在受支持的区域中
  • 你想要最大程度地减少停机时间(此方法的停机时间为零)
  • 您采用了没有复杂自定义配置的标准部署
  • 降级:高级策略不使用与标准不兼容的高级独占功能

SKU 更改的策略注意事项

升级到高级版

在升级过程中,选择如何处理防火墙策略:

  • 现有高级策略:选择预先存在的高级策略以附加到升级的防火墙
  • 现有标准策略:使用当前的标准策略。 系统自动复制并将其升级到高级策略
  • 创建新的高级策略:让系统基于当前配置创建新的高级策略

降级到标准

从高级降级到标准版时,请考虑以下策略要求:

重要

在降级到标准 SKU 之前,必须先删除或禁用高级独占功能。

降级之前要解决的高级功能:

  • TLS 检查:禁用 TLS 检查规则并删除关联的证书
  • IDPS (入侵检测和防护):将 IDPS 模式从警报更改为“仅警报”或“拒绝”或“关闭”
  • URL 筛选:尽可能将 URL 筛选规则替换为 FQDN 筛选
  • Web 类别:使用特定的 FQDN 规则删除或替换 Web 类别规则

策略处理选项:

  • 使用现有的标准策略:选择不包含高级功能的标准策略
  • 创建新的标准策略:系统可以创建新的标准策略,自动删除特定于高级的功能
  • 修改当前策略:在降级之前从当前策略中手动删除高级功能

使用 Azure 门户更改 SKU

若要使用 Azure 门户更改防火墙 SKU,请执行以下步骤:

升级到高级版

  1. 登录到 Azure 门户
  2. 访问 Azure 防火墙资源。
  3. 在“ 概述 ”页上,选择“ 更改 SKU”。
  4. 在“SKU 更改”对话框中,选择“ 高级 ”作为目标 SKU。
  5. 选择策略选项:
    • 选择现有的高级政策,或
    • 允许系统将当前的标准策略升级到高级版
  6. 选择 “保存” 以开始升级。

降级到标准

  1. 登录到 Azure 门户
  2. 导航到 Azure 防火墙高级资源。
  3. 降级之前:确保防火墙策略不包含高级独占功能(TLS 检查、IDPS 警报和拒绝模式、URL 筛选、Web 类别)。
  4. 在“ 概述 ”页上,选择“ 更改 SKU”。
  5. 在“SKU 更改”对话框中,选择 “标准 ”作为目标 SKU。
  6. 选择策略选项:
    • 选择现有的标准策略,或
    • 允许系统创建新的标准策略(自动删除高级功能)
  7. 选择 “保存 ”以开始降级。

SKU 更改过程通常在几分钟内完成,无需停机。

PowerShell 和 Terraform SKU 更改

也可以使用以下方法执行 SKU 更改:

  • PowerShell:将 sku_tier 属性更改为“Premium”或“Standard”
  • Terraform:将 sku_tier 配置中的属性更新为所需的 SKU

局限性

简单的 SKU 更改方法具有以下限制:

常规限制:

  • 不支持 Azure 防火墙基本 SKU - 基本 SKU 用户必须先迁移到标准版
  • 不适用于具有某些复杂配置的防火墙
  • 某些区域的可用性有限
  • 需要现有的防火墙策略(不适用于经典规则)

降级特定的限制:

  • 在降级之前,必须删除高级功能(TLS 检查、IDPS 警报和拒绝模式、URL 筛选、Web 类别)
  • 如果高级策略包含不兼容的功能,则必须修改策略或创建新的标准策略
  • 降级后,某些规则配置可能需要手动调整

如果简单的 SKU 更改方法不适用于你的方案,请使用下一部分所述的手动迁移方法。

手动迁移方法

如果简单的升级方法不可用或适合部署,则可以使用手动迁移方法。 此方法提供更多的控制权,但需要停机时间。

何时使用手动迁移

在以下情况下使用手动迁移:

  • 轻松升级不适用于你的方案
  • 你有需要迁移的经典防火墙规则
  • 你有复杂的自定义配置
  • 需要完全控制迁移过程
  • 防火墙部署在华东,并分布在多个可用性区域

性能注意事项

从标准 SKU 迁移时,性能是一个考虑因素。 IDPS 和 TLS 检查是计算密集型作。 高级 SKU 使用功能更强大的 VM SKU,该 SKU 可缩放为与标准 SKU 相当的更高吞吐量。 有关 Azure 防火墙性能的详细信息,请参阅 Azure 防火墙性能

Azure 建议客户在其 Azure 部署中执行全面测试,以确保防火墙服务性能符合预期。

停机时间注意事项

使用手动迁移方法时规划维护时段,因为停止/启动过程中有一些停机时间(通常为 20-30 分钟)。

迁移步骤概述

成功手动迁移需要以下常规步骤:

  1. 根据现有的标准策略或经典规则创建新的高级策略
  2. 使用停止/启动将 Azure 防火墙从标准迁移到高级版
  3. 将高级版策略附加到 高级防火墙

步骤 1:将经典规则迁移到标准策略

如果有经典防火墙规则,请先使用 Azure 门户将其迁移到标准策略:

  1. 在 Azure 门户中,选择标准防火墙。
  2. 在“ 概述 ”页上,选择“ 迁移到防火墙策略”。
  3. 在“ 迁移到防火墙策略 ”页上,选择“ 查看 + 创建”。
  4. 选择 创建

部署需要数分钟才能完成。

还可以使用 Azure PowerShell 迁移现有经典规则。 有关详细信息,请参阅 使用 PowerShell 将 Azure 防火墙配置迁移到 Azure 防火墙策略

步骤 2:使用 PowerShell 创建高级策略

使用以下 PowerShell 脚本从现有标准策略创建新的高级策略:

重要

该脚本不会迁移威胁情报和 SNAT 专用范围设置。 在继续之前,您需要注意这些设置并手动迁移它们。

<#
    .SYNOPSIS
        Given an Azure firewall policy id the script will transform it to a Premium Azure firewall policy.
        The script will first pull the policy, transform/add various parameters and then upload a new premium policy.
        The created policy will be named <previous_policy_name>_premium if no new name provided else new policy will be named as the parameter passed.
    .Example
        Transform-Policy -PolicyId /subscriptions/XXXXX-XXXXXX-XXXXX/resourceGroups/some-resource-group/providers/Microsoft.Network/firewallPolicies/policy-name -NewPolicyName <optional param for the new policy name>
#>

param (
    #Resource id of the azure firewall policy.
    [Parameter(Mandatory=$true)]
    [string]
    $PolicyId,

    #new filewallpolicy name, if not specified will be the previous name with the '_premium' suffix
    [Parameter(Mandatory=$false)]
    [string]
    $NewPolicyName = ""
)
$ErrorActionPreference = "Stop"
$script:PolicyId = $PolicyId
$script:PolicyName = $NewPolicyName

function ValidatePolicy {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [Object]
        $Policy
    )

    Write-Host "Validating resource is as expected"

    if ($null -eq $Policy) {
        Write-Error "Received null policy"
        exit(1)
    }
    if ($Policy.GetType().Name -ne "PSAzureFirewallPolicy") {
        Write-Error "Resource must be of type Microsoft.Network/firewallPolicies"
        exit(1)
    }

    if ($Policy.Sku.Tier -eq "Premium") {
        Write-Host "Policy is already premium" -ForegroundColor Green
        exit(1)
    }
}

function GetPolicyNewName {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Azure.Commands.Network.Models.PSAzureFirewallPolicy]
        $Policy
    )

    if (-not [string]::IsNullOrEmpty($script:PolicyName)) {
        return $script:PolicyName
    }

    return $Policy.Name + "_premium"
}

function TransformPolicyToPremium {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Azure.Commands.Network.Models.PSAzureFirewallPolicy]
        $Policy
    )
    $NewPolicyParameters = @{
                        Name = (GetPolicyNewName -Policy $Policy)
                        ResourceGroupName = $Policy.ResourceGroupName
                        Location = $Policy.Location
                        BasePolicy = $Policy.BasePolicy.Id
                        ThreatIntelMode = $Policy.ThreatIntelMode
                        ThreatIntelWhitelist = $Policy.ThreatIntelWhitelist
                        PrivateRange = $Policy.PrivateRange
                        DnsSetting = $Policy.DnsSettings
                        SqlSetting = $Policy.SqlSetting
                        ExplicitProxy  = $Policy.ExplicitProxy
                        DefaultProfile  = $Policy.DefaultProfile
                        Tag = $Policy.Tag
                        SkuTier = "Premium"
    }

    Write-Host "Creating new policy"
    $premiumPolicy = New-AzFirewallPolicy @NewPolicyParameters

    Write-Host "Populating rules in new policy"
    foreach ($ruleCollectionGroup in $Policy.RuleCollectionGroups) {
        $ruleResource = Get-AzResource -ResourceId $ruleCollectionGroup.Id
        $ruleToTransform = Get-AzFirewallPolicyRuleCollectionGroup -AzureFirewallPolicy $Policy -Name $ruleResource.Name
        $ruleCollectionGroup = @{
            FirewallPolicyObject = $premiumPolicy
            Priority = $ruleToTransform.Properties.Priority
            Name = $ruleToTransform.Name
        }

        if ($ruleToTransform.Properties.RuleCollection.Count) {
            $ruleCollectionGroup["RuleCollection"] = $ruleToTransform.Properties.RuleCollection
        }

        Set-AzFirewallPolicyRuleCollectionGroup @ruleCollectionGroup
    }
}

function ValidateAzNetworkModuleExists {
    Write-Host "Validating needed module exists"
    $networkModule = Get-InstalledModule -Name "Az.Network" -MinimumVersion 4.5 -ErrorAction SilentlyContinue
    if ($null -eq $networkModule) {
        Write-Host "Please install Az.Network module version 4.5.0 or higher, see instructions: https://github.com/Azure/azure-powershell#installation"
        exit(1)
    }
    $resourceModule = Get-InstalledModule -Name "Az.Resources" -MinimumVersion 4.2 -ErrorAction SilentlyContinue
    if ($null -eq $resourceModule) {
        Write-Host "Please install Az.Resources module version 4.2.0 or higher, see instructions: https://github.com/Azure/azure-powershell#installation"
        exit(1)
    }
    Import-Module Az.Network -MinimumVersion 4.5.0
    Import-Module Az.Resources -MinimumVersion 4.2.0
}

ValidateAzNetworkModuleExists
$policy = Get-AzFirewallPolicy -ResourceId $script:PolicyId
ValidatePolicy -Policy $policy
TransformPolicyToPremium -Policy $policy

用法示例:

Transform-Policy -PolicyId /subscriptions/XXXXX-XXXXXX-XXXXX/resourceGroups/some-resource-group/providers/Microsoft.Network/firewallPolicies/policy-name

步骤 3:使用停止/启动迁移 Azure 防火墙

如果将 Azure 防火墙标准 SKU 与防火墙策略配合使用,可以使用分配/解除分配方法将防火墙 SKU 迁移到高级版。 虚拟网络中心和安全中心防火墙都支持此迁移方法。

注释

最低 Azure PowerShell 版本要求为 6.5.0。 有关详细信息,请参阅 Az 6.5.0

迁移虚拟网络中心防火墙

释放标准防火墙:

$azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
$azfw.Deallocate()
Set-AzFirewall -AzureFirewall $azfw

分配防火墙高级版(单个公共 IP 地址):

$azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
$azfw.Sku.Tier="Premium"
$vnet = Get-AzVirtualNetwork -ResourceGroupName "<resource-group-name>" -Name "<Virtual-Network-Name>"
$publicip = Get-AzPublicIpAddress -Name "<Firewall-PublicIP-name>" -ResourceGroupName "<resource-group-name>"
$azfw.Allocate($vnet,$publicip)
Set-AzFirewall -AzureFirewall $azfw

分配防火墙高级版(多个公共 IP 地址):

$azfw = Get-AzFirewall -Name "FW Name" -ResourceGroupName "RG Name"
$azfw.Sku.Tier="Premium"
$vnet = Get-AzVirtualNetwork -ResourceGroupName "RG Name" -Name "VNet Name"
$publicip1 = Get-AzPublicIpAddress -Name "Public IP1 Name" -ResourceGroupName "RG Name"
$publicip2 = Get-AzPublicIpAddress -Name "Public IP2 Name" -ResourceGroupName "RG Name"
$azfw.Allocate($vnet,@($publicip1,$publicip2))
Set-AzFirewall -AzureFirewall $azfw

在强制隧道模式下分配防火墙高级版:

$azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
$azfw.Sku.Tier="Premium"
$vnet = Get-AzVirtualNetwork -ResourceGroupName "<resource-group-name>" -Name "<Virtual-Network-Name>"
$publicip = Get-AzPublicIpAddress -Name "<Firewall-PublicIP-name>" -ResourceGroupName "<resource-group-name>"
$mgmtPip = Get-AzPublicIpAddress -ResourceGroupName "<resource-group-name>"-Name "<Management-PublicIP-name>"
$azfw.Allocate($vnet,$publicip,$mgmtPip)
Set-AzFirewall -AzureFirewall $azfw

迁移安全枢纽防火墙

释放标准防火墙:

$azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
$azfw.Deallocate()
Set-AzFirewall -AzureFirewall $azfw

分配防火墙高级版:

$azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
$hub = get-azvirtualhub -ResourceGroupName "<resource-group-name>" -name "<vWANhub-name>"
$azfw.Sku.Tier="Premium"
$azfw.Allocate($hub.id)
Set-AzFirewall -AzureFirewall $azfw

步骤 4:附加尊贵保单

将防火墙升级到高级后,使用 Azure 门户附加高级策略:

  1. 在 Azure 门户中导航到高级防火墙。
  2. 在“ 概述 ”页上,选择 “防火墙策略”。
  3. 选择新建的尊享策略。
  4. 选择“保存”

显示防火墙策略的屏幕截图

Terraform 迁移

如果使用 Terraform 部署 Azure 防火墙,可以使用 Terraform 迁移到 Azure 防火墙高级版。 有关详细信息,请参阅 使用 Terraform 将 Azure 防火墙标准迁移到高级版。

排查 SKU 更改问题

常见问题和解决方案

  • 简单 SKU 更改不可用:使用本文中所述的手动迁移方法
  • 策略迁移错误:确保已安装正确的 PowerShell 模块版本
  • 停机时间超过预期时间:检查网络连接和资源可用性
  • 升级后的性能问题:查看性能注意事项并执行彻底测试
  • 由于高级功能导致降级受阻:在尝试降级之前,请删除或禁用高级功能。

降级故障排除

如果无法从高级降级到标准版:

  1. 检查高级功能:验证防火墙策略是否不包含:

    • TLS 检查规则
    • 警报和拒绝模式下的 IDPS
    • URL 筛选规则
    • Web 类别规则
  2. 策略修改选项

    • 在没有高级功能的情况下创建新的标准策略
    • 修改现有策略以删除高级功能
    • 使用 Azure PowerShell 识别和删除不兼容的规则
  3. 验证步骤

    # Check current firewall policy for Premium features
    $policy = Get-AzFirewallPolicy -ResourceGroupName "myResourceGroup" -Name "myPolicy"
    
    # Review policy settings for Premium features
    $policy.ThreatIntelMode
    $policy.IntrusionDetection
    $policy.TransportSecurity
    

已知的限制

  • 中国东部地区实施的具有可用性区域的标准防火墙目前不支持手动迁移升级。
  • 简单的 SKU 更改不支持基本 SKU 防火墙 - 具有基本 SKU 的用户必须先迁移到标准 SKU,然后才能升级到高级版
  • 某些自定义配置可能需要手动迁移方法
  • 使用活动高级功能降级失败,直到删除这些功能

后续步骤