Membantu mengamankan bot saluran Microsoft Teams dan aplikasi web Anda di belakang firewall

Azure App Service
Azure Web Application Firewall

Contoh skenario ini membantu mengamankan koneksi ke aplikasi web bot saluran Microsoft Teams dengan menggunakan Azure Private Link dan Azure Private Endpoint. Pada saat yang sama, ini memungkinkan saluran di klien Teams untuk berkomunikasi dengan bot melalui IP yang diekspos melalui instans Azure Firewall.

Sistem

Diagram memperlihatkan diagram alur Teams-to-Azure Firewall.

Unduh file Visio arsitektur ini.

Aliran data

  • Azure Virtual Network memungkinkan komunikasi antar sumber daya Azure. Jaringan virtual dalam contoh ini menggunakan ruang alamat 10.0.0.0/16, dan berisi tiga subnet untuk digunakan oleh komponen skenario yang diperlukan:

    • Subnet Azure Firewall (10.0.1.0/26).

    • Subnet Integrasi Virtual Network (10.0.2.0/24), yang digunakan untuk merutekan lalu lintas dari titik akhir privat bot ke firewall.

    • Subnet Endpoint Privat (10.0.3.0/24), yang digunakan untuk merutekan lalu lintas dari firewall ke titik akhir privat bot.

  • Azure Firewall mengekspos satu alamat IP publik yang dapat digunakan klien untuk berkomunikasi dengan layanan bot yang mendasarinya. Biasanya, firewall ditempatkan di jaringan virtualnya sendiri, yang merupakan pola umum untuk arsitektur hub dan spoke , tetapi contoh yang disederhanakan ini menyebarkan semua layanan dan sumber daya ke dalam satu jaringan virtual. Instans Azure Firewall ditempatkan di subnetnya sendiri.

  • Tabel rute menentukan rute yang diambil lalu lintas dalam jaringan virtual. Ini memastikan bahwa lalu lintas yang datang ke dan dari bot melewati firewall.

    • Rute default dengan prefiks alamat 0.0.0.0/0 menginstruksikan Azure untuk merutekan lalu lintas yang tidak berada dalam awalan alamat rute lain ke subnet tempat instans Azure Firewall disebarkan. Dalam contoh ini, ini adalah satu-satunya rute.

    • Subnet Integrasi Jaringan Virtual dan Subnet Titik Akhir Privat dikaitkan dengan tabel rute, memastikan bahwa setiap lalu lintas yang melewatinya dirutekan melalui firewall.

  • Bot Service terdiri dari paket layanan aplikasi bot, layanan aplikasi, dan pendaftaran saluran bot.

    • Layanan aplikasi memiliki domain kustom terdaftar yang menunjuk ke alamat IP firewall. Dengan cara ini, layanan aplikasi hanya dapat diakses melalui firewall.
  • Layanan Azure Private Link untuk akses masuk ke layanan aplikasi bot melalui titik akhir privat Azure.

  • Integrasi jaringan virtual menghubungkan layanan aplikasi ke jaringan virtual, memastikan bahwa lalu lintas keluar dari layanan aplikasi bot melewati firewall.

Komponen

Alternatif

  • Lingkungan App Service dapat menyediakan lingkungan yang sepenuhnya terisolasi dan khusus untuk menjalankan aplikasi App Service dengan aman dalam skala tinggi. Contoh ini tidak menggunakan Lingkungan App Service untuk mengurangi biaya, tetapi arsitektur sampel dapat mendukungnya, dengan modifikasi.

Detail skenario

Bot memungkinkan pengguna Teams untuk berinteraksi dengan layanan web melalui teks, kartu interaktif, dan modul tugas. Microsoft Bot Framework dan Azure Bot Services memberi Anda seperangkat alat yang mudah digunakan untuk membuat dan mengelola bot ini.

