Configurar o TLS de ponta a ponta usando o Gateway de Aplicativo com o PowerShell

Visão geral

O Gateway de Aplicativo do Azure dá suporte à criptografia de tráfego de ponta a ponta. O Gateway de Aplicativo termina a conexão TLS/SSL no gateway de aplicativo. Em seguida, o gateway aplica as regras de roteamento ao tráfego, criptografa o pacote novamente e encaminha o pacote para o servidor back-end apropriado com base nas regras de roteamento definidas. Qualquer resposta do servidor Web passa pelo mesmo processo de volta para o usuário final.

O Gateway de Aplicativo dá suporte para definir opções personalizadas de TLS. Ele também dá suporte para desabilitar as seguintes versões de protocolo: TLSv1.0, TLSv1.1 e TLSv1.2 como também para definir quais conjuntos de criptografia usar e a ordem de preferência. Para saber mais sobre as opções configuráveis de TLS, acesse Visão geral da política de TLS.

Observação

O SSL 2.0 e o SSL 3.0 estão desabilitados por padrão e não podem ser habilitados. Eles são considerados não seguros e não podem ser usados com o Gateway de Aplicativo.

scenario image

Cenário

Neste cenário, você aprenderá a criar um gateway de aplicativo usando o TLS de ponta a ponta com o PowerShell.

Este cenário:

  • Criar um grupo de recursos denominado appgw-rg.
  • Criar uma rede virtual denominada appgwvnet com um espaço de endereço de 10.0.0.0/16.
  • Crie duas sub-redes chamadas appgwsubnet e appsubnet.
  • Crie um gateway de aplicativo pequeno que dê suporte à criptografia de TLS de ponta a ponta que limita versões de protocolos TLS e conjuntos de criptografia.

Antes de começar

Observação

Recomendamos que você use o módulo Az PowerShell do Azure para interagir com o Azure. Confira Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo Az PowerShell, confira Migrar o Azure PowerShell do AzureRM para o Az.

Para configurar o TLS de ponta a ponta com um gateway de aplicativo, é necessário fornecer um certificado para o gateway e certificados para os servidores back-end. O certificado de gateway é usado para derivar uma chave simétrica conforme a especificação do protocolo TLS. A chave simétrica então é usada para criptografar e descriptografar o tráfego enviado para o gateway. O certificado do gateway precisa estar no formato PFX (Troca de Informações Pessoais). Esse formato de arquivo permite exportar a chave privada que é exigida pelo gateway de aplicativo para realizar a criptografia e descriptografia do tráfego.

Para criptografia TLS de ponta a ponta, o back-end deve ser explicitamente permitido pelo gateway de aplicativo. Carregue o certificado público dos servidores back-end para o gateway de aplicativo. A adição do certificado garante que o gateway de aplicativo se comunique somente com instâncias de back-end conhecidas. Isso protege ainda mais a comunicação de ponta a ponta.

O processo de configuração é descrito nas seções a seguir.

Criar o grupo de recursos

Esta seção orienta você pela criação de um grupo de recursos que contenha o gateway de aplicativo.

  1. Entre em sua conta do Azure.

    Connect-AzAccount
    
  2. Selecione a assinatura a ser usada nesse cenário.

    Select-Azsubscription -SubscriptionName "<Subscription name>"
    
  3. Crie um grupos de recursos. (Ignore esta etapa se está usando um grupo de recursos existente.)

    New-AzResourceGroup -Name appgw-rg -Location "West US"
    

Criar uma rede virtual e uma sub-rede para o gateway de aplicativo

