Ajude a proteger seu bot de canal e aplicativo Web do Microsoft Teams com um firewall

Serviço de aplicativo do Azure
Firewall do aplicativo Web do Azure

Este cenário de exemplo ajuda a proteger a conexão com o aplicativo Web de um bot de canal do Microsoft Teams usando o Link Privado do Azure e o Ponto de Extremidade Privado do Azure. Ao mesmo tempo, ele permite que os canais no cliente do Teams se comuniquem com o bot por meio de um IP que é exposto por meio de uma instância do Firewall do Azure.

Arquitetura

Diagrama mostrando o fluxograma do Teamm para Firewall do Azure.

Baixe um Arquivo Visio dessa arquitetura.

Fluxo de dados

  • A Rede Virtual do Azure permite a comunicação entre os recursos do Azure. A rede virtual neste exemplo usa o espaço de endereço 10.0.0.0/16 e contém três sub-redes para uso pelos componentes necessários do cenário:

    • Sub-rede do Firewall do Azure (10.0.1.0/26).

    • Sub-rede de integração de rede virtual (10.0.2.0/24), que é usada para rotear o tráfego do ponto de extremidade privado do bot para o firewall.

    • Sub-rede de ponto de extremidade privado (10.0.3.0/24), que é usada para rotear o tráfego do firewall para o ponto de extremidade privado do bot.

  • O Firewall do Azure expõe um endereço IP público individual que os clientes podem usar para se comunicar com os serviços de bot subjacentes. Normalmente, um firewall é inserido em sua própria rede virtual, que é um padrão comum para arquiteturas de hub e spoke, mas este exemplo simplificado implanta todos os serviços e recursos em uma única rede virtual. A instância do Firewall do Azure é inserida na própria sub-rede.

  • A tabela de rotas define as rotas que o tráfego utiliza na rede virtual. Ela garante que o tráfego de entrada e saída do bot passe pelo firewall.

    • A rota padrão com o prefixo de endereço 0.0.0.0/0 instrui o Azure a rotear o tráfego que não está dentro do prefixo de endereço de nenhuma outra rota para a sub-rede em que a instância do Firewall do Azure está implantada. Neste exemplo, é a rota única.

    • A Sub-rede de Integração de Rede Virtual e a Sub-rede de Ponto de Extremidade Privado estão associadas à tabela de rotas, garantindo que qualquer tráfego que passe por elas seja roteado pelo firewall.

  • O Serviço de Bot consiste no plano de serviço de aplicativo de bot, no serviço de aplicativo e no registro de canais de bot.

    • O serviço de aplicativo tem um domínio personalizado registrado que aponta para o endereço IP do firewall. Dessa forma, o serviço de aplicativo só pode ser acessado por meio do firewall.
  • O serviço Link Privado do Azure para acesso de entrada ao serviço de aplicativo de bot em um ponto de extremidade privado do Azure.

  • A integração de rede virtual conecta o serviço de aplicativo à rede virtual, garantindo que o tráfego de saída do serviço de aplicativo de bot passe pelo firewall.

Componentes

Alternativas

  • Um Ambiente do Serviço de Aplicativo pode fornecer um ambiente totalmente isolado e dedicado para a execução segura de aplicativos do Serviço de Aplicativo em alta escala. Este exemplo não usa um Ambiente do Serviço de Aplicativo para reduzir custos, mas a arquitetura de exemplo poderia suportá-lo com modificações.

Detalhes do cenário

Os Bots permitem que os usuários do Teams interajam com serviços Web por meio de texto, cartões interativos e módulos de tarefa. O Microsoft Bot Framework e os Serviços de Bot do Azure oferecem um conjunto de ferramentas fácil de usar para criar e gerenciar esses bots.

Você pode desenvolver bots usando uma variedade de linguagens, como C#, JavaScript e Python. Depois de serem desenvolvidos, você pode implantá-los no Azure. Um componente-chave de um bot é o aplicativo Web, que contém a lógica e a interface principais com as quais os usuários se comunicam. Um dos principais requisitos para o bot funcionar é que ele deve expor um ponto de extremidade HTTPS publicamente acessível.

A política InfoSec normalmente requer que todo o tráfego de entrada para aplicativos Web passe por um firewall corporativo. Isso significa que todo o tráfego que vai para um bot e as respostas do bot devem passar por um firewall corporativo, como acontece com qualquer outro aplicativo Web.

Possíveis casos de uso

As organizações podem utilizar bots para usuários móveis e de desktop. Alguns exemplos incluem:

  • Consultas simples. Os bots podem fornecer uma correspondência exata para uma consulta ou um grupo de correspondências relacionadas para ajudar na desambiguação.
  • Interações com várias rodadas. Ao ajudar a prever as possíveis próximas etapas, os bots facilitam muito a conclusão do fluxo de tarefas pelas pessoas.
  • Entrando em contato com os usuários. Os bots podem enviar uma mensagem quando algo for alterado em um documento ou quando um item de trabalho for fechado.