Anda dapat mengembangkan bot dengan menggunakan berbagai bahasa, seperti C#, JavaScript, dan Python. Setelah dikembangkan, Anda dapat menyebarkannya ke Azure. Komponen utama bot adalah aplikasi web, yang berisi logika inti dan antarmuka yang berkomunikasi dengan pengguna. Salah satu persyaratan utama agar bot berfungsi adalah harus mengekspos titik akhir HTTPS yang dapat diakses publik.

Kebijakan InfoSec umumnya mengharuskan semua lalu lintas masuk ke aplikasi web melalui firewall perusahaan. Ini berarti bahwa semua lalu lintas yang masuk ke bot, dan respons dari bot, harus merutekan melalui firewall perusahaan, seperti halnya aplikasi web lainnya.

Kemungkinan kasus penggunaan

Organisasi dapat menggunakan bot untuk pengguna seluler dan desktop. Beberapa contohnya termasuk:

  • Kueri sederhana. Bot dapat memberikan kecocokan yang tepat dengan kueri atau sekelompok kecocokan terkait untuk membantu disambiguasi.
  • Interaksi multi-giliran. Dengan membantu mengantisipasi kemungkinan langkah berikutnya, bot membuatnya jauh lebih mudah bagi orang untuk menyelesaikan alur tugas.
  • Menjangkau pengguna. Bot dapat mengirim pesan ketika sesuatu telah berubah dalam dokumen atau item kerja ditutup.

Pertimbangan

Pemantauan

Meskipun pemantauan tidak diterapkan dalam skenario contoh ini, layanan aplikasi bot dapat menggunakan layanan Azure Monitor untuk memantau ketersediaan dan performanya.

Skalabilitas

Bot yang digunakan dalam skenario ini dihosting di Azure App Service. Akibatnya, Anda dapat menggunakan fitur penskalaan otomatis App Service standar untuk secara otomatis menskalakan jumlah instans yang menjalankan bot Anda, yang memungkinkan bot Anda untuk mengikuti permintaan. Untuk informasi selengkapnya tentang penskalaan otomatis, lihat Praktik terbaik penskalaan otomatis.

Untuk topik skalabilitas lainnya, lihat daftar periksa efisiensi Performa Azure Architecture Center.

DevOps

Ini adalah praktik umum untuk menyebarkan aplikasi web, aplikasi API, dan aplikasi seluler ke paket Azure App Service dengan menggunakan alur penyebaran berkelanjutan. Karena layanan aplikasi bot aman dilindungi dengan titik akhir privat, agen build yang dihosting secara eksternal tidak memiliki akses yang diperlukan untuk menyebarkan pembaruan. Untuk mengatasi hal ini, Anda mungkin perlu menggunakan solusi seperti agen DevOps yang dihost sendiri Azure Pipeline.

Keamanan

Azure DDoS Protection, dikombinasikan dengan praktik terbaik desain aplikasi, menyediakan fitur mitigasi DDoS yang ditingkatkan untuk memberikan lebih banyak pertahanan terhadap serangan DDoS. Anda harus mengaktifkan Azure DDOS Protection di jaringan virtual perimeter apa pun.

Menyebarkan skenario ini

Prasyarat

Anda harus memiliki akun Azure yang sudah ada. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

