此範例方案有助於使用 Azure 私人連結和 Azure 私人端點來保護與 Microsoft Teams 通道機器人的 Web 應用程式的連線。 同時,它允許 Teams 用戶端中的通道透過 Azure 防火牆執行個體公開的 IP 與機器人通訊。
架構
下載此架構的 Visio 檔案。
資料流程
Azure 虛擬網路支援 Azure 資源之間的通訊。 本範例中的虛擬網路使用位址空間 10.0.0.0/16,並包含三個子網路供情境所需元件使用:
Azure 防火牆子網路 (10.0.1.0/26)。
虛擬網路整合子網路 (10.0.2.0/24),用於將流量從機器人的私人端點路由到防火牆。
私人端點子網路 (10.0.3.0/24),用於將流量從防火牆路由到機器人的私人端點。
Azure 防火牆公開一個公用 IP 位址,用戶端可使用該位址與底層機器人服務進行通訊。 通常,防火牆會放置在自己的虛擬網路中,這是中心輻射架構的常見模式,但這個簡化的範例將所有服務和資源部署到單一虛擬網路中。 Azure 防火牆執行個體會放置在自己的子網路中。
路由表定義流量在虛擬網路內所採用的路由。 它確保進出機器人的流量通過防火牆。
具有 0.0.0.0/0 位址前綴的預設路由指示 Azure 將不在任何其他路由的位址前綴範圍內的流量路由到部署 Azure 防火牆執行個體的子網路。 在此範例中,這是唯一的路線。
虛擬網路整合子網路和私人端點子網路與路由表關聯,確保透過它們的任何流量都透過防火牆進行路由。
機器人服務由機器人 App Service 方案、應用程式服務和機器人頻道註冊組成。
- 應用程式服務有一個註冊的自訂網域,該網域指向防火牆的 IP 位址。 這樣就只能透過防火牆存取應用程式服務。
Azure 私人連結服務,用於透過 Azure 私人端點對機器人應用程式服務進行入站存取。
虛擬網路整合將應用程式服務連接到虛擬網路,確保來自機器人應用程式服務的出站流量通過防火牆。
元件
替代項目
- App Service 環境可以提供完全隔離的私人環境,用於安全地大規模執行應用程式服務應用程式。 此範例未使用 App Service 環境來降低成本,但範例架構可以透過修改來支援它。
案例詳細資料
機器人允許 Teams 使用者透過文字、互動卡和工作模組與 Web 服務互動。 Microsoft Bot Framework 和 Azure Bot Services 為您提供了一組容易使用的工具來建立和管理這些機器人。
您可以使用多種語言開發機器人,例如 C#、JavaScript 和 Python。 開發完成後,您可以將它們部署到 Azure。 機器人的關鍵元件是 Web 應用程式,它包含使用者通訊的核心邏輯和介面。 該機器人工作的關鍵要求之一是它必須公開可公開存取的 HTTPS 端點。
資訊安全策略通常要求 Web 應用程式的所有傳入流量都經過公司防火牆。 這意味著流向機器人的所有流量以及來自機器人的回應都必須通過公司防火牆,就像任何其他 Web 應用程式一樣。
潛在使用案例
組織可以為行動和桌面使用者使用機器人。 這些範例包含:
- 簡單的查詢。 機器人可以為查詢或一組相關匹配提供精確匹配,以幫助消除歧義。
- 多輪互動。 透過幫助預測可能的後續步驟,機器人使人們更容易完成工作流程。
- 接觸使用者。 當文件中的某些內容發生變更或工作項目關閉時,機器人可以傳送訊息。
考量
監視
儘管在此範例情境中未實現監視,但機器人的應用程式服務可以利用 Azure Monitor 服務來監視其可用性和效能。
延展性
此情境中使用的機器人託管在 Azure 應用程式服務上。 因此,您可以使用標準應用程式服務自動擴展功能來自動擴展執行機器人的執行個體數量,從而使您的機器人能夠滿足需求。 有關自動縮放的更多資訊,請參閱自動縮放最佳做法。
如需其他可擴充性主題,請參閱 Azure 架構中心效能效率清單。
DevOps
使用持續部署管道將 Web 應用程式、API 應用程式和行動應用程式部署到 Azure App Service 方案是一種常見做法。 由於安全機器人的應用程式服務受到私人端點的保護,因此外部託管的建置代理程式沒有部署更新所需的存取權。 若要解決此問題,您可能需要使用 Azure 管線自我裝載 DevOps 代理程式等解決方案。
安全性
Azure DDoS 保護 (結合應用程式設計最佳做法) 可提供增強的 DDoS 風險降低功能,以針對 DDoS 攻擊提供更多的防禦。 您應該在任何周邊虛擬網路上啟用 Azure DDOS 保護。
部署此案例
必要條件
您必須擁有現有的 Azure 帳戶。 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
逐步解說
在 Azure Cloud Shell 或首選部署 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
建立私人端點子網路時,預設會停用私人端點原則。
部署完成後,您應該在虛擬網路中看到以下子網路:
透過執行下列 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}
您的防火牆設定應如下所示:
將基本機器人部署到您在步驟 1 中建立的資源群組。
作為此過程的一部分,您將建立一個應用程式註冊,您需要透過管道與機器人進行互動。 在此過程中,您還將部署必要的 App Service 方案、應用程式服務和 Web 應用程式 Bot。
注意
選擇支援 Azure 私人連結的 App Service 方案。
將自訂網域對應到您在步驟 3 中部署到資源群組的應用程式服務。
此步驟需要存取您的網域註冊商,並且需要您將 A 記錄新增至指向您在步驟 2 中建立的防火牆的公用 IP 的自訂網域。
透過上傳網域的現有憑證或在 Azure 中購買 App Service 憑證並將其匯入來保護已對應的自訂網域。 您可以按照在 Azure 應用程式服務中使用 TLS/SSL 繫結保護自訂 DNS 名稱中的步驟執行此操作。
現在,您應該擁有一個功能齊全的機器人,您可以將其新增至 Teams 中的頻道,或按照 Bot Framework SDK 文件中的說明透過網路聊天進行測試。
注意
此時,機器人的應用程式服務仍然可以透過
azurewebsites.net
URL 和您設定的自訂 URL 公開存取。 在接下來的步驟中,您將使用私人端點來停用公共存取。 您還將設定防火牆以允許機器人服務僅與 Teams 用戶端通訊。執行下列 Azure CLI 指令碼來部署和設定私人端點。 此步驟還為機器人的應用程式服務實現虛擬網路整合,將其連接到虛擬網路的整合子網路。
# 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}
執行這些命令後,您應該在資源組中看到以下資源:
應用程式服務的網路部分下的 VNet 整合選項應如下所示:
接下來,您建立路由表以確保進出每個子網路的流量通過防火牆。 您將需要在上一個步驟中建立的防火牆的私人 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
執行命令後,您的路由表資源應如下所示:
建立路由表後,您可以為防火牆新增規則,以將流量從公用 IP 傳送到機器人應用程式服務,並限制 Microsoft Teams 以外的任何端點的流量。 此外,還可以使用服務標籤來允許虛擬網路與 Azure Bot Services 或 Microsoft Entra ID 之間的流量。
執行下列命令:
# 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
執行命令後,您的防火牆規則將如下所示:
確認您的機器人只能從 Teams 中的通道存取,並且進出機器人應用程式服務的所有流量都會通過您的防火牆。
參與者
本文由 Microsoft 維護。 原始投稿人如下。
主要作者:
- Ali Jafry | 雲端解決方案架構師
下一步
查看 Bot Framework SDK 文件以開始建立機器人。
請參閱受防火牆保護的機器人&團隊。