使用 PowerShell 通过应用程序网关配置端到端 SSL

概述

应用程序网关支持对流量进行端到端加密。 应用程序网关通过在应用程序网关上终止 SSL 连接来完成此任务。 网关随后将路由规则应用于流量、重新加密数据包,并根据定义的路由规则将数据包转发到适当的后端。 来自 Web 服务器的任何响应都会经历相同的过程返回最终用户。

应用程序网关支持的另一功能:定义自定义 SSL 选项。 应用程序网关除支持定义要使用的密码套件和优先级顺序外,还支持禁用以下协议版本:TLSv1.0、TLSv1.1 和 TLSv1.2。 若要详细了解可配置的 SSL 选项,请访问 SSL 策略概述

Note

SSL 2.0 和 SSL 3.0 默认处于禁用状态且无法启用。 这些版本被视为不安全的版本,不能用于应用程序网关。

方案图像

方案

在此方案中,可学习如何使用 PowerShell 创建使用端到端 SSL 的应用程序网关。

此方案将:

  • 创建名为“appgw-rg”的资源组
  • 创建名为“appgwvnet”地址空间为 10.0.0.0/16 的虚拟网络。
  • 创建名为“appgwsubnet”和“appsubnet”的两个子网。
  • 创建支持端到端 SSL 加密且限制 SSL 协议版本和密码套件的小型应用程序网关。

开始之前

若要对应用程序网关配置端到端 SSL,需要网关证书和后端服务器证书。 网关证书用于加密和解密通过 SSL 发送给网关的流量。 网关证书需要采用个人信息交换 (pfx) 格式。 此文件格式适用于导出私钥,后者是应用程序网关对流量进行加解密所必需的。

若要加密端到端 SSL,后端必须已加入应用程序网关的允许列表。 将后端的公用证书上传到应用程序网关即可完成此操作。 这可确保应用程序网关仅与已知的后端实例通信, 从而进一步保护端到端通信。

以下步骤介绍此过程:

创建资源组

本部分指导创建资源组,其中包含应用程序网关。

步骤 1

登录 Azure 帐户。

Login-AzureRmAccount -EnvironmentName AzureChinaCloud

步骤 2

选择要用于此方案的订阅。

Select-AzureRmsubscription -SubscriptionName "<Subscription name>"

步骤 3

创建资源组(如果要使用现有的资源组,请跳过此步骤)。

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

为应用程序网关创建虚拟网络和子网

以下示例创建一个虚拟网络和两个子网。 一个子网用于托管应用程序网关。 另一个子网用于托管 Web 应用程序的后端。

步骤 1

分配要用于应用程序网关本身的子网地址范围。

$gwSubnet = New-AzureRmVirtualNetworkSubnetConfig -Name 'appgwsubnet' -AddressPrefix 10.0.0.0/24

Note

应适当调整为应用程序网关配置的子网的大小。 最多可以为 10 个实例配置应用程序网关。 每个实例从子网获取 1 个 IP 地址。 子网太小可能会对应用程序网关的向外缩放造成负面影响。

步骤 2

分配要用于后端地址池的地址范围。

$nicSubnet = New-AzureRmVirtualNetworkSubnetConfig  -Name 'appsubnet' -AddressPrefix 10.0.2.0/24

步骤 3

创建具有上述步骤中定义的子网的虚拟网络。

$vnet = New-AzureRmvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg -Location "China North" -AddressPrefix 10.0.0.0/16 -Subnet $gwSubnet, $nicSubnet

步骤 4

检索要用于以下步骤的虚拟网络资源和子网资源:

$vnet = Get-AzureRmvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg
$gwSubnet = Get-AzureRmVirtualNetworkSubnetConfig -Name 'appgwsubnet' -VirtualNetwork $vnet
$nicSubnet = Get-AzureRmVirtualNetworkSubnetConfig -Name 'appsubnet' -VirtualNetwork $vnet

创建前端配置的公共 IP 地址

创建要用于应用程序网关的公共 IP 资源。 此公共 IP 地址会用于以后的步骤。

$publicip = New-AzureRmPublicIpAddress -ResourceGroupName appgw-rg -Name 'publicIP01' -Location "China North" -AllocationMethod Dynamic

Important

应用程序网关不支持使用通过定义的域标签创建的公共 IP 地址。 仅支持具有动态创建的域标签的公共 IP 地址。 如果需要应用程序网关具有友好的 DNS 名称,建议使用 CNAME 记录作为别名。

创建应用程序网关配置对象

在创建应用程序网关之前设置所有配置项。 以下步骤会创建应用程序网关资源所需的配置项目。

步骤 1

创建应用程序网关 IP 配置,此设置配置应用程序网关使用的子网。 应用程序网关启动时,它会从配置的子网获取 IP 地址,再将网络流量路由到后端 IP 池中的 IP 地址。 请记住,每个实例需要一个 IP 地址。

$gipconfig = New-AzureRmApplicationGatewayIPConfiguration -Name 'gwconfig' -Subnet $gwSubnet

步骤 2

创建前端 IP 配置,此设置将专用或公共 IP 地址映射到应用程序网关的前端。 以下步骤将上述步骤中的公共 IP 地址与前端 IP 配置关联。

$fipconfig = New-AzureRmApplicationGatewayFrontendIPConfig -Name 'fip01' -PublicIPAddress $publicip

步骤 3

使用后端 Web 服务器的 IP 地址配置后端 IP 地址池。 这些 IP 地址是接收来自前端 IP 终结点的网络流量的 IP 地址。 替换以下 IP 地址,添加自己的应用程序 IP 地址终结点。

