Bewerken

Delen via


Uw Microsoft Teams-kanaalbot en web-app beveiligen achter een firewall

Azure App Service
Azure Web Application Firewall

In dit voorbeeldscenario wordt de verbinding met de web-app van een Microsoft Teams-kanaalbot beveiligd met behulp van Azure Private Link en Azure Private Endpoint. Tegelijkertijd kunnen kanalen in de Teams-client communiceren met de bot via een IP-adres dat wordt weergegeven via een Azure Firewall-exemplaar.

Architectuur

Diagram met het stroomdiagram teams-naar-Azure Firewall.

Een Visio-bestand van deze architectuur downloaden.

Gegevensstroom

  • Azure Virtual Network maakt communicatie mogelijk tussen Azure-resources. Het virtuele netwerk in dit voorbeeld gebruikt de adresruimte 10.0.0.0/16 en bevat drie subnetten voor gebruik door de vereiste onderdelen van het scenario:

    • Azure Firewall-subnet (10.0.1.0/26).

    • Virtual Network Integration Subnet (10.0.2.0/24), dat wordt gebruikt om verkeer van het privé-eindpunt van de bot naar de firewall te routeren.

    • Privé-eindpuntsubnet (10.0.3.0/24), dat wordt gebruikt om verkeer van de firewall naar het privé-eindpunt van de bot te routeren.

  • Azure Firewall maakt één openbaar IP-adres beschikbaar dat clients kunnen gebruiken om te communiceren met de onderliggende botservices. Normaal gesproken wordt een firewall in een eigen virtueel netwerk geplaatst. Dit is een gemeenschappelijk patroon voor hub- en spoke-architecturen , maar in dit vereenvoudigde voorbeeld worden alle services en resources in één virtueel netwerk geïmplementeerd. Het Azure Firewall-exemplaar wordt in een eigen subnet geplaatst.

  • Routetabel definieert de routes die het verkeer binnen het virtuele netwerk neemt. Het zorgt ervoor dat verkeer dat afkomstig is van en naar de bot via de firewall gaat.

    • Met de standaardroute met het adresvoorvoegsel 0.0.0.0/0 wordt Azure geïnstrueerd om verkeer te routeren dat zich niet binnen het adresvoorvoegsel van een andere route bevindt naar het subnet waar het Azure Firewall-exemplaar wordt geïmplementeerd. In dit voorbeeld is dit de enige route.

    • Het subnet voor integratie van virtuele netwerken en het subnet van het privé-eindpunt zijn gekoppeld aan de routetabel, zodat al het verkeer dat via deze subnetten wordt doorgegeven, wordt gerouteerd via de firewall.

  • Bot Service bestaat uit het app service-plan voor de bot, app service en de registratie van botkanalen.

    • De App Service heeft een geregistreerd aangepast domein dat verwijst naar het IP-adres van de firewall. Op deze manier kan de App Service alleen worden geopend via de firewall.
  • Azure Private Link-service voor binnenkomende toegang tot de bot-app-service via een privé-eindpunt van Azure.

  • Integratie van virtuele netwerken verbindt de app-service met het virtuele netwerk, zodat uitgaand verkeer van de bot-app-service via de firewall verloopt.

Onderdelen

Alternatieven

  • Een App Service-omgeving kan een volledig geïsoleerde en toegewezen omgeving bieden voor het veilig uitvoeren van App Service-apps op grote schaal. In dit voorbeeld wordt geen gebruikgemaakt van een App Service-omgeving om de kosten te verlagen, maar de voorbeeldarchitectuur kan dit ondersteunen, met wijzigingen.

Scenariodetails

Met bots kunnen Teams-gebruikers communiceren met webservices via tekst, interactieve kaarten en taakmodules. Het Microsoft Bot Framework en Azure Bot Services bieden u een eenvoudig te gebruiken set hulpprogramma's voor het maken en beheren van deze bots.

