協助保護防火牆後方的 Microsoft Teams 頻道 Bot 和 Web 應用程式

Azure App Service
Azure Web 應用程式防火牆

此範例案例使用 Azure Private Link 和 Azure 私人端點,協助保護 Microsoft Teams 頻道 Bot Web 應用程式的連線。 同時,它可讓Teams用戶端中的頻道透過透過 Azure 防火牆實例公開的IP與 Bot 通訊。

架構

顯示 Teams 到 Azure 防火牆 流程圖的圖表。

下載此架構的 Visio 檔案

資料流程

  • Azure 虛擬網絡 可啟用 Azure 資源之間的通訊。 此範例中的虛擬網路會使用 10.0.0.0/16 的地址空間,並包含三個子網供案例的必要元件使用:

    • Azure 防火牆 子網 (10.0.1.0/26)。

    • 虛擬網絡 整合子網 (10.0.2.0/24),用來將來自 Bot 私人端點的流量路由傳送至防火牆。

    • 私人端點子網 (10.0.3.0/24),用來將流量從防火牆路由傳送至 Bot 的私人端點。

  • Azure 防火牆 會公開用戶端可用來與基礎 Bot 服務通訊的單一公用 IP 位址。 一般而言,防火牆會放在自己的虛擬網路中,這是中樞和輪輻架構的常見模式,但這個簡化的範例會將所有服務和資源部署至單一虛擬網路。 Azure 防火牆 實例會放在自己的子網中。

  • 路由表 會定義流量在虛擬網路內採用的路由。 它可確保進出 Bot 的流量通過防火牆。

    • 具有 0.0.0.0/0 位址前綴的預設路由會指示 Azure 將不在任何其他路由地址前綴內的流量路由傳送至部署 Azure 防火牆 實例的子網。 在此範例中,它是唯一的路由。

    • 虛擬網絡 整合子網私人端點子網會與路由表相關聯,以確保通過它們的任何流量都是透過防火牆路由傳送。

  • Bot Service 是由 Bot App Service 方案、App ServiceBot 通道註冊所組成。

    • App Service 有一個已註冊的自定義網域,指向防火牆的IP位址。 如此一來,應用程式服務只能透過防火牆存取。
  • Azure Private Link 服務可透過 Azure 私人端點對 Bot 應用程式服務的輸入存取。

  • 虛擬網路整合 會將應用程式服務連線到虛擬網路,確保來自 Bot 應用程式服務的輸出流量通過防火牆。

元件

替代項目

  • App Service 環境 可以提供完全隔離且專用的環境,以大規模安全地執行 App Service 應用程式。 此範例不會使用 App Service 環境 來降低成本,但範例架構可以透過修改來支援它。

案例詳細資料

Bot 可讓 Teams 使用者透過文字、互動式卡片和工作模組與 Web 服務互動。 Microsoft Bot Framework 和 Azure Bot Services 可讓您輕鬆使用一組工具來建立和管理這些 Bot。

您可以使用各種語言來開發 Bot,例如 C#、JavaScript 和 Python。 開發之後,您可以將它們部署至 Azure。 Bot 的主要元件是 Web 應用程式,其中包含使用者與其通訊的核心邏輯和介面。 Bot 運作的其中一個主要需求是,它必須公開可公開可公開存取的 HTTPS 端點。

InfoSec 原則通常要求所有連入 Web 應用程式的流量都經過公司防火牆。 這表示所有流向 Bot 的流量,以及來自 Bot 的回應,都必須透過公司防火牆進行路由,就像任何其他 Web 應用程式一樣。

潛在使用案例

組織可以使用適用於行動和桌面使用者的 Bot。 這些範例包含:

  • 簡單查詢。 Bot 可以將完全相符專案傳遞給查詢或一組相關的相符專案,以協助釐清。
  • 多回合互動。 藉由協助預測可能的後續步驟,Bot 可讓人員更輕鬆地完成工作流程。
  • 連絡使用者。 Bot 可以在檔或工作專案關閉時傳送訊息。

考量

監視

雖然此範例案例中並未實作監視,但 Bot 的應用程式服務可以利用 Azure 監視器 服務來監視其可用性和效能。

延展性

此案例中使用的 Bot 裝載於 Azure App 服務。 因此,您可以使用標準 App Service 自動調整功能來自動調整執行 Bot 的實例數目,這可讓您的 Bot 跟上需求。 如需自動調整的詳細資訊,請參閱 自動調整最佳做法

如需其他延展性主題,請參閱 Azure 架構中心 效能效率檢查清單

DevOps

