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
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
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:
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:
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.
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.
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.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:
Alternativet VNet-integrering under avsnittet Nätverk i apptjänsten bör se ut så här:
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:
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.
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:
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:
- Ali Jafry | Molnlösningsarkitekt
Nästa steg
Gå igenom Dokumentationen om Bot Framework SDK för att börja skapa robotar.
Relaterade resurser
Gå till Azure Architecture Center för att granska relaterade arkitekturer och guider.
Arkitekturguide för Azure Firewall – Azure Architecture Center
Microsoft Entra IDaaS i security operations – Azure-exempelscenarier
Hotindikatorer för cyberhotinformation i Microsoft Sentinel – Azure-exempelscenarier