Ayude a proteger su bot de canal de Microsoft Teams y su aplicación web detrás de un firewall

Azure App Service
Firewall de aplicaciones web de Azure

Este escenario de ejemplo ayuda a asegurar la conexión a la aplicación web de un bot de canal de Microsoft Teams utilizando Azure Private Link y Azure Private Endpoint. Al mismo tiempo, permite que los canales del cliente de Teams se comuniquen con el bot a través de una dirección IP que se expone a través de una instancia de Azure Firewall.

Architecture

Diagrama que muestra el diagrama de flujo de Teams-to-Azure Firewall.

Descargue un archivo Visio de esta arquitectura.

Flujo de datos

  • Azure Virtual Network habilita las comunicaciones entre los recursos de Azure. La red virtual de este ejemplo usa el espacio de direcciones 10.0.0.0/16 y contiene tres subredes para que las usen los componentes necesarios del escenario:

    • Subred de Azure Firewall (10.0.1.0/26).

    • Subred de integración de red virtual (10.0.2.0/24), que se usa para enrutar el tráfico desde el punto de conexión privado del bot al firewall.

    • Subred de punto de conexión privado (10.0.3.0/24), que se usa para enrutar el tráfico desde el firewall al punto de conexión privado del bot.

  • Azure Firewall expone una única dirección IP pública que los clientes pueden usar para comunicarse con los servicios de bot subyacentes. Normalmente, un cortafuegos se coloca en su propia red virtual, que es un patrón común para las arquitecturas hub y spoke, pero este ejemplo simplificado despliega todos los servicios y recursos en una única red virtual. La instancia de Azure Firewall se coloca en su propia subred.

  • La tabla de rutas define las rutas que el tráfico toma dentro de la red virtual. Garantiza que el tráfico procedente y desde el bot pasa a través del firewall.

    • La ruta predeterminada con el prefijo de dirección 0.0.0.0/0 indica a Azure que enrute el tráfico que no está dentro del prefijo de dirección de cualquier otra ruta a la subred en que está implementado Azure Firewall. En este ejemplo, es la única ruta.

    • La subred de integración de red virtual y la subred de punto de conexión privado están asociadas a la tabla de rutas, lo que garantiza que todo el tráfico que pasa por estas se enrute a través del firewall.

  • Bot Service consta del plan de App Service del bot, App Service y el registro de canales del bot.

    • App Service tiene un dominio personalizado registrado que apunta a la dirección IP del firewall. De este modo, solo se puede acceder a App Service a través del firewall.
  • Servicio Azure Private Link para el acceso de entrada a la instancia de App Service del bot a través de un punto de conexión privado de Azure.

  • La integración de red virtual conecta App Service a la red virtual, lo que garantiza que el tráfico de salida de la instancia de App Service del bot pase a través del firewall.

Componentes

Alternativas

  • Un App Service Environment puede proporcionar un entorno completamente aislado y dedicado para ejecutar de forma segura aplicaciones de servicios de aplicaciones a gran escala. Este ejemplo no hace uso de un App Service Environment para reducir costos, pero la arquitectura de ejemplo podría admitirlo, con modificaciones.

Detalles del escenario

Los bots permiten a los usuarios de Teams interactuar con servicios web a través de texto, tarjetas interactivas y módulos de tareas. Los servicios Microsoft Bot Framework y Azure Bot Service le ofrecen un conjunto fácil de usar de herramientas para crear y administrar estos bots.

Puede desarrollar bots utilizando una variedad de lenguajes, como C#, JavaScript y Python. Una vez desarrollados, puede implementarlos en Azure. Un componente clave de un bot es la aplicación web, que contiene la lógica central y la interfaz con la que se comunican los usuarios. Uno de los requisitos clave para que el bot funcione es que debe exponer un punto de conexión HTTPS accesible públicamente.

La directiva de InfoSec normalmente requiere que todo el tráfico entrante a las aplicaciones web pase a través de un firewall corporativo. Esto significa que todo el tráfico que se dirige a un bot y las respuestas del bot se deben enrutar a través de un firewall corporativo, como sucede con cualquier otra aplicación web.

Posibles casos de uso

Las organizaciones pueden utilizar bots para los usuarios de móviles y de escritorio. Estos son algunos ejemplos:

  • Consultas sencillas. Los bots pueden entregar una coincidencia exacta a una consulta o a un grupo de coincidencias relacionadas para ayudar con la desambiguación.
  • Interacciones multiturno. Al ayudar a anticipar los posibles pasos siguientes, los bots facilitan mucho el flujo de tareas de las personas.
  • Llegar a los usuarios. Los bots pueden enviar un mensaje cuando algo ha cambiado en un documento o se ha cerrado un elemento de trabajo.

Consideraciones

Supervisión

Aunque la monitorización no está implementada en este escenario de ejemplo, el servicio de aplicación de un bot puede utilizar los servicios de Azure Monitor para monitorizar su disponibilidad y rendimiento.

Escalabilidad

Los bots usados en este escenario se hospedan en Azure App Service. Como resultado, puede utilizar las funciones estándar de autoescalado de App Service para escalar automáticamente el número de instancias que ejecutan su bot, lo que permite a su bot mantenerse al día con la demanda. Para más información sobre el escalado automático, consulte Escalado automático.