Panduan

  1. Jalankan perintah Azure CLI berikut di Azure Cloud Shell atau shell penyebaran pilihan Anda.

    Kumpulan perintah ini membuat grup sumber daya, jaringan virtual, dan subnet yang diperlukan untuk panduan ini. Rentang IP yang digunakan oleh Teams adalah 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
    

    Saat Anda membuat subnet titik akhir privat, kebijakan titik akhir privat dinonaktifkan secara default.

    Setelah penyebaran selesai, Anda akan melihat subnet berikut dalam jaringan virtual Anda:

    Cuplikan layar panel

  2. Sebarkan instans Azure Firewall ke subnet firewall yang Anda buat di langkah 1 dengan menjalankan perintah CLI berikut:

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

    Konfigurasi firewall Anda akan terlihat seperti ini:

    Cuplikan layar konfigurasi firewall fw-SecureBot.

  3. Membuat bot dasar.

  4. Sebarkan bot dasar ke dalam grup sumber daya yang Anda buat di langkah 1.

    Sebagai bagian dari proses ini, Anda akan melakukan pendaftaran aplikasi, yang anda butuhkan untuk berinteraksi dengan bot melalui saluran. Selama proses ini, Anda juga akan menyebarkan paket App Service, layanan aplikasi, dan bot aplikasi web yang diperlukan.

    Catatan

    Pilih paket App Service yang mendukung Azure Private Link.

  5. Petakan domain kustom ke layanan aplikasi yang Anda sebarkan ke grup sumber daya di langkah 3.

    Langkah ini memerlukan akses ke pencatat domain Anda, dan mengharuskan Anda untuk menambahkan catatan A ke domain kustom yang menunjuk ke IP publik firewall yang Anda buat di langkah 2.

  6. Amankan domain kustom yang dipetakan dengan mengunggah sertifikat yang ada untuk domain atau membeli Sertifikat App Service di Azure dan mengimpornya. Anda dapat melakukan ini dengan mengikuti langkah-langkah dalam Mengamankan nama DNS kustom dengan pengikatan TLS/SSL di Azure App Service.

    Anda sekarang harus memiliki bot yang berfungsi penuh yang dapat Anda tambahkan ke saluran di Teams atau menguji melalui Web Chat dengan menggunakan petunjuk yang ditemukan dalam dokumentasi Bot Framework SDK.

    Catatan

    Pada titik ini layanan aplikasi bot masih dapat diakses secara publik melalui azurewebsites.net URL dan melalui URL kustom yang Anda konfigurasikan. Pada langkah selanjutnya, Anda akan menggunakan titik akhir privat untuk menonaktifkan akses publik. Anda juga akan mengonfigurasi firewall untuk memungkinkan layanan bot berkomunikasi hanya dengan klien Teams.

  7. Jalankan skrip Azure CLI berikut untuk menyebarkan dan mengonfigurasi titik akhir privat. Langkah ini juga menerapkan integrasi jaringan virtual untuk layanan aplikasi bot, yang menghubungkannya ke subnet integrasi jaringan virtual Anda.

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

    Setelah menjalankan perintah ini, Anda akan melihat sumber daya berikut di grup sumber daya Anda:

    Cuplikan layar memperlihatkan daftar sumber daya dalam grup sumber daya.

    Opsi Integrasi VNet di bawah bagian Jaringan layanan aplikasi Anda akan terlihat seperti ini:

    Cuplikan layar opsi

    Cuplikan layar opsi

    Cuplikan layar panel

  8. Selanjutnya, Anda membuat tabel rute untuk memastikan bahwa lalu lintas ke dan dari setiap subnet melewati firewall. Anda akan memerlukan alamat IP privat firewall yang Anda buat di langkah sebelumnya.

    # 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
    

    Setelah Anda menjalankan perintah, sumber daya tabel rute Anda akan terlihat seperti ini:

    Cuplikan layar panel rt-SecureBotRouteTable.

    Setelah membuat tabel rute, Anda menambahkan aturan ke firewall untuk mengirimkan lalu lintas dari IP publik ke layanan aplikasi bot, dan untuk membatasi lalu lintas dari titik akhir apa pun selain Microsoft Teams. Selain itu, Anda akan mengizinkan lalu lintas antara jaringan virtual dan Azure Bot Services atau ID Microsoft Entra dengan menggunakan tag layanan.

  9. Jalankan perintah berikut:

    # 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
    

    Setelah Anda menjalankan perintah, aturan firewall Anda akan terlihat seperti ini:

    Cuplikan layar panel

    Cuplikan layar panel

  10. Konfirmasikan bahwa bot Anda hanya dapat diakses dari saluran di Teams, dan bahwa semua lalu lintas ke dan dari layanan aplikasi bot melewati firewall Anda.

Kontributor

Artikel ini dikelola oleh Microsoft. Ini awalnya ditulis oleh kontributor berikut.

Penulis utama:

Langkah berikutnya