Bearbeiten

Freigeben über


Schützen Ihres Microsoft Teams-Kanalbots und Ihrer Web-App hinter einer Firewall

Azure App Service
Azure Web Application Firewall

In diesem Beispielszenario schützen Sie die Verbindung mit der Kanalbot-Web-App von Microsoft Teams mithilfe von Azure Private Link und einem privaten Azure-Endpunkt. Gleichzeitig ermöglicht es Kanälen im Teams-Client, über eine IP mit dem Bot zu kommunizieren, die über eine Azure Firewall-Instanz verfügbar gemacht wird.

Aufbau

Diagramm, dass das Flussdiagramm mit der Firewall zwischen Teams und Azure zeigt.

Laden Sie eine Visio-Datei dieser Architektur herunter.

Datenfluss

  • Azure Virtual Network ermöglicht die Kommunikation zwischen Azure-Ressourcen. Das virtuelle Netzwerk in diesem Beispiel verwendet den Adressraum 10.0.0.0/16 und enthält drei Subnetze für die Verwendung durch die erforderlichen Komponenten des Szenarios:

    • Azure Firewall-Subnetz (10.0.1.0/26).

    • Virtual Network-Integrationssubnetz (10.0.2.0/24), das zum Weiterleiten von Datenverkehr vom privaten Endpunkt des Bots an die Firewall verwendet wird

    • Subnetz mit privatem Endpunkt (10.0.3.0/24), das zum Weiterleiten von Datenverkehr vom privaten Endpunkt des Bots an die Firewall verwendet wird

  • Azure Firewall macht eine einzelne öffentliche IP-Adresse verfügbar, die Clients für die Kommunikation mit den zugrunde liegenden Botdiensten verwenden können. Normalerweise wird eine Firewall in einem eigenen virtuellen Netzwerk platziert, was ein übliches Muster für Hub-and-Spoke-Architekturen ist, aber in diesem vereinfachten Beispiel werden alle Dienste und Ressourcen in einem einzigen virtuellen Netzwerk bereitgestellt. Die Azure Firewall-Instanz befindet sich in einem eigenen Subnetz.

  • Die Route-Tabelle definiert die Routen, die Datenverkehr innerhalb des virtuellen Netzwerks übernimmt. Dadurch wird sichergestellt, dass der vom und zum Bot gehende Verkehr die Firewall passiert.

    • Die Standardroute mit dem Adresspräfix 0.0.0.0/0 weist Azure an, Datenverkehr, der sich nicht innerhalb des Adresspräfixes einer anderen Route befindet, an das Subnetz weiterzuleiten, in dem die Azure Firewall-Instanz bereitgestellt wird. In diesem Beispiel ist dies die einzige Route.

    • Das Virtual Network Integrationssubnetz und das Subnetz des privaten Endpunkts sind der Routingtabelle zugeordnet, um sicherzustellen, dass jeglicher Datenverkehr, der sie durchläuft, über die Firewall weitergeleitet wird.

  • Der Bot Service besteht aus dem Bot App Service-Plan, App Service und der Botkanalregistrierung.

    • Für den App Service ist eine benutzerdefinierte Domäne registriert, die auf die IP-Adresse der Firewall verweist. Auf diese Weise kann nur über die Firewall auf den App Service zugegriffen werden.
  • Azure Private Link-Dienst für den eingehenden Zugriff auf den Bot App Service über einen privaten Azure-Endpunkt.

  • Virtual Network Integration verbindet den App Service mit dem virtuellen Netzwerk und stellt sicher, dass ausgehender Datenverkehr vom Bot App Service die Firewall durchläuft.

Komponenten

Alternativen

  • Eine App Service-Umgebungen kann eine vollständig isolierte und dedizierte Umgebung für die sichere Ausführung von App Service-Apps mit umfangreicher Skalierung bieten. In diesem Beispiel wird die App Service-Umgebung nicht verwendet, um die Kosten zu senken, aber die Beispielarchitektur könnte sie mit Änderungen unterstützen.

Szenariodetails

Bots ermöglichen Teams-Benutzern die Interaktion mit Webdiensten über Text, interaktive Karten und Aufgabenmodule. Das Microsoft Bot Framework und Azure Bot Services bieten Ihnen eine Reihe von benutzerfreundlichen Tools zum Erstellen und Verwalten dieser Bots.

Sie können Bots mit einer Vielzahl von Sprachen entwickeln, z. B. C#, JavaScript und Python. Nachdem sie entwickelt wurden, können Sie sie in Azure bereitstellen. Eine wichtige Komponente des Bots ist die Web-App, die die Kernlogik und -schnittstelle enthält, mit der der Benutzer kommuniziert. Eine der wichtigsten Anforderungen für die Arbeit des Bots besteht darin, dass er einen öffentlich zugänglichen HTTPS-Endpunkt verfügbar machen muss.

