Editar

Share via


Ajude a proteger seu bot de canal e aplicativo Web do Microsoft Teams atrás de um firewall

Azure App Service
Azure Web Application Firewall

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 Azure Private Link e o Azure Private Endpoint. Ao mesmo tempo, ele permite que os canais no cliente do Teams se comuniquem com o bot por meio de um IP exposto por meio de uma instância do Firewall do Azure.

Arquitetura

Diagrama mostrando o fluxograma do Firewall do Teams para o Azure.

Transfira um ficheiro do Visio desta arquitetura.

Fluxo de dados

  • A Rede Virtual do Azure permite comunicações entre 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.

    • Private Endpoint Subnet (10.0.3.0/24), que é usado para rotear o tráfego do firewall para o ponto de extremidade privado do bot.

  • O Firewall do Azure expõe um único endereço IP público que os clientes podem usar para se comunicar com os serviços de bot subjacentes. Normalmente, um firewall é colocado em sua própria rede virtual, que é um padrão comum para arquiteturas 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 é colocada em sua própria sub-rede.

  • A tabela de rotas define as rotas que o tráfego realiza dentro da rede virtual. Ele garante que o tráfego que entra e sai 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 qualquer outra rota para a sub-rede onde a instância do Firewall do Azure está implantada. Neste exemplo, é a única rota.

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

  • O Serviço de Bot consiste no plano de serviço de aplicativo de bot, serviço de aplicativo e 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. Desta forma, o serviço da aplicação só pode ser acedido através da firewall.
  • Serviço de 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 pode suportá-lo, com modificações.

Detalhes do cenário

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

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

A política InfoSec geralmente exige 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 ser encaminhados através de um firewall corporativo, como acontece com qualquer outro aplicativo Web.

Potenciais casos de utilização

As organizações podem utilizar bots para usuários móveis e 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 multi-turno. Ao ajudar a antecipar possíveis próximos passos, os bots tornam muito mais fácil para as pessoas concluírem o fluxo de tarefas.
  • Chegar aos utilizadores. Os bots podem enviar uma mensagem quando algo mudou em um documento ou um item de trabalho é fechado.

Considerações

Monitorização

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 de dimensionamento automático padrão do Serviço de Aplicativo para dimensionar automaticamente o número de instâncias que executam seu bot, o que permite que ele acompanhe a demanda. Para obter mais informações sobre dimensionamento automático, consulte Práticas recomendadas de dimensionamento automático.

Para outros tópicos de escalabilidade, consulte 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 com um ponto de extremidade privado, os agentes de compilação 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 agentes de DevOps auto-hospedados do Azure Pipeline.

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 DDoS. Você deve habilitar a Proteção DDOS do Azure em qualquer rede virtual de perímetro.

Implementar este cenário

Pré-requisitos

Você deve ter uma conta existente do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

Instruções

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

    Este 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
    

    Quando você cria uma sub-rede de ponto de extremidade privada, as políticas de ponto de extremidade privado são desabilitadas por padrão.

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

    Captura de ecrã do painel

  2. Implante uma instância do Firewall do Azure na sub-rede do firewall que você criou 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 ter esta aparência:

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

  3. Crie um bot básico.

  4. Implante o bot básico no grupo de recursos que você criou na etapa 1.

    Como parte desse processo, você criará um registro de aplicativo, que você precisa 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.

    Nota

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

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

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

  6. Proteja o domínio personalizado mapeado carregando um certificado existente para o domínio ou comprando 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 Web Chat usando as instruções encontradas na documentação do SDK do Bot Framework.

    Nota

    Neste ponto, o serviço de aplicativo do bot ainda está acessível publicamente pela URL e pela azurewebsites.net 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 clientes do Teams.

  7. Execute o seguinte script da CLI do Azure para implantar e configurar o ponto de extremidade privado. Esta 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 sua 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ê verá os seguintes recursos em seu grupo de recursos:

    Captura de ecrã a mostrar uma lista de recursos num grupo de recursos.

    A opção Integração de rede virtual na seção Rede do serviço de aplicativo deve ter esta aparência:

    Captura de ecrã das opções

    Screenshot da opção

    Captura de ecrã 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 deve ter esta aparência:

    Captura de ecrã do painel rt-SecureBotRouteTable.

    Depois de criar a tabela de rotas, você adiciona regras ao firewall para entregar o tráfego do IP público para o serviço de 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 a ID do Microsoft Entra 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 ecrã do painel

    Captura de ecrã do painel

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

Contribuidores

Este artigo é mantido pela Microsoft. Foi originalmente escrito pelos seguintes contribuidores.

Autor principal:

  • Ali Jafry - Brasil | Arquiteto de Soluções Cloud

Próximos passos