U kunt bots ontwikkelen met behulp van verschillende talen, zoals C#, JavaScript en Python. Nadat ze zijn ontwikkeld, kunt u ze implementeren in Azure. Een belangrijk onderdeel van een bot is de web-app, die de kernlogica en interface bevat waarmee gebruikers communiceren. Een van de belangrijkste vereisten voor de bot werkt, is dat er een openbaar toegankelijk HTTPS-eindpunt moet worden weergegeven.

Het InfoSec-beleid vereist doorgaans dat al het binnenkomende verkeer naar web-apps via een bedrijfsfirewall gaat. Dit betekent dat al het verkeer dat naar een bot gaat en reacties van de bot, moet worden gerouteerd via een bedrijfsfirewall, net als bij elke andere web-app.

Potentiële gebruikscases

Organisaties kunnen bots gebruiken voor mobiele en desktopgebruikers. Enkele voorbeelden:

  • Eenvoudige query's. Bots kunnen een exacte overeenkomst leveren aan een query of een groep gerelateerde overeenkomsten om te helpen bij ondubbelzinnigheid.
  • Interacties met meerdere draaiingen. Door te anticiperen op mogelijke volgende stappen, maken bots het veel eenvoudiger voor mensen om een volledige taakstroom te maken.
  • Contact opnemen met gebruikers. Bots kunnen een bericht verzenden wanneer iets is gewijzigd in een document of een werkitem is gesloten.

Overwegingen

Controleren

Hoewel bewaking niet wordt geïmplementeerd in dit voorbeeldscenario, kan de app-service van een bot gebruikmaken van Azure Monitor-services om de beschikbaarheid en prestaties ervan te bewaken.

Schaalbaarheid

De bots die in dit scenario worden gebruikt, worden gehost op Azure-app Service. Als gevolg hiervan kunt u de standaardfuncties voor automatisch schalen van App Service gebruiken om het aantal exemplaren waarop uw bot wordt uitgevoerd automatisch te schalen, zodat uw bot aan de vraag kan voldoen. Zie aanbevolen procedures voor automatisch schalen voor meer informatie over automatisch schalen.

Zie de controlelijst prestatie-efficiëntie van Azure Architecture Center voor andere onderwerpen over schaalbaarheid.

DevOps

Het is gebruikelijk om web-apps, API-apps en mobiele apps te implementeren in een Azure-app Service-plan met behulp van pijplijnen voor continue implementatie. Omdat de app-service van een beveiligde bot is beveiligd met een privé-eindpunt, hebben extern gehoste buildagents niet de toegang die nodig is om updates te implementeren. Om dit te omzeilen, moet u mogelijk een oplossing gebruiken, zoals zelf-hostende DevOps-agents in Azure Pipeline.

Beveiliging

Azure DDoS Protection, gecombineerd met best practices voor toepassingsontwerp, biedt verbeterde DDoS-risicobeperkingsfuncties om meer bescherming te bieden tegen DDoS-aanvallen. Schakel Azure DDOS Protection in voor elk virtueel perimeternetwerk.

Dit scenario implementeren

Vereisten