O exemplo a seguir cria uma rede virtual e duas sub-redes. Uma sub-rede é usada para armazenar o gateway de aplicativo. A outra sub-rede é usada para os back-ends que hospedam o aplicativo Web.

  1. Atribua um intervalo de endereços para que a sub-rede seja usada para o gateway de aplicativo.

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

    Observação

    As sub-redes configuradas para um gateway de aplicativo devem ser dimensionadas corretamente. Um gateway de aplicativo pode ser configurado para até 10 instâncias. Cada instância usa um endereço IP da sub-rede. Uma sub-rede muito pequena pode afetar de forma adversa a ampliação de um gateway de aplicativo.

  2. Atribua um intervalo de endereços a ser usado para o pool de endereços do back-end.

    $nicSubnet = New-AzVirtualNetworkSubnetConfig  -Name 'appsubnet' -AddressPrefix 10.0.2.0/24
    
  3. Crie uma rede virtual com as sub-redes definidas nas etapas anteriores.

    $vnet = New-AzvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg -Location "West US" -AddressPrefix 10.0.0.0/16 -Subnet $gwSubnet, $nicSubnet
    
  4. Recupere o recurso de rede virtual e os recursos de sub-rede a serem usados nas etapas a seguir.

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

Criar um endereço IP público para a configuração de front-end

Crie um recurso IP público a ser usado para o gateway de aplicativo. Esse endereço IP público é usado em uma das seguintes etapas.

$publicip = New-AzPublicIpAddress -ResourceGroupName appgw-rg -Name 'publicIP01' -Location "West US" -AllocationMethod Dynamic

Importante

O Gateway de Aplicativo não dá suporte ao uso de um endereço IP público criado com um rótulo de domínio definido. Há suporte para apenas para um endereço IP público com um rótulo de domínio criado dinamicamente. Se você precisar de um nome DNS amigável para o gateway de aplicativo, é recomendável usar um registro CNAME como um alias.

Criar um objeto de configuração do gateway de aplicativo