Para ver otros temas de escalabilidad, consulte la lista de comprobación de eficiencia del rendimiento del Centro de arquitectura de Azure.

DevOps

Es una práctica común implementar aplicaciones web, aplicaciones de API y aplicaciones móviles en un plan de Azure App Service mediante canalizaciones de implementación continua. Dado que el App Service de un bot seguro está protegido con un punto de conexión privado, los agentes de creación alojados externamente no tienen el acceso necesario para implementar actualizaciones. Para resolverlo, es posible que deba usar una solución como los agentes de DevOps autohospedados de la canalización de Azure.

Seguridad

Azure DDoS Protection, combinado con los procedimientos recomendados de diseño de aplicaciones, proporciona características mejoradas de mitigación de DDoS para ofrecer una mejor defensa frente a los ataques DDoS. Debe habilitar Azure DDOS Protection en cualquier red virtual perimetral.

Implementación de este escenario

Requisitos previos

Debe tener una cuenta de Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Tutorial

  1. Ejecute los siguientes comandos de la CLI de Azure en Azure Cloud Shell o en el shell de implementación que prefiera.

    Este conjunto de comandos crea el grupo de recursos, la red virtual y las subredes necesarias para este tutorial. El intervalo IP que usa Teams es 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
    

    Al crear una subred de punto de conexión privado, las directivas de punto de conexión privado se deshabilitan de forma predeterminada.

    Cuando haya terminado, debería ver las siguientes subredes en la red virtual:

    Captura de pantalla del panel

  2. Implemente una instancia de Azure Firewall en la subred del firewall que creó en el paso 1 mediante la ejecución de los siguientes comandos de la 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}
    

    La configuración del firewall debe tener un aspecto similar al siguiente:

    Captura de pantalla de la configuración del firewall fw-SecureBot.

  3. Cree un bot básico.

  4. Implemente el bot básico en el grupo de recursos que ha creado en el paso 1.

    Como parte de este proceso, creará un registro de aplicación, que se necesita para interactuar con el bot a través de canales. Durante este proceso, también implermentará el plan de App Service, el App Service y el bot de aplicaciones web necesarios.

    Nota:

    Seleccione un plan de App Service que admita Azure Private Link.

  5. Asigne un dominio personalizado a la instancia de App Service que implementó en el grupo de recursos del paso 3.

    Este paso requiere acceso al registrador de dominios y requiere que agregue un registro A al dominio personalizado que apunte a la dirección IP pública del firewall que creó en el paso 2.

  6. Asegure el dominio personalizado asignado cargando un certificado existente para el dominio o comprando un certificado App Service Certificate en Azure e importándolo. Puede ello, siga los pasos descritos en Protección de un nombre DNS personalizado con un enlace TLS/SSL en Azure App Service.

    Ahora debe tener un bot totalmente funcional que puede agregar a un canal en Teams o probar a través de Chat en web mediante las instrucciones que se encuentran en la documentación del SDK de Bot Framework.

    Nota:

    En este momento, aún se puede acceder de forma pública a la instancia de App Service del bot tanto a través de la dirección URL azurewebsites.net como a través de la dirección URL personalizada que ha configurado. En los pasos siguientes, usará puntos de conexión privados para deshabilitar el acceso público. También configurará el firewall para que permita solo al servicio de bot que se comunique con los clientes de Teams.

  7. Ejecute el siguiente script de la CLI de Azure para implementar y configurar el punto de conexión privado. En este paso también se implementa la integración de la red virtual para la instancia de App Service del bot, que se conecta a la subred de integración de la red 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}
    

    Después de ejecutar estos comandos, debería ver los siguientes recursos en el grupo de recursos:

    Captura de pantalla que muestra una lista de recursos en un grupo de recursos.

    La opción Integración con red virtual de la sección Redes de App Service debe tener el siguiente aspecto:

    Captura de pantalla de las opciones wapp-securebot de

    Captura de pantalla de la opción

    Captura de pantalla del panel

  8. A continuación, se crea una tabla de rutas para asegurarse de que el tráfico que llega y que sale de cada subred atraviesa el firewall. Necesitará la dirección IP privada del firewall que creó en el paso 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
    

    Después de ejecutar los comandos, el recurso de tabla de rutas debe tener este aspecto:

    Captura de pantalla del panel rt-SecureBotRouteTable.

    Después de crear la tabla de rutas, se agregan reglas al firewall para entregar tráfico desde la IP pública a la instancia de App Service del bot y para restringir el tráfico desde cualquier punto de conexión que no sea Microsoft Teams. Además, permitirá el tráfico entre la red virtual y Azure Bot Services o Microsoft Entra ID mediante etiquetas de servicio.

  9. Ejecute los comandos siguientes:

    # 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
    

    Después de ejecutar los comandos, las reglas de firewall tendrán un aspecto similar al siguiente:

    Captura de pantalla del panel

    Captura de pantalla del panel

  10. Confirme que su bot es accesible solo desde un canal en Teams, y que todo el tráfico hacia y desde el App Service del bot pasa por su firewall.

Colaboradores

Microsoft mantiene este artículo. Originalmente lo escribieron los siguientes colaboradores.

Autor principal:

  • Ali Jafry | Arquitecto de soluciones en la nube

Pasos siguientes