$pool = New-AzureRmApplicationGatewayBackendAddressPool -Name 'pool01' -BackendIPAddresses 1.1.1.1, 2.2.2.2, 3.3.3.3

Note

完全限定的域名 (FQDN) 也是可以通过 -BackendFqdns 开关替换后端服务器 IP 地址的有效值。

步骤 4

配置公共 IP 终结点的前端 IP 端口。 此端口是最终用户连接到的端口。

$fp = New-AzureRmApplicationGatewayFrontendPort -Name 'port01'  -Port 443

步骤 5

配置应用程序网关的证书。 此证书用于加密和解密应用程序网关上的流量。

$cert = New-AzureRmApplicationGatewaySSLCertificate -Name cert01 -CertificateFile <full path to .pfx file> -Password <password for certificate file>

Note

此示例配置用于 SSL 连接的证书。 该证书需采用 .pfx 格式,并且密码必须为 4 到 12 个字符。

步骤 6

创建应用程序网关的 HTTP 侦听器。 分配要使用的前端 IP 配置、端口和 SSL 证书。

$listener = New-AzureRmApplicationGatewayHttpListener -Name listener01 -Protocol Https -FrontendIPConfiguration $fipconfig -FrontendPort $fp -SSLCertificate $cert

步骤 7

上传要在已启用 SSL 的后端池资源上使用的证书。

Note

默认探测从后端的 IP 地址上的默认 SSL 绑定获取公钥,并将其收到的公钥值与用户在此处提供的公钥值进行比较。 如果用户使用后端的主机标头和 SNI,则检索到的公钥不一定是预期会将流量传输到其中的站点。 如果有疑问,请访问后端的 https://127.0.0.1/,确认用于默认 SSL 绑定的证书。 本部分使用该请求中的公钥。 如果对 HTTPS 绑定使用主机头和 SNI,但未从后端上 https://127.0.0.1/ 的手动浏览器请求收到响应和证书,则必须在后端设置默认 SSL 绑定。 如果不这样做,探测会失败,后端不会列入允许名单。

$authcert = New-AzureRmApplicationGatewayAuthenticationCertificate -Name 'whitelistcert1' -CertificateFile C:\users\gwallace\Desktop\cert.cer

Note

此步骤中提供的证书应该是后端中存在的 pfx 证书的公钥。 以 .CER 格式导出后端服务器上安装的证书(不是根证书),将其用在此步骤。 此步骤会将后端加入应用程序网关的允许列表。

步骤 8

配置应用程序网关后端 http 设置。 将上述步骤中上传的证书分配给 http 设置。

$poolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name 'setting01' -Port 443 -Protocol Https -CookieBasedAffinity Enabled -AuthenticationCertificates $authcert

步骤 9

创建配置负载均衡器行为的负载均衡器路由规则。 在此示例中,创建基本轮循机制规则。

$rule = New-AzureRmApplicationGatewayRequestRoutingRule -Name 'rule01' -RuleType basic -BackendHttpSettings $poolSetting -HttpListener $listener -BackendAddressPool $pool

步骤 10

配置应用程序网关的实例大小。 可用大小为 Standard_Small、Standard_Medium 和 Standard_Large。 对于容量,可用值为 1 到 10。

$sku = New-AzureRmApplicationGatewaySku -Name Standard_Small -Tier Standard -Capacity 2

Note

进行测试时,可以选择 1 作为实例计数。 必须知道的是,2 以下的实例计数不受 SLA 支持,因此不建议使用。 小型网关用于开发/测试,不用于生产。

步骤 11

配置要在应用程序网关上使用的 SSL 策略。 应用程序网关支持设置 SSL 协议最低版本的功能。

以下值是可以定义的协议版本的列表。

  • TLSv1_0
  • TLSv1_1
  • TLSv1_2

将最低协议版本设置为 TLSv1_2 并仅启用 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 和 TLS_RSA_WITH_AES_128_GCM_SHA256。

$SSLPolicy = New-AzureRmApplicationGatewaySSLPolicy -MinProtocolVersion TLSv1_2 -CipherSuite "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256"

创建应用程序网关

使用上述所有步骤创建应用程序网关。 创建网关是需要长时间运行的过程。

$appgw = New-AzureRmApplicationGateway -Name appgateway -SSLCertificates $cert -ResourceGroupName "appgw-rg" -Location "China North" -BackendAddressPools $pool -BackendHttpSettingsCollection $poolSetting -FrontendIpConfigurations $fipconfig -GatewayIpConfigurations $gipconfig -FrontendPorts $fp -HttpListeners $listener -RequestRoutingRules $rule -Sku $sku -SSLPolicy $SSLPolicy -AuthenticationCertificates $authcert -Verbose

限制现有应用程序网关上的 SSL 协议版本

上述步骤指导创建具有端到端 SSL 并禁用特定 SSL 协议版本的应用程序。 以下示例禁用现有应用程序网关上的特定 SSL 策略。

步骤 1

检索要更新的应用程序网关。

$gw = Get-AzureRmApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG

步骤 2

定义 SSL 策略。 如下示例禁用了 TLSv1.0 和 TLSv1.1,仅允许密码套件 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256、TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 和 TLS_RSA_WITH_AES_128_GCM_SHA256

Set-AzureRmApplicationGatewaySSLPolicy -MinProtocolVersion -PolicyType Custom -CipherSuite "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256" -ApplicationGateway $gw

步骤 3

最后,更新网关。 请务必注意,这个最后一步是需要长时间运行的任务。 完成时,应用程序网关上即已配置端到端 SSL。

$gw | Set-AzureRmApplicationGateway

获取应用程序网关 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 应用程序防火墙概述,了解如何通过应用程序网关的 Web 应用程序防火墙强化 Web 应用程序的安全