Die InfoSec-Richtlinie erfordert in der Regel, dass der gesamte eingehende Datenverkehr an Web-Apps durch eine Unternehmensfirewall geleitet wird. Dies bedeutet, dass der gesamte Datenverkehr, der an einen Bot geleitet wird, und die Antworten vom Bot wie bei jeder anderen Web-App durch eine Unternehmensfirewall geleitet werden müssen.

Mögliche Anwendungsfälle

Diese Bots können von Organisationen für mobile Benutzer und für Desktopbenutzer verwendet werden. Beispiele hierfür sind:

  • Einfache Abfragen: Bots können eine exakte Übereinstimmung für eine Abfrage oder eine Gruppe ähnlicher Übereinstimmungen liefern, um Mehrdeutigkeiten auszuräumen.
  • Mehrteilige Interaktionen: Durch Antizipieren möglicher nächster Schritte können Benutzer Aufgaben wesentlich einfacher abschließen.
  • Kontaktaufnahme mit Benutzern. Ein Bot kann eine Nachricht senden, wenn sich etwas in einem Dokument geändert hat oder wenn ein Arbeitselement geschlossen wurde.

Überlegungen

Überwachung

Obwohl die Überwachung in diesem Beispielszenario nicht implementiert, kann die App Service-Instanz eines Bots Azure Monitor-Dienste verwenden, um die Verfügbarkeit und Leistung zu überwachen.

Skalierbarkeit

Die in diesem Szenario verwendeten Bots werden auf Azure App Service gehostet. Daher können Sie die standardmäßigen App Service Features für die automatische Skalierung verwenden, um die Anzahl der Instanzen, auf denen Ihr Bot ausgeführt wird, automatisch zu skalieren, sodass der Bot mit der Nachfrage Schritt halten kann. Weitere Informationen zur automatischen Skalierung finden Sie unter Empfohlene Methoden für die automatische Skalierung.

Weitere Skalierbarkeitsthemen finden Sie im Azure Architecture Center in der Prüfliste zur Leistungseffizienz.

DevOps

Es ist üblich, Web-Apps, API-Apps und mobile Apps mithilfe von Continuous Deployment-Pipelines in einem Azure App Service-Plan bereitzustellen. Da die App Service-Instanz eines geschützten Bots mit einem privaten Endpunkt geschützt ist, haben extern gehostete Build-Agents nicht den Zugriff, der zum Bereitstellen von Updates erforderlich ist. Um dies zu umgehen, müssen Sie möglicherweise eine Lösung wie die selbstgehosteten DevOps-Agents der Azure Pipeline verwenden.

Security

Azure DDoS Protection, kombiniert mit bewährten Methoden für den Anwendungsentwurf, bietet erweiterte Features zur DDoS-Risikominderung, um besser vor DDoS-Angriffen zu schützen. Sie sollten Azure DDOS Protection in allen virtuellen Umkreisnetzwerken aktivieren.

Bereitstellen dieses Szenarios

Voraussetzungen

