在新的或现有的应用程序网关上配置 Web 应用程序防火墙

了解如何创建启用了 Web 应用程序防火墙的应用程序网关或如何将 Web 应用程序防火墙添加到现有的应用程序网关。

Azure 应用程序网关中的 Web 应用程序防火墙 (WAF) 可保护 Web 应用程序,使其免受常见 Web 攻击的威胁,例如 SQL 注入、跨站点脚本攻击和会话劫持。

Azure 应用程序网关是第 7 层负载均衡器。 它在不同服务器之间提供故障转移和性能路由 HTTP 请求,而不管它们是在云中还是本地。 应用程序网关提供许多应用程序传送控制器 (ADC) 功能,包括 HTTP 负载均衡、基于 cookie 的会话相关性、安全套接字层 (SSL) 卸载、自定义运行状况探测、多站点支持,以及许多其他功能。 若要查找支持的功能的完整列表,请参阅“应用程序网关概述”

以下文章说明如何将 Web 应用程序防火墙添加到现有的应用程序网关以及如何创建使用 Web 应用程序防火墙的应用程序网关

方案图像

WAF 配置差异

如果已阅读了使用 PowerShell 创建应用程序网关,就能了解创建应用程序网关时需要配置的 SKU 设置。 在应用程序网关上配置 SKU 时,WAF 会提供其他可定义的设置。 不需要对应用程序网关本身进行任何其他更改。

设置 详细信息
SKU 没有 WAF 的普通应用程序网关支持 Standard_SmallStandard_MediumStandard_Large 大小。 随着 WAF 的引入,还提供了其他两个 SKU,分别是 WAF_MediumWAF_Large。 小型应用程序网关不支持 WAF。
可用值为“标准”或 WAF。 使用 Web 应用程序防火墙时,必须选择“WAF”。
模式 此设置是 WAF 的模式。 允许的值为检测阻止。 WAF 设置为检测模式时,所有威胁都会存储在日志文件中。 在阻止模式下,仍然会记录事件,但攻击者会从应用程序网关收到“403 未授权”响应。

将 Web 应用程序防火墙添加到现有的应用程序网关

确保使用最新版本的 Azure PowerShell。 将 Windows PowerShell 与 Resource Manager 配合使用中提供了详细信息。

  1. 登录 Azure 帐户。

    Login-AzureRmAccount -EnvironmentName AzureChinaCloud
    
  2. 选择要用于此方案的订阅。

    Select-AzureRmSubscription -SubscriptionName "<Subscription name>"
    
  3. 检索要将 Web 应用程序防火墙添加到的网关。

    $gw = Get-AzureRmApplicationGateway -Name "AdatumGateway" -ResourceGroupName "MyResourceGroup"
    
  4. 配置 Web 应用程序防火墙 SKU。 可用大小为 WAF_LargeWAF_Medium。 使用 Web 应用程序防火墙时,层必须是 WAF;设置 sku 时,必须确认容量。

    $gw | Set-AzureRmApplicationGatewaySku -Name WAF_Large -Tier WAF -Capacity 2
    
  5. 如以下示例定义,配置 WAF 设置:

    对于 FirewallMode,可用值为“阻止”和“检测”。

    $gw | Set-AzureRmApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode Prevention
    
  6. 使用上述步骤中定义的设置更新应用程序网关。

    Set-AzureRmApplicationGateway -ApplicationGateway $gw
    

此命令使用 Web 应用程序防火墙更新应用程序网关。 建议查看应用程序网关诊断,以了解如何查看应用程序网关的日志。 由于 WAF 的安全特性,需要定期查看日志,以了解 Web 应用程序的安全状态。

创建具有 Web 应用程序防火墙的应用程序网关

以下步骤引导你从头到尾完成创建具有 Web 应用程序防火墙的应用程序网关的整个过程。

