Aiutare a roteggere il bot di canale e l'app Web di Microsoft Teams dietro un firewall

Servizio app di Azure
Web application firewall di Azure

Questo scenario di esempio aiuta a proteggere la connessione all'app Web di un bot di canale di Microsoft Teams usando Collegamento privato di Azure ed Endpoint privato di Azure. Allo stesso tempo, consente ai canali nel client Teams di comunicare con il bot tramite un INDIRIZZO IP esposto tramite un'istanza di Firewall di Azure.

Architettura

Diagramma che mostra il diagramma di flusso da Teams a Firewall di Azure.

Scaricare un file di Visio di questa architettura.

Flusso di dati

  • La Rete virtuale di Azure consente le comunicazioni tra le risorse di Azure. La rete virtuale in questo esempio usa lo spazio indirizzi 10.0.0.0/16 e contiene tre subnet per l'uso da parte dei componenti necessari dello scenario:

    • Subnet di Firewall di Azure (10.0.1.0/26).

    • Subnet di integrazione della rete virtuale (10.0.2.0/24), che viene usata per instradare il traffico dall'endpoint privato del bot al firewall.

    • Subnet di endpoint privato (10.0.3.0/24), che viene usata per instradare il traffico dal firewall all'endpoint privato del bot.

  • Firewall di Azure espone un singolo indirizzo IP pubblico che i client possono usare per comunicare con i servizi bot sottostanti. Un firewall viene in genere posizionato in una rete virtuale specifica. Si tratta di un modello comune per architetture hub-spoke, ma questo è un esempio semplificato e distribuisce tutti i servizi e tutte le risorse in una singola rete virtuale. L'istanza di Firewall di Azure viene posizionata in una subnet specifica.

  • La tabella di route definisce le route che il traffico accetta all'interno della rete virtuale. Garantisce che il traffico proveniente da e verso il bot passi attraverso il firewall.

    • La route predefinita con il prefisso di indirizzo 0.0.0.0/0 richiede ad Azure di instradare il traffico che non rientra nel prefisso di indirizzo di qualsiasi altra route alla subnet in cui è distribuita l'istanza Firewall di Azure. In questo esempio si tratta dell'unica route.

    • La subnet di integrazione della rete virtuale e la subnet di endpoint privato sono associate alla tabella di route, in modo da assicurare che tutto il traffico che le attraversa sia instradato tramite il firewall.

  • Il Servizio Bot è costituito dal piano di servizio app del bot, dal Servizio app e dalla registrazione ai canali del bot.

    • Il Servizio app include un dominio personalizzato registrato che fa riferimento all'indirizzo IP del firewall. È quindi possibile accedere al Servizio app solo tramite il firewall.
  • Il servizio Collegamento privato di Azure per l'accesso in ingresso al Servizio app del bot su un endpoint privato di Azure.

  • L'integrazione della rete virtuale connette il Servizio app alla rete virtuale, assicurando che il traffico in uscita dal Servizio app del bot passi attraverso il firewall.

Componenti

Alternative

  • L'ambiente del servizio app può offrire un ambiente completamente isolato e dedicato per l'esecuzione delle app del Servizio app su larga scala. Questo esempio non usa alcun ambiente del servizio app per ridurre i costi, ma l'architettura di esempio lo potrebbe supportare con qualche modifica.

Dettagli dello scenario

I bot consentono agli utenti di Teams di interagire con i servizi Web tramite testo, schede interattive e moduli di attività. Microsoft Bot Framework e il Servizio Azure Bot forniscono un set di strumenti facili da usare per la creazione e la gestione dei bot.

È possibile sviluppare i bot usando diversi linguaggi, tra cui C#, JavaScript e Python. Dopo averli sviluppati, è possibile distribuirli in Azure. Un componente essenziale del bot è l'app Web, che contiene la logica di base e l'interfaccia con cui l'utente comunica. Uno dei requisiti principali per il funzionamento del bot consiste nell'esporre un endpoint HTTPS accessibile pubblicamente.

Il criterio InfoSec richiede in genere che tutto il traffico in ingresso verso le app Web attraversi un firewall aziendale. Tutto il traffico verso un bot e le risposte dal bot devono essere quindi instradati attraverso un firewall aziendale, analogamente a qualsiasi altra app Web.

Potenziali casi d'uso

Le organizzazioni possono usare bot per utenti mobili e desktop. Alcuni esempi includono:

  • Query semplici. I bot possono fornire una corrispondenza esatta a una query o a un gruppo di corrispondenze correlate per facilitare l'ambiguità.
  • Interazioni a più turni. Consentendo di prevedere i possibili passaggi successivi, i bot semplificano notevolmente il flusso di attività da parte degli utenti.
  • Raggiungere gli utenti. I bot possono inviare un messaggio quando un elemento è cambiato in un documento o quando un elemento di lavoro viene chiuso.

Considerazioni

Monitoraggio

Anche se non è implementato in questo scenario di esempio, il Servizio app di un bot può utilizzare i servizi di Monitoraggio di Azure per monitorarne la disponibilità e le prestazioni.

Scalabilità

I bot usati in questo scenario sono ospitati nel Servizio app di Azure. È quindi possibile usare le funzionalità di scalabilità automatica standard del Servizio app per dimensionare automaticamente il numero di istanze che eseguono il bot, consentendo al bot di adeguarsi alla domanda. Per altre informazioni sulla scalabilità automatica, vedere Procedure consigliate per la scalabilità automatica.

Per altri argomenti relativi alla scalabilità, vedere l'elenco di controllo per l'efficienza delle prestazioni in Centro architetture di Azure.

