Modifier

Contribuer à sécuriser votre bot de canal Microsoft Teams et de votre application web derrière un pare-feu

Azure App Service
Azure Web Application Firewall

Cet exemple de scénario contribue à sécuriser la connexion à une application web du bot du canal Microsoft Teams à l’aide d’Azure Private Link et d’Azure Private Endpoint. Dans le même temps, il permet aux canaux du client Teams de communiquer avec le bot à l’aide d’une adresse IP exposée via une instance du Pare-feu Azure.

Architecture

Diagramme illustrant l’organigramme de communication de Teams vers le Pare-feu Azure.

Téléchargez un fichier Visio de cette architecture.

Dataflow

  • Réseau virtuel Azure permettant la communication entre ressources Azure. Dans cet exemple, le réseau virtuel utilise l’espace d’adressage 10.0.0.0/16, et contient trois sous-réseaux utilisables par les composants requis du scénario :

    • Sous-réseau de Pare-feu Azure (10.0.1.0/26).

    • Sous-réseau d’intégration de réseau virtuel (10.0.2.0/24), utilisé pour router le trafic du point de terminaison privé du bot vers le pare-feu.

    • Sous-réseau de point de terminaison privé (10.0.3.0/24), utilisé pour router le trafic du pare-feu vers le point de terminaison privé du bot.

  • Pare-feu Azure exposant une adresse IP publique unique que les clients peuvent utiliser pour communiquer avec les services de bot sous-jacents. En règle générale, un pare-feu est placé dans son propre réseau virtuel. C’est un modèle courant pour les architectures hub-and-spoke, mais cet exemple simplifié déploie l’ensemble des services et ressources dans un même réseau virtuel. L’instance de pare-feu est placée dans son propre sous-réseau.

  • La table de routage définit les itinéraires du trafic dans le réseau virtuel. Elle veille à ce que le trafic entrant vers et depuis le bot passe par le pare-feu.

    • La route par défaut avec le préfixe d’adresse 0.0.0.0/0 indique à Azure de router le trafic qui n’est pas compris dans le préfixe d’adresse d’une autre route vers le sous-réseau où l’instance du Pare-feu Azure est déployée. Dans cet exemple, c’est la seule route.

    • Sous-réseau d’intégration de réseau virtuel et sous-réseau de point de terminaison privé associés à la table de routage, ce qui garantit que tout le trafic qui les traverse est routé via le pare-feu.

  • Bot Service se composant du plan App Service du bot, du service App Service et de l’inscription de chaînes de bot.

    • Le service App Service dispose d’un domaine personnalisé inscrit qui pointe vers l’adresse IP du pare-feu. Ainsi, le service App Service n’est accessible que via le pare-feu.
  • Service Azure Private Link pour l’accès entrant au bot App service sur un point de terminaison privé Azure.

  • Intégration du réseau virtuel connectant le service App Service au réseau virtuel, garantissant ainsi que le trafic sortant du service App service du bot franchit le pare-feu.

Composants

Autres solutions

  • App Service Environment peut fournir un environnement entièrement isolé et dédié pour l’exécution sécurisée d’applications App Service à grande échelle. Cet exemple n’utilise pas App Service Environment pour réduire les coûts, mais l’exemple d’architecture pourrait le prendre en charge moyennant des modifications.

Détails du scénario

Les bots permettent aux utilisateurs de Teams d’interagir avec des services web par le biais de textes, de cartes interactives et de modules de tâches. Le Microsoft Bot Framework et Azure Bot Services vous offrent un ensemble d’outils faciles à utiliser pour créer et gérer ces bots.

Vous pouvez développer des bots à l’aide de divers langages, comme C#, JavaScript et Python. Une fois développés, vous pouvez les déployer sur Azure. Un composant clé de bot est l’application web qui contient la logique principale et l’interface avec laquelle l’utilisateur communique. L’une des principales conditions pour que le bot fonctionne est qu’il doit exposer un point de terminaison HTTPS accessible publiquement.

La stratégie InfoSec requiert généralement que tout le trafic entrant vers des applications web passe par un pare-feu d’entreprise. Cela signifie que tout le trafic dirigé vers un bot, et les réponses de celui-ci, doivent être acheminés via un pare-feu d’entreprise, comme avec toute autre application web.

Cas d’usage potentiels

Les organisations peuvent utiliser des bots pour les utilisateurs mobiles et de bureau. Voici quelques exemples :

  • Requêtes simples. Les bots peuvent fournir une correspondance exacte à une requête ou à un groupe de correspondances associées pour lever toute ambiguïté.
  • Interactions multitours. L’anticipation des éventuelles étapes suivantes facilite l’exécution d’un flux de tâches.
  • Contacter les utilisateurs. Les bots peuvent envoyer un message quand quelque chose a changé dans un document ou qu’un élément de travail est fermé.

Considérations

Surveillance

Bien que la surveillance ne soit pas implémentée dans cet exemple de scénario, le service App Service d’un bot peut utiliser des services Azure Monitor pour superviser sa disponibilité et ses performances.

Extensibilité

Les bots utilisés dans ce scénario sont hébergés sur Azure App Service. Par conséquent, vous pouvez utiliser les fonctionnalités standard de mise à l’échelle automatique du service App Service pour mettre automatiquement à l’échelle le nombre d’instances exécutant votre bot, ce qui permet à votre bot de suivre la demande. Pour plus d’informations, consultez les bonnes pratiques en matière de mise à l’échelle automatique.

Pour plus d’informations sur la scalabilité, consultez la Check-list pour l’efficacité des performances du Centre des architectures Azure.

DevOps

