Настройка сквозного подключения TLS для Шлюза приложений с помощью PowerShell
Обзор
Шлюз приложений Azure поддерживает сквозное шифрование трафика. Для этого он завершает TLS/SSL-подключение в шлюзе приложений. Затем шлюз применяет правила маршрутизации к трафику, повторно шифрует пакет и пересылает пакет на соответствующий сервер серверной части на основе определенных правил маршрутизации. Любой ответ веб-сервера проходит через тот же процесс на пути к пользователю.
Шлюз приложений поддерживает определение пользовательских вариантов TLS. отключение следующих версий протокола: TLSv1.0, TLSv1.1 и TLSv1.2. Также шлюз поддерживает определение комплектов шифров для использования и их приоритет. Дополнительные сведения о настраиваемых параметрах TLS см. в статье Общие сведения о политике TLS шлюза приложений.
Примечание.
Протоколы SSL 2.0 и SSL 3.0 отключены по умолчанию, и их нельзя включать. Они считаются небезопасными и не могут использоваться со шлюзом приложений.
Сценарий
В этом сценарии показано, как с помощью PowerShell создать шлюз приложений со сквозным подключением TLS.
Вы узнаете:
- как создать группу ресурсов с именем appgw-rg;
- как создать виртуальную сеть appgwvnet с адресным пространством 10.0.0.0/16;
- как создать две подсети, appgwsubnet и appsubnet;
- как создать небольшой шлюз приложений с поддержкой сквозного шифрования TLS, который ограничивает версии протокола TLS и наборы шифров.
Подготовка к работе
Примечание.
Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Сведения о начале работы см. в статье "Установка Azure PowerShell". Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.
Для настройки сквозного TLS с помощью шлюза приложений требуется сертификат для шлюза и сертификатов для внутренних серверов. Сертификат шлюза используется для получения симметричного ключа согласно спецификации протокола TLS. Затем используется симметричный ключ шифрования и расшифровки трафика, отправляемого на шлюз. Сертификат шлюза должен быть представлен в формате PFX (файл обмена личной информацией). Этот формат файла позволяет экспортировать закрытый ключ, необходимый шлюзу приложений для шифрования и расшифровки трафика.
Чтобы использовать сквозное шифрование TLS, серверная часть должна быть явным образом разрешена в шлюзе приложений. Отправьте общедоступный сертификат внутренних серверов в шлюз приложений. Добавление сертификата гарантирует, что шлюз приложений взаимодействует только с известными экземплярами серверной части. тем самым защищая сквозной обмен данными.
Процесс настройки описан в следующих разделах.
Создание группы ресурсов
В этом разделе описывается создание группы ресурсов, содержащей шлюз приложений.
Войдите в свою учетную запись Azure.
Connect-AzAccount
Выберите подписку для этого сценария.
Select-Azsubscription -SubscriptionName "<Subscription name>"
Создать группу ресурсов. Если используется существующая группа ресурсов, пропустите этот шаг.
New-AzResourceGroup -Name appgw-rg -Location "West US"
Создание виртуальной сети и подсети для шлюза приложений.
Следующий пример создает виртуальную сеть и две подсети. Одна подсеть используется для размещения шлюза приложений, а другая — для внутренних серверов, на которых размещается веб-приложение.
Назначьте диапазон адресов подсети для шлюза приложений.
$gwSubnet = New-AzVirtualNetworkSubnetConfig -Name 'appgwsubnet' -AddressPrefix 10.0.0.0/24
Примечание.
Подсети, настроенные для шлюза приложений, должны иметь соответствующий размер. У шлюза приложений может быть до 10 экземпляров. Для каждого экземпляра требуется отдельный IP-адрес из подсети. Слишком маленький размер подсети может отрицательно сказаться на возможности масштабирования шлюза приложений.
Назначьте диапазон адресов, используемый для пула внутренних адресов.
$nicSubnet = New-AzVirtualNetworkSubnetConfig -Name 'appsubnet' -AddressPrefix 10.0.2.0/24
Создайте виртуальную сеть с подсетями, определенными на предыдущих шагах.
$vnet = New-AzvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg -Location "West US" -AddressPrefix 10.0.0.0/16 -Subnet $gwSubnet, $nicSubnet
Получите ресурс виртуальной сети и ресурсы подсетей, которые будут использоваться при выполнении следующих действий.
$vnet = Get-AzvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg $gwSubnet = Get-AzVirtualNetworkSubnetConfig -Name 'appgwsubnet' -VirtualNetwork $vnet $nicSubnet = Get-AzVirtualNetworkSubnetConfig -Name 'appsubnet' -VirtualNetwork $vnet
Создание общедоступного IP-адреса для конфигурации внешнего интерфейса
Создайте ресурс общедоступного IP-адреса для шлюза приложений. Этот общедоступный IP-адрес используется на одном из следующих шагов.
$publicip = New-AzPublicIpAddress -ResourceGroupName appgw-rg -Name 'publicIP01' -Location "West US" -AllocationMethod Dynamic
Внимание
Шлюз приложений не поддерживает использование общедоступного IP-адреса, созданного с определенной меткой домена. Поддерживается только общедоступный IP-адрес с динамически создаваемой меткой домена. Если для шлюза приложений требуется понятное DNS-имя, мы рекомендуем использовать в качестве псевдонима запись CNAME.
Создание объекта конфигурации шлюза приложений.
Перед созданием шлюза приложений необходимо настроить все элементы конфигурации. В ходе следующих шагов создаются необходимые элементы конфигурации для ресурса шлюза приложений.
Создайте IP-конфигурацию шлюза приложений. Она определяет, какую подсеть использует шлюз приложений. При запуске шлюза приложений получает IP-адрес из настроенной подсети и направляет сетевой трафик на IP-адреса в серверном пуле IP-адресов. Помните, что для каждого экземпляра требуется отдельный IP-адрес.
$gipconfig = New-AzApplicationGatewayIPConfiguration -Name 'gwconfig' -Subnet $gwSubnet
Создайте интерфейсную IP-конфигурацию. в которой частный или общедоступный IP-адрес сопоставляется с внешним интерфейсом шлюза приложений. Следующий шаг связывает общедоступный IP-адрес на предыдущем шаге с конфигурацией внешнего IP-адреса.
$fipconfig = New-AzApplicationGatewayFrontendIPConfig -Name 'fip01' -PublicIPAddress $publicip
Настройте пул внутренних IP-адресов с IP-адресами внутренних веб-серверов. Эти IP-адреса — это IP-адреса, получающие сетевой трафик, поступающий из конечной точки внешнего IP-адреса. Замените IP-адреса в примере и добавьте конечные точки IP-адресов своего приложения.
$pool = New-AzApplicationGatewayBackendAddressPool -Name 'pool01' -BackendIPAddresses 203.0.113.1, 203.0.113.2, 203.0.113.3
Примечание.
Полное доменное имя (FQDN) также является допустимым значением для использования вместо IP-адреса серверных серверов. Для этого используйте параметр -BackendFqdns.
Настройте внешний IP-порт для общедоступной конечной точки IP-адреса. Это порт, к которому подключаются пользователи.
$fp = New-AzApplicationGatewayFrontendPort -Name 'port01' -Port 443
Настройте сертификат для шлюза приложений. Этот сертификат используется для шифрования и расшифровки трафика на шлюзе приложений.
$passwd = ConvertTo-SecureString <certificate file password> -AsPlainText -Force $cert = New-AzApplicationGatewaySSLCertificate -Name cert01 -CertificateFile <full path to .pfx file> -Password $passwd
Примечание.
Этот пример настраивает сертификат для подключения TLS. Сертификат должен быть в формате PFX.
Создайте прослушиватель HTTP для шлюза приложений. Назначьте интерфейсную IP-конфигурацию, порт и SSL-сертификат.
$listener = New-AzApplicationGatewayHttpListener -Name listener01 -Protocol Https -FrontendIPConfiguration $fipconfig -FrontendPort $fp -SSLCertificate $cert
Загрузите сертификат, который будет использоваться в ресурсах внутреннего пула с поддержкой TLS.
Примечание.
Проба по умолчанию получает открытый ключ из привязки TLS по умолчанию по IP-адресу серверной части и сравнивает значение открытого ключа, которое оно получает с указанным здесь значением открытого ключа.
Если вы используете заголовки узлов и указание имени сервера (SNI) в серверной части, полученный открытый ключ может не быть предполагаемым сайтом, на котором выполняется трафик. Если вы сомневаетесь, посетите https://127.0.0.1/ серверные серверы, чтобы подтвердить, какой сертификат используется для привязки TLS по умолчанию . В этом разделе используйте открытый ключ из этого запроса. Если вы используете заголовки узла и SNI в привязках HTTPS, и вы не получаете ответ и сертификат из запроса https://127.0.0.1/ браузера вручную на серверные серверы, необходимо настроить привязку TLS по умолчанию для них. Если этого не сделать, пробы будут завершены ошибкой и серверная часть не будет добавлена в список разрешений.
Дополнительные сведения об указании имени сервера в Шлюзе приложений см. в статье Общие сведения о завершении TSL и сквозном подключении с помощью шлюза приложений.
$authcert = New-AzApplicationGatewayAuthenticationCertificate -Name 'allowlistcert1' -CertificateFile C:\cert.cer
Примечание.
Сертификат, предоставленный на предыдущем шаге, должен быть открытым ключом сертификата в формате PFX, размещенного в серверной части. Экспортируйте сертификат (а не корневой сертификат), установленный на серверном сервере в формате утверждения, доказательства и причины (CER) и используйте его на этом шаге. Этот шаг добавляет серверную часть в список разрешений на шлюзе приложений.
Если вы используете номер SKU Шлюз приложений версии 2, создайте доверенный корневой сертификат вместо сертификата проверки подлинности. Дополнительные сведения см. в статье Обзор сквозного шифрования TLS с помощью Шлюза приложений.
$trustedRootCert01 = New-AzApplicationGatewayTrustedRootCertificate -Name "test1" -CertificateFile <path to root cert file>
Настройте параметры HTTP для серверной части шлюза приложений. В параметрах HTTP назначьте сертификат, переданный на предыдущем шаге.
$poolSetting = New-AzApplicationGatewayBackendHttpSettings -Name 'setting01' -Port 443 -Protocol Https -CookieBasedAffinity Enabled -AuthenticationCertificates $authcert
Для номера SKU Шлюза приложений версии 2 используйте следующую команду:
$poolSetting01 = New-AzApplicationGatewayBackendHttpSettings -Name “setting01” -Port 443 -Protocol Https -CookieBasedAffinity Disabled -TrustedRootCertificate $trustedRootCert01 -HostName "test1"
Создайте правило маршрутизации для балансировщика нагрузки, которое настраивает его поведение. В этом примере создается базовое правило с циклическим перебором.
$rule = New-AzApplicationGatewayRequestRoutingRule -Name 'rule01' -RuleType basic -BackendHttpSettings $poolSetting -HttpListener $listener -BackendAddressPool $pool
Настройте размер экземпляра шлюза приложений. Доступные размеры: Standard_Small, Standard_Medium и Standard_Large. Доступны значения емкости: от 1 до 10.
$sku = New-AzApplicationGatewaySku -Name Standard_Small -Tier Standard -Capacity 2
Примечание.
Для тестирования можно выбрать число экземпляров, равное 1. Важно знать, что если указать число экземпляров менее двух, то развертывание не попадает под действие соглашения об уровне обслуживания, и поэтому это не рекомендуется. Мелкие шлюзы предназначены для разработки и тестирования, а не для производства.
Настройте политику TLS для использования в шлюзе приложений. Шлюз приложений позволяет установить минимальную версию протокола TLS.
Ниже приведен список значений для версий протокола, которые можно определить:
- 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-AzApplicationGatewaySSLPolicy -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" -PolicyType Custom
Создание шлюза приложений
Создайте шлюз приложений в соответствии с действиями, выполненными на предыдущих шагах. Выполнение этого процесса занимает много времени.
Для ценовой категории с версией 1 используйте приведенную ниже команду.
$appgw = New-AzApplicationGateway -Name appgateway -SSLCertificates $cert -ResourceGroupName "appgw-rg" -Location "West US" -BackendAddressPools $pool -BackendHttpSettingsCollection $poolSetting -FrontendIpConfigurations $fipconfig -GatewayIpConfigurations $gipconfig -FrontendPorts $fp -HttpListeners $listener -RequestRoutingRules $rule -Sku $sku -SSLPolicy $SSLPolicy -AuthenticationCertificates $authcert -Verbose
Для ценовой категории с версией 2 используйте приведенную ниже команду.
$appgw = New-AzApplicationGateway -Name appgateway -SSLCertificates $cert -ResourceGroupName "appgw-rg" -Location "West US" -BackendAddressPools $pool -BackendHttpSettingsCollection $poolSetting01 -FrontendIpConfigurations $fipconfig -GatewayIpConfigurations $gipconfig -FrontendPorts $fp -HttpListeners $listener -RequestRoutingRules $rule -Sku $sku -SSLPolicy $SSLPolicy -TrustedRootCertificate $trustedRootCert01 -Verbose
Примените новый сертификат, если истек срок действия внутреннего сертификата
Используйте эту процедуру, чтобы применить новый сертификат, если истек срок действия внутреннего сертификата.
Получите шлюз приложений, который требуется обновить.
$gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
Добавьте новый ресурс сертификата из CER-файла, который содержит открытый ключ сертификата. Это может быть тот же сертификат, который уже добавлен в прослушиватель для создания подключения TLS в шлюзе приложений.
Add-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name 'NewCert' -CertificateFile "appgw_NewCert.cer"
Получите новый объект сертификата проверки подлинности в переменную (TypeName: Microsoft.Azure.Commands.Network.Models.PSApplicationGatewayAuthenticationCertificate).
$AuthCert = Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name NewCert
Назначьте новый сертификат параметру BackendHttp и укажите ссылку на него в переменной $AuthCert. (Укажите имя параметра HTTP, который вам нужно изменить.)
$out= Set-AzApplicationGatewayBackendHttpSetting -ApplicationGateway $gw -Name "HTTP1" -Port 443 -Protocol "Https" -CookieBasedAffinity Disabled -AuthenticationCertificates $Authcert
- Зафиксируйте изменения в шлюзе приложений и передайте новую конфигурацию, которая содержится в переменной $out.
Set-AzApplicationGateway -ApplicationGateway $gw
Удаление неиспользуемого сертификата с истекшим сроком действия из параметров HTTP
Используйте эту процедуру, чтобы удалить неиспользуемый сертификат с истекшим сроком действия из параметров HTTP.
Получите шлюз приложений, который требуется обновить.
$gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
Укажите имя сертификата проверки подлинности, который вам нужно удалить.
Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw | select name
Удалите сертификаты проверки подлинности из шлюза приложений.
$gw=Remove-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name ExpiredCert
Зафиксируйте изменения.
Set-AzApplicationGateway -ApplicationGateway $gw
Ограничение версий протокола TLS на существующем шлюзе приложений
Выше показано, как создать шлюз приложения со сквозным подключением TLS и отключить определенные версии протокола TLS. Следующий пример отключает определенные политики TLS в существующем шлюзе приложений.
Получите шлюз приложений, который требуется обновить.
$gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
Определите политику TLS. В следующем примере 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-AzApplicationGatewaySSLPolicy -MinProtocolVersion TLSv1_2 -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
Наконец, обновите шлюз. Этот последний шаг занимает много времени. По завершении в шлюзе приложений будет настроено сквозное подключение TLS.
$gw | Set-AzApplicationGateway
Получение DNS-имени шлюза приложений
После создания шлюза следует настроить внешний интерфейс для обмена данными. Если вы используете общедоступный IP-адрес, шлюзу приложений требуется динамически назначаемое непонятное имя DNS. Чтобы пользователи гарантированно попали на шлюз приложений, можно использовать запись CNAME для указания общедоступной конечной точки шлюза приложений. Дополнительные сведения см. в статье Настройка пользовательского доменного имени для облачной службы Azure.
Чтобы настроить псевдоним, извлеките подробные сведения о шлюзе приложений и соответствующий IP-адрес или DNS-имя с помощью элемента PublicIPAddress, связанного со шлюзом приложений. Используйте DNS-имя шлюза приложений для создания записи CNAME, указывающей двум веб-приложениям на это DNS-имя. Мы не рекомендуем использовать записи типа A, так как виртуальный IP-адрес может измениться после перезапуска шлюза приложения.
Get-AzPublicIpAddress -ResourceGroupName appgw-RG -Name publicIP01
Name : publicIP01
ResourceGroupName : appgw-RG
Location : westus
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.cloudapp.net"
}
Следующие шаги
Дополнительные сведения об усилении безопасности веб-приложений с помощью брандмауэра веб-приложения в шлюзе приложений см. в статье Брандмауэр веб-приложения (WAF).