使用持續部署管線將 Web 應用程式、API 應用程式和行動應用程式部署至 Azure App 服務 計畫是常見的作法。 由於受保護的 Bot 應用程式服務受到私人端點的保護,因此外部裝載的組建代理程式沒有部署更新所需的存取權。 若要解決此問題,您可能需要使用 Azure Pipeline 自我裝載 DevOps 代理程式之類的解決方案。

安全性

Azure DDoS 保護 (結合應用程式設計最佳做法) 可提供增強的 DDoS 風險降低功能,以針對 DDoS 攻擊提供更多的防禦。 您應該在任何周邊虛擬網路上啟用 Azure DDOS 保護

部署此案例

必要條件

您必須擁有現有的 Azure 帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

逐步解說

  1. 在 Azure Cloud Shell 或您慣用的部署殼層中執行下列 Azure CLI 命令。

    這組命令會建立本逐步解說所需的必要資源群組、虛擬網路和子網。 Teams 所使用的IP範圍是 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
    

    當您建立私人端點子網時,預設會停用私人端點原則。

    部署完成時,您應該會在虛擬網路內看到下列子網:

    vnet-SecureBot [子網] 窗格的螢幕快照。

  2. 執行下列 CLI 命令,將 Azure 防火牆 實例部署到您在步驟 1 中建立的防火牆子網:

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

    您的防火牆設定看起來應該像這樣:

    fw-SecureBot 防火牆設定的螢幕快照。

  3. 建立基本 Bot

  4. 將基本 Bot 部署到您在步驟 1 中建立的資源群組。

    在此程式中,您將建立應用程式註冊,您需要透過通道與 Bot 互動。 在此程式中,您也會部署必要的 App Service 方案、App Service 和 Web 應用程式 Bot。

    注意

    選取支援 Azure Private Link 的 App Service 方案。

  5. 將自訂網域 對應至您在步驟 3 中部署至資源群組的應用程式服務。

    此步驟需要存取您的網域註冊機構,而且您必須將 A 記錄新增至自定義網域,以指向您在步驟 2 中建立之防火牆的公用 IP。

  6. 上傳網域的現有憑證,或在 Azure 中購買 App Service 憑證並將其匯入,來保護對應的自定義網域。 您可以遵循在 Azure App 服務 中使用 TLS/SSL 系結保護自定義 DNS 名稱中的步驟來執行此動作。

    您現在應該有一個功能完整的 Bot,您可以使用 Bot Framework SDK 檔中找到的指示,在 Teams 中新增至頻道,或透過 網路聊天 進行測試。

    注意

    此時,Bot 的應用程式服務仍可透過 URL 和您設定的自定義 URL 公開存取 azurewebsites.net 。 在下一個步驟中,您將使用私人端點來停用公用存取。 您也會設定防火牆,以允許 Bot 服務只與 Teams 用戶端通訊。

  7. 執行下列 Azure CLI 腳本來 部署和設定私人端點。 此步驟也會實作 Bot 應用程式服務的虛擬網路整合,以將其連線至虛擬網路的整合子網。

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

    執行這些命令之後,您應該會在資源群組中看到下列資源:

    顯示資源群組中資源清單的螢幕快照。

    App Service [網络] 區段底下的 [VNet 整合] 選項看起來應該像這樣:

    wapp-securebot “Networking” 選項的螢幕快照。

    [VNet 整合] 選項的螢幕快照。

    [私人端點連線] 窗格的螢幕快照。

  8. 接下來,您會建立路由表,以確保來自每個子網的流量通過防火牆。 您將需要您在上一個步驟中建立之防火牆的私人IP位址。

    # 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
    

    執行命令之後,您的路由表資源看起來應該像這樣:

    rt-SecureBotRouteTable 窗格的螢幕快照。

    建立路由表之後,您會將規則新增至防火牆,以將來自公用IP的流量傳遞至 Bot 應用程式服務,以及限制來自 Microsoft Teams 以外的任何端點的流量。 此外,您將使用服務標籤,允許虛擬網路與 Azure Bot 服務或 Microsoft Entra 識別符之間的流量。

  9. 執行下列命令:

    # 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
    

    執行命令之後,防火牆規則看起來會像這樣:

    [編輯 NAT 規則集合] 窗格的螢幕快照。

    [編輯網络規則集合] 窗格的螢幕快照。

  10. 確認您的 Bot 只能從 Teams 中的頻道存取,而且 Bot 應用程式服務的所有流量都會通過防火牆。

參與者

本文由 Microsoft 維護。 原始投稿人如下。

主體作者:

下一步