Il est courant de déployer des applications web, des applications d’API et des applications mobiles sur un plan Azure App Service à l’aide de pipelines de déploiement continu. Comme le service App Service du bot sécurisé est protégé à l’aide d’un point de terminaison privé, les agents de build hébergés en externe ne disposent pas de l’accès nécessaire pour déployer des mises à jour. Pour contourner ce problème, vous pouvez être amené à utiliser une solution telle que les agents de DevOps auto-hébergés du pipeline Azure.

Sécurité

Azure DDoS Protection, combiné aux bonnes pratiques de conception d’application, offre des fonctionnalités d’atténuation des attaques DDoS améliorées pour une meilleure défense contre les attaques DDoS. Vous devez activer Azure DDOS Protection sur tout réseau virtuel de périmètre.

Déployer ce scénario

Prérequis

Vous devez disposer d’un compte Azure existant. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Procédure pas à pas

  1. Exécutez les commandes Azure CLI suivantes dans Azure Cloud Shell ou votre interpréteur de commandes de déploiement préféré.

    Ce jeu de commandes crée le groupe de ressources, le réseau virtuel et les sous-réseaux que cette procédure pas à pas requiert. La plage d’adresses IP utilisée par Teams est 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
    

    Lorsque vous créez un sous-réseau de point de terminaison privé, les stratégies de point de terminaison privé sont désactivées par défaut.

    Une fois le déploiement terminé, vous devez voir les sous-réseaux suivants au sein de votre réseau virtuel :

    Capture d’écran du volet « Sous-réseaux » vnet-SecureBot.

  2. Déployez une instance de Pare-feu Azure dans le sous-réseau de pare-feu que vous avez créé à l’étape 1 en exécutant les commandes CLI suivantes :

    # 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 configuration de votre pare-feu devrait ressembler à ceci :

    Capture d’écran de la configuration du pare-feu fw-SecureBot.

  3. Créer un bot de base.

  4. Déployez le bot de base dans le groupe de ressources que vous avez créé à l’étape 1.

    Dans le cadre de ce processus, vous allez créer une inscription d’application dont vous avez besoin pour interagir avec le bot via des canaux. Au cours de ce processus, vous allez également déployer le plan App Service, le service App Service et le bot d’application web requis.

    Notes

    Sélectionnez un plan de App Service qui prend en charge Azure Private Link.

  5. Mappez un domaine personnalisé au service App service que vous avez déployé dans le groupe de ressources à l’étape 3.

    Cette étape nécessite un accès à votre bureau d’enregistrement de domaines et requiert que vous ajoutiez un enregistrement A au domaine personnalisé pointant vers l’adresse IP publique du pare-feu que vous avez créé à l’étape 2.

  6. Sécurisez le domaine personnalisé mappé en chargeant un certificat existant pour le domaine ou en achetant un service App Service Certificate dans Azure et en l’important. Pour ce faire, suivez les étapes décrites dans Sécuriser un nom DNS personnalisé avec une liaison TLS/SSL dans Azure App Service.

    Vous devriez maintenant disposer d’un bot pleinement fonctionnel que vous pouvez ajouter à un canal dans Teams, ou tester via le Chat Web en suivant les instructions fournies dans la Documentation du kit SDK Bot Framework.

    Notes

    À ce stade, le service d'application du robot est toujours accessible au public par l'URL azurewebsites.net et par l'URL personnalisée que vous avez configurée. Dans les étapes suivantes, vous allez utiliser des points de terminaison privés pour désactiver l’accès public. Vous allez aussi configurer le pare-feu pour autoriser le service bot à communiquer uniquement avec les clients Teams.

  7. Exécutez le script de Azure CLI suivant pour déployer et configurer le point de terminaison privé. Cette étape implémente également l’intégration au réseau virtuel pour le service App Service du bot, qui le connecte au sous-réseau d’intégration de votre réseau virtuel.

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

    Une fois ces commandes exécutées, vous devriez voir les ressources suivantes dans votre groupe de ressources :

    Capture d’écran montrant une liste de ressources dans un groupe de ressources.

    L’option d’intégration au réseau virtuel sous la section Mise en réseau de votre service App Service doit se présenter comme suit :

    Capture d’écran des options de mise en réseau wapp-securebot.

    Capture d’écran de l’option « Intégration au réseau virtuel ».

    Capture d’écran du volet  « Connexions de point de terminaison privé ».

  8. Ensuite, vous allez créer une table de routage pour garantir que le trafic à destination et en provenance de chaque sous-réseau passe par le pare-feu. Vous aurez besoin de l’adresse IP privée du pare-feu que vous avez créé à l’étape précédente.

    # 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
    

    Une fois que vous avez exécuté les commandes, votre ressource de table de routage doit se présenter comme suit :

    Capture d’écran du volet rt-SecureBotRouteTable.

    Une fois la table de routage créée, vous allez ajouter des règles à votre pare-feu pour distribuer le trafic de l’adresse IP publique vers le service App Service du bot et pour limiter le trafic provenant de n’importe quel point de terminaison autre que Microsoft Teams. Vous allez aussi autoriser le trafic entre le réseau virtuel et les services Azure Bot Service ou Microsoft Entra ID en utilisant des étiquettes de service.

  9. Exécutez les commandes suivantes :

    # 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
    

    Une fois que vous avez exécuté les commandes, vos règles de pare-feu se présentent comme suit :

    Capture d’écran du volet « Modification du regroupement de règles NAT ».

    Capture d’écran du volet « Modification du regroupement de règles de réseau ».

  10. À ce stade, vous pouvez vérifier que votre bot n’est accessible qu’à partir d’un canal dans Teams, et que tout le trafic en provenance et à destination du service App Service de bot passe par votre pare-feu.

Contributeurs

Cet article est géré par Microsoft. Il a été écrit à l’origine par les contributeurs suivants.

Auteur principal :

Étapes suivantes