迁移到 Azure 防火墙高级版

可以将 Azure 防火墙标准版迁移到 Azure 防火墙高级版,以利用新的高级功能。 有关 Azure 防火墙高级版功能的详细信息,请参阅 Azure 防火墙高级版功能

本文将介绍将标准版防火墙和策略手动迁移到高级版所需的步骤。

提示

在无故障时间的情况下更改 Azure 防火墙 SKU 的最简单方法是使用“更改 SKU”功能。 有关详细信息,请参阅 Azure 防火墙轻松升级/降级

开始迁移前,请了解性能注意事项并提前计划所需的维护时段。 通常,预计停机时间为 20-30 分钟。

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

  1. 根据现有的标准版策略或经典规则新建高级版策略。 完成此步骤时,新的高级版策略将包括所有现有的规则和策略设置。
  2. 使用停止/启动将 Azure 防火墙从标准版迁移到高级版
  3. 将新建的高级版策略附加到高级版防火墙

性能注意事项

从标准 SKU 进行迁移时,需要考虑性能。 IDPS 和 TLS 检查是计算密集型操作。 高级 SKU 使用更强大的 VM SKU,相比于标准 SKU,高级 SKU 可以缩放至更高的吞吐量。 若要详细了解 Azure 防火墙性能,请参阅 Azure 防火墙性能

Azure 建议客户在其 Azure 部署中执行完全缩放测试,以确保防火墙服务的性能满足预期。

故障时间

在计划内维护时间内迁移防火墙,因为使用停止/启动将 Azure 防火墙从标准版迁移到高级版时会有一些故障时间。

将经典规则迁移到标准策略

在迁移过程中,可能需要将经典防火墙规则迁移到标准策略。 可以使用 Azure 门户来实现此目的:

  1. 在 Azure 门户中,选择标准防火墙。 在“概述”页上,选择“迁移到防火墙策略”。

    Migrate to firewall policy

  2. 在“迁移到防火墙策略”页上,选择“查看 + 创建”。

  3. 选择“创建” 。

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

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

使用 Azure PowerShell 迁移现有策略

Transform-Policy.ps1 是从现有标准策略创建新高级策略的 Azure PowerShell 脚本。

如果是标准防火墙策略 ID,该脚本会将其转换为高级 Azure 防火墙策略。 此脚本首先连接到 Azure 帐户,拉取策略,转换/添加各种参数,然后上传新的高级策略。 新的高级策略命名为 <previous_policy_name>_premium。 如果它是子策略转换,则会保留父策略的链接。

用法示例:

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

重要

脚本不迁移威胁情报和 SNAT 专用范围设置。 需要先记下这些设置,然后再手动进行迁移。 否则,新升级的防火墙可能会出现流量筛选不一致问题。

此脚本需要最新 Azure PowerShell。 运行 Get-Module -ListAvailable Az,查看已安装哪些版本。 如果需要安装,请参阅安装 Azure PowerShell 模块

<#
    .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 "Recived 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
        $ruleToTransfom = Get-AzFirewallPolicyRuleCollectionGroup -AzureFirewallPolicy $Policy -Name $ruleResource.Name
        $ruleCollectionGroup = @{
            FirewallPolicyObject = $premiumPolicy
            Priority = $ruleToTransfom.Properties.Priority
            Name = $ruleToTransfom.Name
        }

        if ($ruleToTransfom.Properties.RuleCollection.Count) {
            $ruleCollectionGroup["RuleCollection"] = $ruleToTransfom.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

使用 stop/start 迁移 Azure 防火墙

如果将 Azure 防火墙标准 SKU 与防火墙策略一起使用,可以使用分配/解除分配方法将防火墙 SKU 迁移到高级版。 VNet 中心和安全中心防火墙都支持这种迁移方法。 迁移安全中心部署时,它将保留防火墙公共 IP 地址。

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

迁移 VNET 中心防火墙

  • 解除分配标准防火墙

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

将高级版策略附加到高级版防火墙

可以使用 Azure 门户将高级版策略附加到新的高级版防火墙:

Screenshot showing firewall policy

后续步骤