Todos os itens de configuração são definidos antes da criação do gateway de aplicativo. As etapas a seguir criam os itens de configuração necessários para um recurso de gateway de aplicativo.

  1. Criar uma configuração de IP do gateway do aplicativo. Essa configuração define qual das sub-redes o gateway de aplicativo usa. Quando o gateway de aplicativo é iniciado, ele escolhe um endereço IP da sub-rede configurada e encaminha o tráfego de rede para os endereços IP no pool de IPs de back-end. Tenha em mente que cada instância usa um endereço IP.

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name 'gwconfig' -Subnet $gwSubnet
    
  2. Crie uma configuração de IP de front-end. Essa configuração mapeia um endereço IP público ou privado para o front-end do gateway de aplicativo. A etapa a seguir associa o endereço IP público da etapa anterior à configuração de IP do front-end.

    $fipconfig = New-AzApplicationGatewayFrontendIPConfig -Name 'fip01' -PublicIPAddress $publicip
    
  3. Configure o pool de endereços IP do back-end com os endereços IP dos servidores Web back-end. Esses endereços IP são os que receberão o tráfego de rede proveniente do ponto de extremidade do IP de front-end. Substitua os endereços IP na amostra por seus próprios pontos de extremidade de endereço IP do aplicativo.

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

    Observação

    Um FQDN (nome de domínio totalmente qualificado) também é um valor válido para uso no lugar de um endereço IP para os servidores back-end. Você pode habilitá-lo usando a opção -BackendFqdns.

  4. Configure a porta IP de front-end para o ponto de extremidade IP público. Essa porta é a porta à qual os usuários finais se conectam.

    $fp = New-AzApplicationGatewayFrontendPort -Name 'port01'  -Port 443
    
  5. Configure o certificado para o gateway de aplicativo. Esse certificado é usado para descriptografar e criptografar novamente o tráfego no gateway de aplicativo.

    $passwd = ConvertTo-SecureString  <certificate file password> -AsPlainText -Force 
    $cert = New-AzApplicationGatewaySSLCertificate -Name cert01 -CertificateFile <full path to .pfx file> -Password $passwd 
    

    Observação

    Esta amostra configura o certificado usado para a conexão TLS. O certificado deve estar no formato .pfx.

  6. Crie o ouvinte HTTP para o gateway de aplicativo. Atribua a configuração de IP de front-end, porta e certificado TLS/SSL a ser usada.

    $listener = New-AzApplicationGatewayHttpListener -Name listener01 -Protocol Https -FrontendIPConfiguration $fipconfig -FrontendPort $fp -SSLCertificate $cert
    
  7. Carregue o certificado a ser usado nos recursos do pool de back-end habilitado para TLS.

    Observação

    A investigação padrão obtém a chave pública da associação TLS padrão no endereço IP do back-end e compara o valor da chave pública recebido com o valor da chave pública fornecida aqui.

    Se você está usando cabeçalhos de host e a SNI (Indicação de Nome de Servidor) no back-end, talvez a chave pública recuperada não seja o site pretendido para o qual o tráfego flui. Em caso de dúvida, acesse https://127.0.0.1/ nos servidores back-end para confirmar qual certificado será usado para a associação TLS padrão. Use a chave pública dessa solicitação nesta seção. Se você estiver usando os cabeçalhos de host e a SNI em associações HTTPS e não receber uma resposta e um certificado de uma solicitação de navegador manual para https://127.0.0.1/ nos servidores back-end, precisará configurar uma associação TLS padrão neles. Se você não fizer isso, as investigações falharão e o back-end não será permitido.

    Para saber mais sobre SNI em Gateway de Aplicativo, veja Visão geral do término de TLS e TLS de ponta a ponta com o Gateway de Aplicativo.

    $authcert = New-AzApplicationGatewayAuthenticationCertificate -Name 'allowlistcert1' -CertificateFile C:\cert.cer
    

    Observação

    O certificado fornecido na etapa anterior deve ser a chave pública do certificado .pfx presente no back-end. Exporte o certificado (não o certificado raiz) instalado no servidor back-end no formato CER (Claim, Evidence and Reasoning) e use-o nesta etapa. Esta etapa permite o back-end com o gateway de aplicativo.

    Se estiver usando o SKU do Gateway de Aplicativo v2, crie um certificado raiz confiável, em vez de um certificado de autenticação. Para saber mais, confira Visão geral de TLS de ponta a ponta com o Gateway de Aplicativo:

    $trustedRootCert01 = New-AzApplicationGatewayTrustedRootCertificate -Name "test1" -CertificateFile  <path to root cert file>
    
  8. Defina as configurações de HTTP de back-end do gateway de aplicativo. Atribua o certificado carregado na etapa anterior às configurações de HTTP.

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

    Para a SKU de Gateway de Aplicativo v2, use o seguinte comando:

    $poolSetting01 = New-AzApplicationGatewayBackendHttpSettings -Name “setting01” -Port 443 -Protocol Https -CookieBasedAffinity Disabled -TrustedRootCertificate $trustedRootCert01 -HostName "test1"
    
  9. Crie uma regra de roteamento do balanceador de carga que configure o comportamento do balanceador de carga. Neste exemplo, é criada uma regra básica de round robin.

    $rule = New-AzApplicationGatewayRequestRoutingRule -Name 'rule01' -RuleType basic -BackendHttpSettings $poolSetting -HttpListener $listener -BackendAddressPool $pool
    
  10. Configure o tamanho da instância do gateway de aplicativo. Os tamanhos disponíveis são Standard_Small, Standard_Medium e Standard_Large. Para a capacidade, os valores disponíveis são 1 a 10.

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

    Observação

    É possível escolher uma contagem de instâncias de 1 para fins de teste. É importante saber que qualquer contagem de instâncias em duas instâncias não é coberta por um SLA e, portanto, não é recomendável. Gateways pequenos devem ser usados para teste de desenvolvimento e não para fins de produção.

  11. Configure a política TLS a ser usada no gateway de aplicativo. O Gateway de Aplicativo oferece suporte a capacidade de definir uma versão mínima para versões de protocolo TLS.

    Os valores a seguir são uma lista de versões do protocolo que podem ser definidas:

    • TLSV1_0
    • TLSV1_1
    • TLSV1_2

    O exemplo a seguir define a versão mínima do protocolo para TLSv1_2 e ativa apenas TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 e 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
    

Criar o gateway de aplicativo

Usando todas as etapas anteriores, crie o gateway de aplicativo. A criação do gateway é um processo que leva muito tempo para ser executado.