DevOps

Le app Web, le app per le API e le app per dispositivi mobili vengono in genere distribuite in un piano di servizio app di Azure usando pipeline di distribuzione continua. Poiché il Servizio app di un bot protetto viene protetto mediante un endpoint privato, gli agenti di compilazione ospitati esternamente non hanno l'accesso necessario per distribuire gli aggiornamenti. Per risolvere questo problema, potrebbe essere necessario usare una soluzione come gli agenti DevOps self-hosted di Azure Pipelines.

Sicurezza

Protezione DDoS di Azure, in combinazione con le procedure consigliate per la progettazione di applicazioni, offre funzionalità avanzate di mitigazione DDoS per difendersi meglio dagli attacchi DDoS. È consigliabile abilitare Protezione DDOS di Azure in qualsiasi rete virtuale perimetrale.

Distribuire lo scenario

Prerequisiti

È necessario un account Azure esistente. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

scenario

  1. Eseguire i comandi seguenti dell'interfaccia della riga di comando di Azure in Azure Cloud Shell o nella shell di distribuzione preferita.

    Questo set di comandi crea il gruppo di risorse necessario, la rete virtuale e le subnet necessarie per questa procedura. L'intervallo IP usato da Teams è 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
    

    Quando si crea una subnet di endpoint privato, i criteri dell'endpoint privato vengono disabilitati per impostazione predefinita.

    Al termine, nella rete virtuale dovrebbero essere visualizzate le subnet seguenti:

    Screenshot del riquadro

  2. Distribuire un'istanza di Firewall di Azure nella subnet del firewall creata nel passaggio 1 eseguendo i comandi dell'interfaccia della riga di comando seguenti:

    # 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 configurazione del firewall dovrebbe avere un aspetto analogo al seguente:

    Screenshot della configurazione del firewall fw-SecureBot.

  3. Creare un bot di base.

  4. Distribuire il bot di base nel gruppo di risorse creato nel passaggio 1.

    Come parte di questo processo verrà creata una registrazione di app, necessaria per interagire con il bot tramite i canali. Durante questo processo, si distribuiranno anche il piano di servizio app necessario, il servizio app e il bot dell'app Web.

    Nota

    Selezionare un piano di servizio app che supporta collegamento privato di Azure.

  5. Eseguire il mapping di un dominio personalizzato al Servizio app distribuito nel gruppo di risorse nel passaggio 3.

    Questo passaggio richiede l'accesso al registrar del dominio e richiede l'aggiunta di un record A al dominio personalizzato che fa riferimento all'IP pubblico del firewall creato nel passaggio 2.

  6. È necessario proteggere il dominio personalizzato mappato caricando un certificato esistente per il dominio o acquistando un certificato del servizio app in Azure e importandolo. A tale scopo, seguire la procedura in Proteggere un nome DNS personalizzato con un'associazione TLS/SSL nel Servizio app di Azure.

    A questo punto dovrebbe essere disponibile un bot completamente funzionante che può essere aggiunto a un canale in Teams o testato tramite chat Web usando le istruzioni disponibili nella documentazione di Bot Framework SDK.

    Nota

    Si noti che a questo punto il Servizio app del bot è ancora accessibile pubblicamente tramite l'URL azurewebsites.net e tramite l'URL personalizzato configurato. Nei passaggi successivi verranno usati endpoint privati per disabilitare l'accesso pubblico. Verrà inoltre configurato il firewall per consentire solo al servizio bot di comunicare con i client di Teams.

  7. Eseguire lo script seguente dell'interfaccia della riga di comando di Azure per distribuire e configurare l'endpoint privato. Questo passaggio implementa anche l'integrazione della rete virtuale per il Servizio app del bot, connettendolo alla subnet di integrazione della rete virtuale.

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

    Dopo il completamento di questi comandi, le risorse seguenti dovrebbero essere visualizzate nel gruppo di risorse:

    Screenshot che mostra un elenco di risorse in un gruppo di risorse.

    L'opzione Integrazione rete virtuale nella sezione del servizio app Rete del Servizio app dovrebbe avere un aspetto analogo al seguente:

    Screenshot delle opzioni wapp-securebot

    Screenshot dell'opzione

    Screenshot dell’esperienza utente di connessioni all'endpoint privato

  8. Verrà quindi creata una tabella di route per assicurare che il traffico verso e da ogni subnet passi attraverso il firewall. Sarà necessario l'indirizzo IP privato del firewall creato nel passaggio precedente.

    # 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
    

    Dopo aver eseguito i comandi, la risorsa della tabella di route avrà un aspetto simile al seguente:

    Screenshot del riquadro rt-SecureBotRouteTable.

    Dopo la creazione della tabella di route, verranno aggiunte regole al filtro per distribuire il traffico dall'IP pubblico al Servizio app del bot e per limitare il traffico da qualsiasi endpoint diverso da Microsoft Teams. Verrà inoltre consentito il traffico tra la rete virtuale e i servizi Azure Bot o AMicrosoft Entra ID mediante il tag del servizio.

  9. Eseguire i comandi seguenti:

    # 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
    

    Dopo aver eseguito i comandi, le regole del firewall saranno simili a queste:

    Screenshot del riquadro

    Screenshot del riquadro

  10. Confermare che il bot sia accessibile solo da un canale in Teams e che tutto il traffico verso e dal Servizio app del bot passi attraverso il firewall.

Collaboratori

Questo articolo viene gestito da Microsoft. Originariamente è stato scritto dai seguenti contributori.

Autore principale:

Passaggi successivi