确保使用最新版本的 Azure PowerShell。 将 Windows PowerShell 与 Resource Manager 配合使用中提供了详细信息。

  1. 通过运行 Login-AzureRmAccount -EnvironmentName AzureChinaCloud 登录到 Azure,系统将提示用户使用凭据进行身份验证。

  2. 通过运行 Get-AzureRmSubscription 检查该帐户的订阅

  3. 选择要使用的 Azure 订阅。

    Select-AzureRmsubscription -SubscriptionName "<Subscription name>"
    

创建资源组

为应用程序网关创建资源组。

New-AzureRmResourceGroup -Name appgw-rg -Location "China North"

Azure Resource Manager 要求所有资源组指定一个位置。 此位置将用作该资源组中的资源的默认位置。 请确保用于创建应用程序网关的所有命令都使用相同的资源组。

在上述示例中,我们创建了名为“appgw-RG”的资源组,位置为“中国北部”。

Note

如果需要为应用程序网关配置自定义探测,请参阅 Create an application gateway with custom probes by using PowerShell(使用 PowerShell 创建带自定义探测的应用程序网关)。 有关详细信息,请查看 custom probes and health monitoring(自定义探测和运行状况监视)。

配置虚拟网络

应用程序网关需要自己的子网。 在此步骤中,将创建一个具有 10.0.0.0/16 地址空间的虚拟网络和两个子网(一个子网用于应用程序网关,另一子网用于后端池成员)。

# Create a subnet configuration object for the application gateway subnet. A subnet for an application should have a minimum of 28 mask bits. This value leaves 10 available addresses in the subnet for Application Gateway instances. With a smaller subnet, you may not be able to add more instance of your application gateway in the future.
$gwSubnet = New-AzureRmVirtualNetworkSubnetConfig -Name 'appgwsubnet' -AddressPrefix 10.0.0.0/24

# Create a subnet configuration object for the backend pool members subnet
$nicSubnet = New-AzureRmVirtualNetworkSubnetConfig  -Name 'appsubnet' -AddressPrefix 10.0.2.0/24

# Create the virtual network with the previous created subnets
$vnet = New-AzureRmvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg -Location "China North" -AddressPrefix 10.0.0.0/16 -Subnet $gwSubnet, $nicSubnet

配置公共 IP 地址

若要处理外部请求,应用程序网关需要公共 IP 地址。 此公共 IP 地址不能将 DomainNameLabel 定义为由应用程序网关使用。

# Create a public IP address for use with the application gateway. Defining the domainnamelabel during creation is not supported for use with application gateway
$publicip = New-AzureRmPublicIpAddress -ResourceGroupName appgw-rg -name 'appgwpip' -Location "China North" -AllocationMethod Dynamic

配置应用程序网关

# Create a IP configuration. This configures what subnet the Application Gateway uses. When Application Gateway starts, it picks up an IP address from the subnet configured and routes network traffic to the IP addresses in the back-end IP pool.
$gipconfig = New-AzureRmApplicationGatewayIPConfiguration -Name 'gwconfig' -Subnet $gwSubnet

# Create a backend pool to hold the addresses or NICs for the application that application gateway is protecting.
$pool = New-AzureRmApplicationGatewayBackendAddressPool -Name 'pool01' -BackendIPAddresses 1.1.1.1, 2.2.2.2, 3.3.3.3

# Upload the authenication certificate that will be used to communicate with the backend servers
$authcert = New-AzureRmApplicationGatewayAuthenticationCertificate -Name 'whitelistcert1' -CertificateFile <full path to .cer file>

# Conifugre the backend HTTP settings to be used to define how traffic is routed to the backend pool. The authenication certificate used in the previous step is added to the backend http settings.
$poolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name 'setting01' -Port 443 -Protocol Https -CookieBasedAffinity Enabled -AuthenticationCertificates $authcert

# Create a frontend port to be used by the listener.
$fp = New-AzureRmApplicationGatewayFrontendPort -Name 'port01'  -Port 443

# Create a frontend IP configuration to associate the public IP address with the application gateway
$fipconfig = New-AzureRmApplicationGatewayFrontendIPConfig -Name 'fip01' -PublicIPAddress $publicip