Considerações

Monitoramento

Embora o monitoramento não seja implementado neste cenário de exemplo, o serviço de aplicativo de um bot pode utilizar os serviços do Azure Monitor para monitorar sua disponibilidade e desempenho.

Escalabilidade

Os bots usados neste cenário são hospedados no Serviço de Aplicativo do Azure. Como resultado, você pode usar os recursos padrão de dimensionamento automático do Serviço de Aplicativo para dimensionar automaticamente o número de instâncias que executam o bot, o que permite que ele acompanhe a demanda. Para obter mais informações sobre dimensionamento automático, confira Melhores práticas de dimensionamento automático.

Para outros tópicos de escalabilidade, confira a Lista de verificação de eficiência de desempenho do Centro de Arquitetura do Azure.

DevOps

É uma prática comum implantar aplicativos Web, aplicativos de API e aplicativos móveis em um plano do Serviço de Aplicativo do Azure usando pipelines de implantação contínua. Como o serviço de aplicativo de um bot seguro é protegido por um ponto de extremidade privado, os agentes de build hospedados externamente não têm o acesso necessário para implantar atualizações. Para contornar isso, talvez seja necessário usar uma solução como os agentes DevOps auto-hospedados do Pipeline do Azure.

Segurança

A Proteção contra DDoS do Azure, combinada com as práticas recomendadas de design de aplicativos, fornece recursos aprimorados de mitigação de DDoS para fornecer mais defesa contra ataques de DDoS. Você deve habilitar a Proteção contra DDOS do Azure em qualquer rede virtual do perímetro.

Implantar este cenário

Pré-requisitos

