Redigera

Dela via


Skydda din Microsoft Teams-kanalrobot och webbapp bakom en brandvägg

Azure App Service
Azure Web Application Firewall

Det här exempelscenariot hjälper till att skydda anslutningen till en Microsoft Teams-kanalrobots webbapp med hjälp av Azure Private Link och Azure Private Endpoint. Samtidigt gör det möjligt för kanaler i Teams-klienten att kommunicera med roboten via en IP-adress som exponeras via en Azure Firewall-instans.

Arkitektur

Diagram som visar flödesschemat Teams-till-Azure Firewall.

Ladda ned en Visio-fil med den här arkitekturen.

Dataflöde

  • Azure Virtual Network möjliggör kommunikation mellan Azure-resurser. Det virtuella nätverket i det här exemplet använder adressutrymmet 10.0.0.0/16 och innehåller tre undernät för användning av scenariots nödvändiga komponenter:

    • Azure Firewall-undernät (10.0.1.0/26).

    • Virtual Network Integration Subnet (10.0.2.0/24), som används för att dirigera trafik från robotens privata slutpunkt till brandväggen.

    • Privat slutpunktsundernät (10.0.3.0/24), som används för att dirigera trafik från brandväggen till robotens privata slutpunkt.

  • Azure Firewall exponerar en enda offentlig IP-adress som klienter kan använda för att kommunicera med de underliggande robottjänsterna. Vanligtvis placeras en brandvägg i ett eget virtuellt nätverk, vilket är ett vanligt mönster för hubb- och ekerarkitekturer , men det här förenklade exemplet distribuerar alla tjänster och resurser till ett enda virtuellt nätverk. Azure Firewall-instansen placeras i ett eget undernät.

  • Routningstabellen definierar de vägar som trafiken tar i det virtuella nätverket. Det säkerställer att trafik som kommer till och från roboten passerar genom brandväggen.

    • Standardvägen med adressprefixet 0.0.0.0/0 instruerar Azure att dirigera trafik som inte ligger inom adressprefixet för någon annan väg till undernätet där Azure Firewall-instansen distribueras. I det här exemplet är det den enda vägen.

    • Undernätet för integrering av virtuellt nätverk och undernätet för privat slutpunkt är associerade med routningstabellen, vilket säkerställer att all trafik som passerar genom dem dirigeras genom brandväggen.

  • Bot Service består av robotapptjänstplanen, apptjänsten och robotkanalernas registrering.

    • App Service har en registrerad anpassad domän som pekar på brandväggens IP-adress. På så sätt kan apptjänsten endast nås via brandväggen.
  • Azure Private Link-tjänsten för inkommande åtkomst till robotapptjänsten via en privat Azure-slutpunkt.

  • Integrering av virtuellt nätverk ansluter apptjänsten till det virtuella nätverket, vilket säkerställer att utgående trafik från robotapptjänsten passerar genom brandväggen.

Komponenter

Alternativ

  • En App Service-miljön kan tillhandahålla en helt isolerad och dedikerad miljö för säker körning av App Service-appar i hög skala. Det här exemplet använder inte en App Service-miljön för att minska kostnaderna, men exempelarkitekturen kan stödja det med ändringar.

Information om scenario

Med robotar kan Teams-användare interagera med webbtjänster via text, interaktiva kort och aktivitetsmoduler. Med Microsoft Bot Framework och Azure Bot Services får du en lätthanterad uppsättning verktyg för att skapa och hantera dessa robotar.

Du kan utveckla robotar med hjälp av en mängd olika språk, till exempel C#, JavaScript och Python. När de har utvecklats kan du distribuera dem till Azure. En viktig komponent i en robot är webbappen, som innehåller den kärnlogik och det gränssnitt som användarna kommunicerar med. Ett av de viktigaste kraven för att roboten ska fungera är att den måste exponera en offentligt tillgänglig HTTPS-slutpunkt.

InfoSec-principen kräver vanligtvis att all inkommande trafik till webbappar går via en företagsbrandvägg. Det innebär att all trafik som går till en robot och svar från roboten måste dirigeras genom en företagsbrandvägg, precis som med andra webbappar.

Potentiella användningsfall

Organisationer kan använda robotar för mobila och stationära användare. Vissa exempel inkluderar:

  • Enkla frågor. Robotar kan leverera en exakt matchning till en fråga eller en grupp relaterade matchningar för att hjälpa till med tvetydighet.
  • Interaktioner med flera svängar. Genom att hjälpa till att förutse möjliga nästa steg gör robotar det mycket enklare för personer till ett fullständigt uppgiftsflöde.
  • Nå ut till användare. Robotar kan skicka ett meddelande när något har ändrats i ett dokument eller om ett arbetsobjekt stängs.

Att tänka på

Övervakning

Även om övervakning inte implementeras i det här exempelscenariot kan en robots apptjänst använda Azure Monitor-tjänster för att övervaka dess tillgänglighet och prestanda.

Skalbarhet

De robotar som används i det här scenariot finns i Azure App Service. Därför kan du använda apptjänstens standardfunktioner för automatisk skalning för att automatiskt skala antalet instanser som kör roboten, vilket gör att roboten kan hålla jämna resultat med efterfrågan. Mer information om autoskalning finns i Metodtips för automatisk skalning.