Sie benötigen ein bestehendes Azure-Konto. Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Exemplarische Vorgehensweise

  1. Führen Sie die folgenden Azure CLI Befehle in Azure Cloud Shell oder Ihrer bevorzugten Bereitstellungs-Shell aus.

    Dieser Befehlssatz erstellt die Ressourcengruppen, die virtuellen Netzwerke und Subnetze, die für diese exemplarische Vorgehensweise erforderlich sind. Der von Teams verwendete IP-Adressbereich ist 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
    

    Wenn Sie ein privates Endpunkt-Subnetz erstellen, sind die Richtlinien für private Endpunkte standardmäßig deaktiviert.

    Nach Abschluss der Bereitstellung sollten die folgenden Subnetze in Ihrem virtuellen Netzwerk angezeigt werden:

    Screenshot des vnet-SecureBot-Bereichs „Subnetze“.

  2. Stellen Sie eine Azure Firewall-Instanz im Firewall-Subnetz bereit, das Sie in Schritt 1 erstellt haben, indem Sie die folgenden CLI-Befehle ausführen:

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

    Ihre Firewall-Konfiguration sollte in etwa wie folgt aussehen:

    Screenshot der fw-SecureBot-Firewall-Konfiguration.

  3. Erstellen eines Basisbots.

  4. Stellen Sie den Basisbot in der Ressourcengruppe bereit, die Sie in Schritt 1 erstellt haben.

    Im Rahmen dieses Prozesses erstellen Sie eine App-Registrierung, die Sie benötigen, um mit dem Bot über Kanäle zu interagieren. Während dieses Prozesses werden Sie auch den erforderlichen App Service-Plan, den App Service und den Web-App-Bot bereitstellen.

    Hinweis

    Wählen Sie einen App Service-Plan aus, der Azure Private Link unterstützt.

  5. Ordnen Sie dem App Service, der in Schritt 3 für die Ressourcengruppe bereitgestellt wurde, eine benutzerdefinierte Domäne zu.

    Dieser Schritt erfordert Zugriff auf Ihre Domänenregistrierungsstelle, und Sie müssen der benutzerdefinierten Domäne einen A-Eintrag hinzufügen, der auf die öffentliche IP-Adresse der Firewall verweist, die Sie in Schritt 2 erstellt haben.

  6. Schützen Sie die zugeordnete benutzerdefinierte Domäne, indem Sie entweder ein vorhandenes Zertifikat für die Domäne hochladen oder ein App Service Certificate in Azure erwerben und importieren. Befolgen Sie hierzu die Schritte im Tutorial: Schützen eines benutzerdefinierten DNS-Namens mit einer TLS/SSL-Bindung in Azure App Service.

    Sie sollten nun über einen voll funktionsfähigen Bot verfügen, den Sie einem Kanal in Teams hinzufügen oder über Webchat testen können, indem Sie die Anweisungen in der Bot Framework SDK-Dokumentation befolgen.

    Hinweis

    Zu diesem Zeitpunkt ist der App-Dienst des Bots immer noch öffentlich zugänglich, sowohl über die azurewebsites.net URL als auch über die von Ihnen konfigurierte benutzerdefinierte URL. In den nächsten Schritten verwenden Sie private Endpunkte, um den öffentlichen Zugriff zu deaktivieren. Außerdem konfigurieren Sie die Firewall so, dass der Botdienst nur mit Teams-Clients kommunizieren kann.

  7. Führen Sie das folgende Azure CLI-Skript aus, um den privaten Endpunkt bereitzustellen und zu konfigurieren. In diesem Schritt wird auch die virtuelle Netzwerk-Integration für die App Service-Instanz des Bots implementiert und eine Verbindung mit dem Integrationssubnetz Ihres virtuellen Netzwerks hergestellt.

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

    Nachdem Sie diese Befehle ausgeführt haben, sollten die folgenden Ressourcen in Ihrer Ressourcengruppe angezeigt werden:

    Screenshot der Liste der Ressourcen in einer Ressourcengruppe.

    Die Option VNet-Integration im Abschnitt Netzwerk Ihres App Service sollte wie folgt aussehen:

    Screenshot der wapp-securebot-Netzwerkoptionen.

    Screenshot der Option „VNet-Integration“.

    Screenshot des Bereichs “Verbindungen mit privaten Endpunkten“.

  8. Als Nächstes erstellen Sie eine Routingtabelle, um sicherzustellen, dass Datenverkehr zu und aus jedem Subnetz die Firewall durchläuft. Sie benötigen die private IP-Adresse der Firewall, die Sie im vorherigen Schritt erstellt haben.

    # 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
    

    Nachdem Sie die Befehle ausgeführt haben, sollte die Route-Tabellenressource wie folgt aussehen:

    Screenshot des Bereichs „rt-SecureBotRouteTable“.

    Nach dem Erstellen der Routingtabelle fügen Sie Ihrer Firewall Regeln hinzu, um Datenverkehr von der öffentlichen IP-Adresse an die App Service-Instanz des Bots zu übermitteln und den Datenverkehr von einem anderen Endpunkt als Microsoft Teams einzuschränken. Darüber hinaus lassen Sie mithilfe von Diensttags Datenverkehr zwischen dem virtuellen Netzwerk und Azure Bot Service oder Microsoft Entra ID zu.

  9. Führen Sie die folgenden Befehle aus:

    # 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
    

    Nachdem Sie die Befehle ausgeführt haben, sehen Ihre Firewallregeln wie folgt aus:

    Screenshot des Bereichs „NAT-Regelsammlung bearbeiten“.

    Screenshot des Bereichs „Netzwerkregelsammlung bearbeiten“.

  10. Bestätigen Sie, dass Ihr Bot nur über einen Kanal in Teams zugänglich ist und dass der gesamte Datenverkehr zum und vom Bot App Service Ihre Firewall durchläuft.

Beitragende

Dieser Artikel wird von Microsoft gepflegt. Er wurde ursprünglich von folgenden Mitwirkenden geschrieben:

Hauptautor:

Nächste Schritte