U moet een bestaand Azure-account hebben. Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Walkthrough

  1. Voer de volgende Azure CLI-opdrachten uit in Azure Cloud Shell of de gewenste implementatieshell.

    Met deze set opdrachten maakt u de benodigde resourcegroep, het virtuele netwerk en de subnetten die vereist zijn voor dit scenario. Het IP-bereik dat wordt gebruikt door Teams is 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
    

    Wanneer u een subnet voor een privé-eindpunt maakt, worden de beleidsregels voor privé-eindpunten standaard uitgeschakeld.

    Wanneer de implementatie is voltooid, ziet u de volgende subnetten in uw virtuele netwerk:

    Schermopname van het deelvenster 'Subnetten' van vnet-SecureBot.

  2. Implementeer een Azure Firewall-exemplaar in het firewallsubnet dat u in stap 1 hebt gemaakt door de volgende CLI-opdrachten uit te voeren:

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

    Uw firewallconfiguratie moet er ongeveer als volgt uitzien:

    Schermopname van de firewallconfiguratie fw-SecureBot.

  3. Maak een eenvoudige bot.

  4. Implementeer de basisbot in de resourcegroep die u in stap 1 hebt gemaakt.

    Als onderdeel van dit proces maakt u een app-registratie, die u via kanalen met de bot moet communiceren. Tijdens dit proces implementeert u ook het benodigde App Service-plan, app service en web-app-bot.

    Notitie

    Selecteer een App Service-plan dat Ondersteuning biedt voor Azure Private Link.

  5. Wijs een aangepast domein toe aan de app-service die u in stap 3 hebt geïmplementeerd in de resourcegroep.

    Voor deze stap is toegang tot uw domeinregistrar vereist. Hiervoor moet u een A-record toevoegen aan het aangepaste domein dat verwijst naar het openbare IP-adres van de firewall die u in stap 2 hebt gemaakt.

  6. Beveilig het toegewezen aangepaste domein door een bestaand certificaat voor het domein te uploaden of een App Service-certificaat in Azure aan te schaffen en te importeren. U kunt dit doen door de stappen in Een aangepaste DNS-naam beveiligen met een TLS/SSL-binding in Azure-app Service te volgen.

    U moet nu een volledig functionele bot hebben die u kunt toevoegen aan een kanaal in Teams of kunt testen via Webchat met behulp van de aanwijzingen in de Bot Framework SDK-documentatie.

    Notitie

    Op dit moment is de app-service van de bot nog steeds openbaar toegankelijk via zowel de azurewebsites.net URL als via de aangepaste URL die u hebt geconfigureerd. In de volgende stappen gebruikt u privé-eindpunten om openbare toegang uit te schakelen. U configureert ook de firewall zodat de botservice alleen kan communiceren met Teams-clients.

  7. Voer het volgende Azure CLI-script uit om het privé-eindpunt te implementeren en te configureren. In deze stap wordt ook de integratie van virtuele netwerken geïmplementeerd voor de app-service van de bot, die deze verbindt met het integratiesubnet van uw virtuele netwerk.

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

    Nadat u deze opdrachten hebt uitgevoerd, ziet u de volgende resources in uw resourcegroep:

    Schermopname van een lijst met resources in een resourcegroep.

    De optie VNet-integratie onder de sectie Netwerken van uw app-service moet er als volgt uitzien:

    Schermopname van de opties voor wapp-securebot

    Schermopname van de optie VNet-integratie.

    Schermopname van het deelvenster Privé-eindpuntverbindingen.

  8. Vervolgens maakt u een routetabel om ervoor te zorgen dat verkeer van en naar elk subnet via de firewall gaat. U hebt het privé-IP-adres nodig van de firewall die u in de vorige stap hebt gemaakt.

    # 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
    

    Nadat u de opdrachten hebt uitgevoerd, moet uw routetabelresource er als volgt uitzien:

    Schermopname van het deelvenster rt-SecureBotRouteTable.

    Nadat u de routetabel hebt gemaakt, voegt u regels toe aan uw firewall om verkeer van het openbare IP-adres aan de bot-app-service te leveren en om verkeer van andere eindpunten dan Microsoft Teams te beperken. Daarnaast staat u verkeer toe tussen het virtuele netwerk en Azure Bot Services of Microsoft Entra ID met behulp van servicetags.

  9. Voer de volgende opdrachten uit:

    # 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
    

    Nadat u de opdrachten hebt uitgevoerd, zien uw firewallregels er ongeveer als volgt uit:

    Schermopname van het deelvenster NAT-regelverzameling bewerken.

    Schermopname van het deelvenster Verzameling netwerkregels bewerken.

  10. Controleer of uw bot alleen toegankelijk is vanuit een kanaal in Teams en dat al het verkeer van en naar de bot-app-service via uw firewall gaat.

Medewerkers

Dit artikel wordt onderhouden door Microsoft. De tekst is oorspronkelijk geschreven door de volgende Inzenders.

Hoofdauteur:

Volgende stappen