Andra avsnitt om skalbarhet finns i checklista för prestandaeffektivitet i Azure Architecture Center.

DevOps

Det är vanligt att distribuera webbappar, API-appar och mobilappar till en Azure App Service-plan med hjälp av pipelines för kontinuerlig distribution. Eftersom en skyddad robots apptjänst skyddas med en privat slutpunkt har externt värdbaserade byggagenter inte den åtkomst som krävs för att distribuera uppdateringar. För att undvika detta kan du behöva använda en lösning, till exempel Lokala DevOps-agenter i Azure Pipeline.

Säkerhet

Azure DDoS Protection, kombinerat med metodtips för programdesign, ger förbättrade DDoS-åtgärdsfunktioner för att ge mer skydd mot DDoS-attacker. Du bör aktivera Azure DDOS Protection i alla virtuella perimeternätverk.

Distribuera det här scenariot

Förutsättningar

Du måste ha ett befintligt Azure-konto. Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Genomgång

  1. Kör följande Azure CLI-kommandon i Azure Cloud Shell eller det distributionsgränssnitt du föredrar.

    Den här uppsättningen kommandon skapar nödvändiga resursgrupper, virtuella nätverk och undernät som krävs för den här genomgången. IP-intervallet som används av Teams är 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
    

    När du skapar ett privat slutpunktsundernät inaktiveras de privata slutpunktsprinciperna som standard.

    När distributionen är klar bör du se följande undernät i ditt virtuella nätverk:

    Skärmbild av fönstret vnet-SecureBot

  2. Distribuera en Azure Firewall-instans till brandväggsundernätet som du skapade i steg 1 genom att köra följande CLI-kommandon:

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

    Brandväggskonfigurationen bör se ut ungefär så här:

    Skärmbild av brandväggskonfigurationen fw-SecureBot.

  3. Skapa en grundläggande robot.

  4. Distribuera den grundläggande roboten till den resursgrupp som du skapade i steg 1.

    Som en del av den här processen skapar du en appregistrering som du behöver interagera med roboten via kanaler. Under den här processen distribuerar du även den nödvändiga App Service-planen, apptjänsten och webbapproboten.

    Kommentar

    Välj en App Service-plan som stöder Azure Private Link.

  5. Mappa en anpassad domän till apptjänsten som du distribuerade till resursgruppen i steg 3.

    Det här steget kräver åtkomst till domänregistratorn och du måste lägga till en A-post i den anpassade domänen som pekar på den offentliga IP-adressen för brandväggen som du skapade i steg 2.

  6. Skydda den mappade anpassade domänen genom att antingen ladda upp ett befintligt certifikat för domänen eller köpa ett App Service-certifikat i Azure och importera det. Du kan göra detta genom att följa stegen i Skydda ett anpassat DNS-namn med en TLS/SSL-bindning i Azure App Service.

    Nu bör du ha en fullt fungerande robot som du kan lägga till i en kanal i Teams eller testa via Webbchatt med hjälp av anvisningarna i Bot Framework SDK-dokumentationen.

    Kommentar

    I det här läget är robotens apptjänst fortfarande offentligt tillgänglig både azurewebsites.net via URL:en och via den anpassade URL som du har konfigurerat. I nästa steg använder du privata slutpunkter för att inaktivera offentlig åtkomst. Du konfigurerar även brandväggen så att robottjänsten endast kan kommunicera med Teams-klienter.

  7. Kör följande Azure CLI-skript för att distribuera och konfigurera den privata slutpunkten. Det här steget implementerar även integrering av virtuella nätverk för robotens apptjänst, som ansluter den till det virtuella nätverkets integrationsundernät.

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

    När du har kört de här kommandona bör du se följande resurser i resursgruppen:

    Skärmbild som visar en lista över resurser i en resursgrupp.

    Alternativet VNet-integrering under avsnittet Nätverk i apptjänsten bör se ut så här:

    Skärmbild av alternativen för wapp-securebot

    Skärmbild av alternativet

    Skärmbild av fönstret

  8. Därefter skapar du en routningstabell för att säkerställa att trafik till och från varje undernät går genom brandväggen. Du behöver den privata IP-adressen för brandväggen som du skapade i föregående steg.

    # 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
    

    När du har kört kommandona bör routningstabellresursen se ut så här:

    Skärmbild av rt-SecureBotRouteTable-fönstret.

    När du har skapat routningstabellen lägger du till regler i brandväggen för att leverera trafik från den offentliga IP-adressen till robotapptjänsten och för att begränsa trafik från andra slutpunkter än Microsoft Teams. Dessutom tillåter du trafik mellan det virtuella nätverket och Azure Bot Services eller Microsoft Entra-ID med hjälp av tjänsttaggar.

  9. Kör följande kommandon:

    # 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
    

    När du har kört kommandona ser brandväggsreglerna ut ungefär så här:

    Skärmbild av fönstret Redigera NAT-regelsamling.

    Skärmbild av fönstret

  10. Bekräfta att roboten endast är tillgänglig från en kanal i Teams och att all trafik till och från robotapptjänsten går genom brandväggen.

Deltagare

Den här artikeln underhålls av Microsoft. Det har ursprungligen skrivits av följande medarbetare.

Huvudförfattare:

Nästa steg