Você deve ter uma conta do Azure já criada. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Passo a passo

  1. Execute os comandos de CLI do Azure a seguir no Azure Cloud Shell ou no shell de implantação de sua preferência.

    Esse conjunto de comandos cria o grupo de recursos, a rede virtual e as sub-redes necessárias para este passo a passo. O intervalo de IP usado pelo Teams é 52.112.0.0/14, 52.122.0.0/15.

    # Declare variables (bash syntax)
    export PREFIX='SecureBot'
    export RG_NAME='rg-'${PREFIX}
    export VNET_NAME='vnet-'${PREFIX}
    export SUBNET_INT_NAME='VnetIntegrationSubnet'
    export SUBNET_PVT_NAME='PrivateEndpointSubnet'
    export LOCATION='eastus'
    export TEAMS_IP_RANGE='52.112.0.0/14 52.122.0.0/15'
    export FIREWALL_NAME='afw-'${LOCATION}'-'${PREFIX}
    
    # Create a resource group
    az group create --name ${RG_NAME} --location ${LOCATION}
    
    # Create a virtual network with a subnet for the firewall
    az network vnet create \
    --name ${VNET_NAME} \
    --resource-group ${RG_NAME} \
    --location ${LOCATION} \
    --address-prefix 10.0.0.0/16 \
    --subnet-name AzureFirewallSubnet \
    --subnet-prefix 10.0.1.0/26
    
    # Add a subnet for the Virtual network integration
    az network vnet subnet create \
    --name ${SUBNET_INT_NAME} \
    --resource-group ${RG_NAME} \
    --vnet-name ${VNET_NAME} \
    --address-prefix 10.0.2.0/24
    
    # Add a subnet where the private endpoint will be deployed for the app service
    az network vnet subnet create \
    --name ${SUBNET_PVT_NAME} \
    --resource-group ${RG_NAME} \
    --vnet-name ${VNET_NAME} \
    --address-prefix 10.0.3.0/24
    

    Ao criar uma sub-rede de ponto de extremidade privado, as políticas de ponto de extremidade privado são desabilitadas por padrão.

    Quando a implantação for concluída, você verá as seguintes sub-redes em sua rede virtual:

    Captura de tela do painel

  2. Implante uma instância do Firewall do Azure na sub-rede do firewall criada na etapa 1, executando os seguintes comandos da CLI:

    # Create a firewall
    az network firewall create \
        --name ${FIREWALL_NAME} \
        --resource-group ${RG_NAME} \
        --location ${LOCATION}
    
    # Create a public IP for the firewall
    az network public-ip create \
        --name ${FIREWALL_NAME}-pip \
        --resource-group ${RG_NAME} \
        --location ${LOCATION} \
        --allocation-method static \
        --sku standard
    
    # Associate the IP with the firewall
    az network firewall ip-config create \
        --firewall-name ${FIREWALL_NAME} \
        --name ${FIREWALL_NAME}-Config \
        --public-ip-address ${FIREWALL_NAME}-pip \
        --resource-group ${RG_NAME} \
        --vnet-name ${VNET_NAME}
    
    # Update the firewall
    az network firewall update \
        --name ${FIREWALL_NAME} \
        --resource-group ${RG_NAME}
    
    # Get the public IP address for the firewall and take note of it for later use
    az network public-ip show \
        --name ${FIREWALL_NAME}-pip \
        --resource-group ${RG_NAME}
    

    A configuração do firewall deve ser semelhante a esta:

    Captura de tela da configuração do firewall fw-SecureBot.

  3. Crie um bot básico.

  4. Implante o bot básico no grupo de recursos criado na etapa 1.

    Como parte desse processo, você criará um registro de aplicativo, que será necessário para interagir com o bot por meio de canais. Durante esse processo, você também implantará o plano do Serviço de Aplicativo, o serviço de aplicativo e o bot de aplicativo web necessários.

    Observação

    Selecione um plano do Serviço de Aplicativo que ofereça suporte ao Link Privado do Azure.

  5. Mapeie um domínio personalizado para o serviço de aplicativo implantado no grupo de recursos na etapa 3.

    Essa etapa requer acesso ao seu registrador de domínios e exige que você adicione um registro A ao domínio personalizado que aponta para o IP público do firewall criado na etapa 2.

  6. Proteja o domínio personalizado mapeado fazendo o upload de um certificado existente para o domínio ou adquirindo um Certificado do Serviço de Aplicativo no Azure e importando-o. Você pode fazer isso seguindo as etapas em Proteger um nome DNS personalizado com uma associação TLS/SSL no Serviço de Aplicativo do Azure.

    Agora você deve ter um bot totalmente funcional que pode ser adicionado a um canal no Teams ou testado por meio do Webchat usando as instruções encontradas na documentação do SDK do Bot Framework.

    Observação

    Nesse ponto, o serviço de aplicativo do bot ainda está acessível publicamente tanto pela URL azurewebsites.net quanto pela URL personalizada que você configurou. Nas próximas etapas, você usará pontos de extremidade privados para desabilitar o acesso público. Você também configurará o firewall para permitir que o serviço de bot se comunique apenas com os clientes do Teams.

  7. Execute o script da CLI do Azure a seguir para implantar e configurar o ponto de extremidade privado. Essa etapa também implementa a integração de rede virtual para o serviço de aplicativo do bot, que o conecta à sub-rede de integração da rede virtual.

    # Disable private endpoint network policies (this step is not required if you're using the Azure portal)
    az network vnet subnet update \
      --name ${SUBNET_PVT_NAME} \
      --resource-group ${RG_NAME} \
      --vnet-name ${VNET_NAME} \
      --disable-private-endpoint-network-policies true
    
    # Create the private endpoint, being sure to copy the correct resource ID from your deployment of the bot app service
    # The ID can be viewed by using the following CLI command:
    # az resource show --name wapp-securebot --resource-group rg-securebot --resource-type Microsoft.web/sites --query "id" 
    az network private-endpoint create \
      --name pvt-${PREFIX}Endpoint \
      --resource-group ${RG_NAME} \
      --location ${LOCATION} \
      --vnet-name ${VNET_NAME} \
      --subnet ${SUBNET_PVT_NAME} \
      --connection-name conn-${PREFIX} \
      --private-connection-resource-id /subscriptions/cad87d9e-c941-4519-a638-c9804a0577b9/resourceGroups/rg-securebot/providers/Microsoft.Web/sites/wapp-securebot \
      --group-id sites
    
    # Create a private DNS zone to resolve the name of the app service
    az network private-dns zone create \
      --name ${PREFIX}privatelink.azurewebsites.net \
      --resource-group ${RG_NAME}
    
    az network private-dns link vnet create \
      --name ${PREFIX}-DNSLink \
      --resource-group ${RG_NAME} \
      --registration-enabled false \
      --virtual-network ${VNET_NAME} \
      --zone-name ${PREFIX}privatelink.azurewebsites.net
    
    az network private-endpoint dns-zone-group create \
      --name chatBotZoneGroup \
      --resource-group ${RG_NAME} \
      --endpoint-name pvt-${PREFIX}Endpoint \
      --private-dns-zone ${PREFIX}privatelink.azurewebsites.net \
      --zone-name ${PREFIX}privatelink.azurewebsites.net
    
    # Establish virtual network integration for outbound traffic
    az webapp vnet-integration add \
      -g ${RG_NAME} \
      -n wapp-${PREFIX} \
      --vnet ${VNET_NAME} \
      --subnet ${SUBNET_INT_NAME}
    

    Depois de executar esses comandos, você deverá ver os seguintes recursos em seu grupo de recursos:

    Captura de tela mostrando uma lista de recursos no grupo de recursos.

    A opção Integração da VNet na seção Rede do seu serviço de aplicativo deve ter a seguinte aparência:

    Captura de tela das opções de

    Captura de tela da opção

    Captura de tela do painel

  8. Em seguida, crie uma tabela de rotas para garantir que o tráfego de e para cada sub-rede passe pelo firewall. Você precisará do endereço IP privado do firewall criado na etapa anterior.

    # Create a route table
    az network route-table create \
      -g ${RG_NAME} \
      -n rt-${PREFIX}RouteTable
    
    # Create a default route with 0.0.0.0/0 prefix and the next hop as the Azure firewall virtual appliance to inspect all traffic. Make sure you use your firewall's internal IP address instead of 10.0.1.4
    az network route-table route create -g ${RG_NAME} \
      --route-table-name rt-${PREFIX}RouteTable -n default \
      --next-hop-type VirtualAppliance \
      --address-prefix 0.0.0.0/0 \
      --next-hop-ip-address 10.0.1.4
    
    # Associate the two subnets with the route table
    az network vnet subnet update -g ${RG_NAME} \
      -n ${SUBNET_INT_NAME} --vnet-name ${VNET_NAME} \
      --route-table rt-${PREFIX}RouteTable
    
    az network vnet subnet update -g ${RG_NAME} \
      -n ${SUBNET_PVT_NAME} \
      --vnet-name ${VNET_NAME} \
      --route-table rt-${PREFIX}RouteTable
    

    Depois de executar os comandos, o recurso da tabela de rotas deverá ter a seguinte aparência:

    Captura de tela do painel rt-SecureBotRouteTable.

    Depois de criar a tabela de rotas, adicione regras ao firewall para entregar o tráfego do IP público ao serviço do aplicativo de bot e para restringir o tráfego de qualquer ponto de extremidade que não seja o Microsoft Teams. Além disso, você permitirá o tráfego entre a rede virtual e os Serviços de Bot do Azure ou o Microsoft Entra ID usando marcas de serviço.

  9. Execute os seguintes comandos:

    # Create a NAT rule collection and a single rule. The source address is the public IP range of Microsoft Teams
    # Destination address is that of the firewall. 
    # The translated address is that of the app service's private link.
    az network firewall nat-rule create \
      --resource-group ${RG_NAME} \
      --collection-name coll-${PREFIX}-nat-rules \
      --priority 200 \
      --action DNAT \
      --source-addresses ${TEAMS_IP_RANGE} \
      --dest-addr 23.100.26.84 \
      --destination-ports 443 \
      --firewall-name ${FIREWALL_NAME} \
      --name rl-ip2appservice \
      --protocols TCP \
      --translated-address 10.0.3.4 \
      --translated-port 443
    
    # Create a network rule collection and add three rules to it. 
    # The first one is an outbound network rule to only allow traffic to the Teams IP range.
    # The source address is that of the virtual network address space, destination is the Teams IP range.
    az network firewall network-rule create \
      --resource-group ${RG_NAME} \
      --collection-name coll-${PREFIX}-network-rules \
      --priority 200 \
      --action Allow \
      --source-addresses 10.0.0.0/16 \
      --dest-addr ${TEAMS_IP_RANGE} \
      --destination-ports 443 \
      --firewall-name ${FIREWALL_NAME} \
      --name rl-OutboundTeamsTraffic \
      --protocols TCP
    
    # This rule will enable traffic to all IP addresses associated with Azure AD service tag
    az network firewall network-rule create \
      --resource-group ${RG_NAME} \
      --collection-name coll-${PREFIX}-network-rules \
      --source-addresses 10.0.0.0/16 \
      --dest-addr AzureActiveDirectory \
      --destination-ports '*' \
      --firewall-name ${FIREWALL_NAME} \
      --name rl-AzureAD \
      --protocols TCP
    
    # This rule will enable traffic to all IP addresses associated with Azure Bot Services service tag
    az network firewall network-rule create \
      --resource-group ${RG_NAME} \
      --collection-name coll-${PREFIX}-network-rules \
      --source-addresses 10.0.0.0/16 \
      --dest-addr AzureBotService \
      --destination-ports '*' \
      --firewall-name ${FIREWALL_NAME} \
      --name rl-AzureBotService \
      --protocols TCP
    

    Depois de executar os comandos, as regras de firewall terão a seguinte aparência:

    Captura de tela do painel

    Captura de tela do painel

  10. Confirme se o bot está acessível somente a partir de um canal no Teams e se todo o tráfego de e para o serviço do aplicativo de bot passa pelo firewall.

Colaboradores

Esse artigo é mantido pela Microsoft. Ele foi originalmente escrito pelos colaboradores a seguir.

Autor principal:

  • Ali Jafry | Arquiteto de Soluções na Nuvem

Próximas etapas