# Configure the certificate for the application gateway. This certificate is used to decrypt and re-encrypt the traffic on the application gateway.
$cert = New-AzureRmApplicationGatewaySslCertificate -Name cert01 -CertificateFile <full path to .pfx file> -Password <password for certificate file>

# Create the HTTP listener for the application gateway. Assign the front-end ip configuration, port, and ssl certificate to use.
$listener = New-AzureRmApplicationGatewayHttpListener -Name listener01 -Protocol Https -FrontendIPConfiguration $fipconfig -FrontendPort $fp -SslCertificate $cert

#Create a load balancer routing rule that configures the load balancer behavior. In this example, a basic round robin rule is created.
$rule = New-AzureRmApplicationGatewayRequestRoutingRule -Name 'rule01' -RuleType basic -BackendHttpSettings $poolSetting -HttpListener $listener -BackendAddressPool $pool

# Configure the SKU of the application gateway
$sku = New-AzureRmApplicationGatewaySku -Name WAF_Medium -Tier WAF -Capacity 2

#Configure the waf configuration settings.
$config = New-AzureRmApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"

# Create the application gateway utilizing all the previously created configuration objects
$appgw = New-AzureRmApplicationGateway -Name appgwtest -ResourceGroupName appgw-rg -Location "China North" -BackendAddressPools $pool -BackendHttpSettingsCollection $poolSetting -FrontendIpConfigurations $fipconfig  -GatewayIpConfigurations $gipconfig -FrontendPorts $fp -HttpListeners $listener -RequestRoutingRules $rule -Sku $sku -WebApplicationFirewallConfig $config -SslCertificates $cert -AuthenticationCertificates $authcert

Note

为使用基本 Web 应用程序防火墙配置创建的应用程序网关配置 CRS 3.0 以进行保护。

获取应用程序网关 DNS 名称

创建网关后,下一步是配置用于通信的前端。 使用公共 IP 时,应用程序网关需要动态分配的 DNS 名称,这会造成不方便。 若要确保最终用户能够访问应用程序网关,可以使用 CNAME 记录指向应用程序网关的公共终结点。 在 Azure 中配置自定义域名。 为此,可使用附加到应用程序网关的 PublicIPAddress 元素检索应用程序网关及其关联的 IP/DNS 名称的详细信息。 应使用应用程序网关的 DNS 名称来创建 CNAME 记录,使两个 Web 应用程序都指向此 DNS 名称。 不建议使用 A 记录,因为重新启动应用程序网关后 VIP 可能会变化。

Get-AzureRmPublicIpAddress -ResourceGroupName appgw-RG -Name publicIP01
Name                     : publicIP01
ResourceGroupName        : appgw-RG
Location                 : chinanorth
Id                       : /subscriptions/<subscription_id>/resourceGroups/appgw-RG/providers/Microsoft.Network/publicIPAddresses/publicIP01
Etag                     : W/"00000d5b-54ed-4907-bae8-99bd5766d0e5"
ResourceGuid             : 00000000-0000-0000-0000-000000000000
ProvisioningState        : Succeeded
Tags                     : 
PublicIpAllocationMethod : Dynamic
IpAddress                : xx.xx.xxx.xx
PublicIpAddressVersion   : IPv4
IdleTimeoutInMinutes     : 4
IpConfiguration          : {
                                "Id": "/subscriptions/<subscription_id>/resourceGroups/appgw-RG/providers/Microsoft.Network/applicationGateways/appgwtest/frontendIP
                            Configurations/frontend1"
                            }
DnsSettings              : {
                                "Fqdn": "00000000-0000-xxxx-xxxx-xxxxxxxxxxxx.chinacloudapp.cn"
                            }

后续步骤

若要了解如何配置诊断日志记录,以及如何记录通过 Web 应用程序防火墙检测到或阻止的事件,请参阅应用程序网关诊断