Защита бота канала Microsoft Teams и веб-приложения за брандмауэром

Служба приложений Azure
Брандмауэр веб-приложения Azure

Этот пример сценария помогает защитить подключение к веб-приложению бота канала Microsoft Teams с помощью Приватный канал Azure и частной конечной точки Azure. В то же время он позволяет каналам в клиенте Teams взаимодействовать с ботом через IP-адрес, предоставляемый через экземпляр Брандмауэр Azure.

Архитектура

Схема, на которой показана блок-схема Teams —Брандмауэр Azure.

Скачайте файл 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. В этом примере это единственный маршрут.

    • Подсеть интеграции виртуальная сеть и подсеть частной конечной точки связаны с таблицей маршрутов, обеспечивая маршрутизацию трафика через брандмауэр.

  • Служба Bot состоит из плана службы приложений бота, службы приложений и регистрации каналов бота.

    • Служба приложений имеет зарегистрированный личный домен, указывающий на IP-адрес брандмауэра. Таким образом, служба приложений может быть доступна только через брандмауэр.
  • Приватный канал Azure служба для входящего доступа к службе приложений бота через частную конечную точку Azure.

  • Интеграция виртуальной сети подключает службу приложений к виртуальной сети, обеспечивая передачу исходящего трафика из службы приложений бота через брандмауэр.

Компоненты

Альтернативные варианты

  • Среда службы приложений может обеспечить полностью изолированную и выделенную среду для безопасного запуска приложений Служба приложений в большом масштабе. В этом примере не используется Среда службы приложений для снижения затрат, но пример архитектуры может поддерживать его с изменениями.

Подробности сценария

Боты позволяют пользователям Teams взаимодействовать с веб-службами через текст, интерактивные карты и модули задач. Microsoft Bot Framework и службы Azure Bot предоставляют вам легкий в использовании набор средств для создания ботов и управления ими.

Вы можете разрабатывать боты с помощью различных языков, таких как C#, JavaScript и Python. После разработки их можно развернуть в Azure. Ключевым компонентом бота является веб-приложение, содержащее основную логику и интерфейс, с которыми взаимодействуют пользователи. Одним из основных требований для работы бота является то, что он должен предоставлять общедоступную конечную точку HTTPS.

Политика InfoSec обычно требует, чтобы весь входящий трафик в веб-приложения проходил через корпоративный брандмауэр. Это означает, что весь трафик, который передается боту, и ответы от бота, должны направляться через корпоративный брандмауэр, как и в любом другом веб-приложении.

Потенциальные варианты использования

Организации могут использовать боты для мобильных и настольных пользователей. Некоторыми примерами могут служить:

  • Простые запросы. Боты могут доставлять точное соответствие запросу или группе связанных совпадений, чтобы помочь в диамбигуации.
  • Взаимодействие с несколькими поворотами. Помогая предвидеть возможные дальнейшие шаги, боты делают его гораздо проще для людей в полном потоке задач.
  • Обращение к пользователям. Боты могут отправлять сообщение, если что-то изменилось в документе или рабочем элементе закрывается.

Рекомендации

Наблюдение

Хотя мониторинг не реализован в этом примере, служба приложений бота может использовать службы Azure Monitor для мониторинга доступности и производительности.

Масштабируемость

Боты, используемые в этом сценарии, размещаются в службе приложений Azure. В результате можно использовать стандартные Служба приложений функции автомасштабирования для автоматического масштабирования числа экземпляров, запущенных ботом, что позволяет боту поддерживать спрос. Дополнительные сведения об автомасштабировании см. в рекомендациях по автомасштабированию.

Дополнительные сведения о масштабируемости см. в контрольном списке эффективности Центра архитектуры Azure.

DevOps

Это распространенная практика развертывания веб-приложений, приложений API и мобильных приложений в плане службы приложение Azure с помощью конвейеров непрерывного развертывания. Так как служба приложений защищенного бота защищена частной конечной точкой, внешние размещенные агенты сборки не имеют доступа, необходимого для развертывания обновлений. Чтобы обойти эту проблему, может потребоваться использовать такое решение, как локальные агенты DevOps в Azure Pipeline.

Безопасность

Защита от атак DDoS Azure в сочетании с рекомендациями по проектированию приложений предоставляет расширенные функции защиты от атак DDoS. Необходимо включить защиту от атак DDOS Azure в любой виртуальной сети периметра.

Развертывание этого сценария

Необходимые компоненты

Необходимо иметь учетную запись Azure. Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Пошаговое руководство

  1. Выполните следующие команды Azure CLI в Azure Cloud Shell или в предпочитаемой оболочке развертывания.

    Этот набор команд создает необходимую группу ресурсов, виртуальную сеть и подсети, необходимые для этого пошагового руководства. Диапазон IP-адресов, используемый 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
    

    При создании подсети частной конечной точки политики частной конечной точки отключены по умолчанию.

    После завершения развертывания в виртуальной сети должны появиться следующие подсети:

    Снимок экрана: панель

  2. Разверните экземпляр Брандмауэр Azure в подсети брандмауэра, созданной на шаге 1, выполнив следующие команды CLI:

    # 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. Создание базового бота.

  4. Разверните основной бот в группе ресурсов, созданной на шаге 1.

    В рамках этого процесса вы создадите регистрацию приложения, которая понадобится для взаимодействия с ботом через каналы. В ходе этого процесса вы также развернете необходимый план Служба приложений, службу приложений и бот веб-приложения.

    Примечание.

    Выберите план Служба приложений, поддерживающий Приватный канал Azure.

  5. Сопоставите личный домен со службой приложений, развернутой в группе ресурсов на шаге 3.

    На этом шаге требуется доступ к регистратору домена, и требуется добавить запись A в личный домен, указывающий на общедоступный IP-адрес брандмауэра, созданного на шаге 2.

  6. Защитите сопоставленный личный домен, отправив существующий сертификат для домена или приобретя сертификат Служба приложений в Azure и импортируя его. Для этого выполните действия, описанные в разделе "Защита пользовательского DNS-имени с помощью привязки TLS/SSL в службе приложение Azure".

    Теперь у вас должен быть полностью функциональный бот, который можно добавить в канал Teams или протестировать с помощью Веб-чат с помощью инструкций, указанных в документации по пакету SDK Bot Framework.

    Примечание.

    На этом этапе служба приложений бота по-прежнему общедоступна как по URL-адресу, так azurewebsites.net и по пользовательскому URL-адресу, который вы настроили. На следующих шагах вы будете использовать частные конечные точки для отключения общего доступа. Вы также настроите брандмауэр, чтобы служба бота могли взаимодействовать только с клиентами Teams.

  7. Выполните следующий сценарий 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}
    

    После выполнения этих команд в группе ресурсов должны появиться следующие ресурсы:

    Снимок экрана: список ресурсов в группе ресурсов.

    Параметр интеграции виртуальной сети в разделе "Сеть " службы приложений должен выглядеть следующим образом:

    Снимок экрана: параметры wapp-securebot

    Снимок экрана: параметр

    Снимок экрана: панель

  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-адреса в службу приложений бота и ограничить трафик от любой конечной точки, отличной от 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
    

    После выполнения команд правила брандмауэра будут выглядеть примерно так:

    Снимок экрана: панель

    Снимок экрана: панель

  10. Убедитесь, что бот доступен только из канала в Teams, и что весь трафик из службы приложений бота проходит через брандмауэр.

Соавторы

Эта статья поддерживается корпорацией Майкрософт. Первоначально он был написан следующими участниками.

Автор субъекта:

Следующие шаги