Para SKU de V1, use o comando abaixo

$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

Para SKU de V2, use o comando abaixo

$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

Aplicar um novo certificado se o certificado de back-end tiver vencido

Use esse procedimento para aplicar um novo certificado se o certificado de back-end tiver vencido.

  1. Recupere o gateway de aplicativo para atualizar.

    $gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
    
  2. Adicione o novo recurso de certificado do arquivo .cer, que contém a chave pública do certificado e também pode ser o mesmo certificado adicionado ao ouvinte para término de TLS no gateway de aplicativo.

    Add-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name 'NewCert' -CertificateFile "appgw_NewCert.cer" 
    
  3. Obtenha o novo objeto de certificado de autenticação em uma variável (TypeName: Microsoft.Azure.Commands.Network.Models.PSApplicationGatewayAuthenticationCertificate).

    $AuthCert = Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name NewCert
    
  4. Atribua o novo certificado à configuração BackendHttp e referencie-o com a variável $AuthCert. (Especifique o nome da configuração HTTP que você deseja alterar).

$out= Set-AzApplicationGatewayBackendHttpSetting -ApplicationGateway $gw -Name "HTTP1" -Port 443 -Protocol "Https" -CookieBasedAffinity Disabled -AuthenticationCertificates $Authcert
  1. Confirme a alteração no gateway de aplicativo e passe a nova configuração contida na variável $out.
Set-AzApplicationGateway -ApplicationGateway $gw  

Remover um certificado expirado não utilizado das configurações de HTTP

Use este procedimento para remover um certificado expirado não utilizado das configurações de HTTP.

  1. Recupere o gateway de aplicativo para atualizar.

    $gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
    
  2. Liste o nome do certificado de autenticação que deseja remover.

    Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw | select name
    
  3. Remova o certificado de autenticação de um gateway de aplicativo.

    $gw=Remove-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name ExpiredCert
    
  4. Confirme a alteração.

Set-AzApplicationGateway -ApplicationGateway $gw

Limitar as versões de protocolo TLS em um gateway de aplicativo existente

As etapas anteriores levaram você pela criação de um aplicativo com TLS de ponta a ponta e a desabilitar determinadas versões do protocolo TLS. O exemplo a seguir desabilita determinadas políticas de TLS em um gateway de aplicativo existente.

  1. Recupere o gateway de aplicativo para atualizar.

    $gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
    
  2. Defina uma política de TLS. No exemplo a seguir, TLSv1.0 e TLSv1.1 estão desativados e os conjuntos de criptografia TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 e TLS_RSA_WITH_AES_128_GM_SHA256 são permitidos.

    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
    
    
  3. Por fim, atualize o gateway. Esta última etapa é uma tarefa de execução demorada. Quando estiver pronto, o TLS de ponta a ponta será configurado no gateway de aplicativo.

    $gw | Set-AzApplicationGateway
    

Como obter um nome DNS do gateway de aplicativo

Depois de criar o gateway, a próxima etapa é configurar o front-end para comunicação. O Gateway de Aplicativo requer um nome DNS atribuído dinamicamente ao usar um IP público, o que não é amigável. Para garantir que os usuários finais possam acessar o gateway de aplicativo, você poderá usar um registro CNAME para apontar para o ponto de extremidade público do gateway de aplicativo. Para saber mais, confira Configurando um nome de domínio personalizado no Azure.

Para configurar um alias, recupere os detalhes do gateway de aplicativo e seu nome DNS/IP associado usando o elemento PublicIPAddress anexado ao gateway de aplicativo. Use o nome DNS do gateway de aplicativo para criar um registro CNAME que aponte os dois aplicativos Web para esse nome DNS. Não recomendamos o uso de registros A, pois o VIP pode ser alterado no reinício do gateway de aplicativo.

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"
                            }

Próximas etapas

Para mais informações sobre como otimizar a segurança dos seus aplicativos Web com o Firewall do Aplicativo Web por meio do Gateway de Aplicativo, consulte Visão geral do Firewall de Aplicativo Web.