Эталонная архитектура веб-приложения Azure с сетевой безопасностью


Архитектура облачного решения для веб-приложения, размещенного в Azure, с точки зрения сетевой безопасности с использованием Azure App Service, Azure SQL с использованием частных конечных точек, Azure V-nets, Azure FDN и Azure FireWalls.

Приложения и их инфраструктура должны быть защищены многоуровнево, независимо от того, работают ли они на месте или в облаке. Как в крепости, окруженной различными видами мер безопасности. В центре находится уровень данных, где хранятся данные, затем уровень приложений, за которым следуют сеть и периметр. Хотя «облако» упрощает многие вещи для разработчиков и администраторов, безопасность все еще остается чем-то, чему ИТ-команды должны уделять пристальное внимание и ужесточать ее в зависимости от своих потребностей.

В этой статье я расскажу об архитектуре приложений с сетевой защитой. Безопасность уровня приложений и уровня данных не входит в сферу интересов данной статьи.

Высокоуровневая архитектура решения

Краткое описание архитектуры

  • Веб-приложение доступно из публичного интернета через Azure Front Door.
  • Мы можем включить политики WAF на Azure Front Door для защиты приложения от входящих вредоносных запросов и применить фильтры к входящему трафику.
  • Веб-приложение Azure разрешает трафик только из Front Door. Это делается через частную ссылку.
  • В приложении Azure Web включен частный ip, а интеграция Regional Vnet настроена с опцией RouteAll.
  • Azure SQL создан с частным ip, нам нужно явно отключить публичный доступ.
  • Azure Firewall используется для защиты исходящих запросов от веб-приложения. (Красная стрелка указывает на исходящие запросы)

Ресурсы Azure, используемые здесь

  • Веб-приложение Azure
  • Azure SQL
  • Частная служба ссылок Azure
  • Azure Private DNS
  • Azure Vnet
  • Azure Front door с WAF (в качестве альтернативы можно использовать Azure Application Gateway)
  • Azure Firewall (в качестве альтернативы мы могли бы использовать NSGs, но Firewall дает больше контроля)
  • Таблицы маршрутов Azure

Создание виртуальной сети

Создайте виртуальную сеть Azure Virtual Network с тремя подсетями,

  • одна для частной конечной точки веб-приложения,
  • другая для частной конечной точки базы данных
  • и, наконец, интеграционная подсеть (используется для интеграции V-сети).

Эта интеграционная подсеть будет использоваться Azure Web App для региональной интеграции VNet, чтобы трафик между Web App и базой данных оставался на магистрали и использовал частный IP для связи. По умолчанию ресурсы, развернутые в разных подсетях одной сети, могут взаимодействовать друг с другом. Поскольку частные IP используются только для входящего доступа, нам нужна эта интеграция vnet, иначе приложение попытается подключиться к базе данных, используя свой публичный IP. Это явно не то, чего мы хотим.

#create vnet
az network vnet create -g $rg -n $vnet --address-prefix 10.0.0.0/16 --subnet-name  $dbsnet --subnet-prefixes 10.0.2.0/24

# Create a apps subnet
az network vnet subnet create --address-prefix 10.0.1.0/24 --name $fesnet --resource-group $rg --vnet-name $vnet

# integration subnet
az network vnet subnet create --address-prefix 10.0.3.0/24 --name $intgnet --resource-group $rg --vnet-name $vnet

Create the Private DNS Zones for WebApp and Database

#create private dns zone
$webappdns = 'privatelink.azurewebsites.net'
    az network private-dns zone create `
    --resource-group $rg `
    --name $webappdns
#create private dns zone
$dbdns = 'privatelink.database.windows.net'
    az network private-dns zone create `
    --resource-group $rg `
    --name $dbdns
Вход в полноэкранный режим Выход из полноэкранного режима

Создайте базу данных Azure SQL Database с частной конечной точкой.

Хотя частный IP включен для Azure SQL, нам все равно нужно явно заблокировать публичный доступ к базе данных, поскольку по умолчанию она открыта.

#create azure sql server
az sql server create -g $rg -n $sqlserver -u $admin -p $password

#Create DB
az sql db create -g $rg -s $sqlserver -n orgdb -z false -e GeneralPurpose -f Gen5 -c 2

Create Private Link Service Connection between Private Endpoint and Database.

$sqlid = $(az sql server list -g $rg --query '[].[id]' --output tsv)

$epName = 'sqlpvtep'
az network private-endpoint create `
    --name $epName `
    --resource-group $rg `
    --vnet-name $vnet --subnet $dbsnet `
    --private-connection-resource-id $sqlid `
    --group-id sqlServer `
    --connection-name 'sqlpvtconn'

az network private-dns link vnet create `
    --resource-group $rg `
    --zone-name $dbdns `
    --name 'pa1pocdbdnsvnetlink' `
    --virtual-network $vnet `
    --registration-enabled true

az network private-endpoint dns-zone-group create `
   --resource-group $rg `
   --endpoint-name $epName `
   --name 'pa1pocdbzonegrp' `
   --private-dns-zone $dbdns `
   --zone-name $dbdns
Вход в полноэкранный режим Выход из полноэкранного режима

Создайте план службы приложений на базе Linux и Azure Web App

Включите частные конечные точки и разверните данный образ

az appservice plan create -n 'pa1-poc-asp' -g $rg --is-linux --location 'Australia East' --sku P1V2 --number-of-workers 1
az webapp create --name 'pa1-poc-web' --plan 'pa1-poc-asp' -g $rg --runtime 'DOTNETCORE:6.0' --vnet $vnet --subnet $intgnet

$dockerImage = 'chintupawan/pjtalkstech:nwsecweb'
az webapp config container set --docker-custom-image-name $dockerImage --name 'pa1-poc-web' --resource-group $rg

az webapp config connection-string set --connection-string-type SQLAzure -g $rg -n 'pa1-poc-web' --settings Default='$connstr'

Create Private Link Service Connection between Private Endpoint and WebApp.

az network vnet subnet update `
--name $fesnet `
--resource-group $rg `
--vnet-name $vnet `
--disable-private-endpoint-network-policies true

$webappid = $(az webapp list -g $rg --query '[].[id]' --output tsv)

$wepName = 'webpvtep'
az network private-endpoint create `
    --name $wepName `
    --resource-group $rg `
    --vnet-name $vnet --subnet $fesnet `
    --private-connection-resource-id $webappid `
    --group-id sites `
    --connection-name 'webpvtconn'

az network private-dns link vnet create `
    --resource-group $rg `
    --zone-name $webappdns `
    --name 'pa1pocwebdnsvnetlink' `
    --virtual-network $vnet `
    --registration-enabled true

az network private-endpoint dns-zone-group create `
   --resource-group $rg `
   --endpoint-name $wepName `
   --name 'pa1pocwebzonegrp' `
   --private-dns-zone $webappdns `
   --zone-name $webappdns
Войдите в полноэкранный режим Выход из полноэкранного режима

Создайте Azure Front Door с премиум SKU с политиками WAF.

Премиум позволяет нам использовать службу Private Link Service.

Создайте службу частной связи между Azure Front Door и Azure Web App, чтобы WebApp был доступен только из Azure Front Door.

Нам нужно настроить происхождение и маршрут Azure Front Door.

 az afd profile create `
   --profile-name pa1pocfd `
   --resource-group $rg `
   --sku Premium_AzureFrontDoor

   az afd endpoint create `
    --resource-group $rg `
    --endpoint-name pa1pocfdep `
    --profile-name pa1pocfd `
    --enabled-state Enabled

    az afd origin-group create `
    --resource-group $rg `
    --origin-group-name og `
    --profile-name pa1pocfd `
    --probe-request-type GET `
    --probe-protocol Http `
    --probe-interval-in-seconds 60 `
    --probe-path '/'`
    --sample-size 4 `
    --successful-samples-required 1 `
    --additional-latency-in-milliseconds 50 
   #https://docs.microsoft.com/en-us/azure/app-service/network-secure-outbound-traffic-azure-firewall
   #https://docs.microsoft.com/lb-LU/azure/frontdoor/standard-premium/how-to-enable-private-link-web-app

    az afd origin create `
    --resource-group $rg `
    --host-name pa1-poc-web.azurewebsites.net `
    --profile-name pa1pocfd `
    --origin-group-name og `
    --origin-name pa1pocweb `
    --origin-host-header pa1-poc-web.azurewebsites.net `
    --priority 1 `
    --weight 1000 `
    --enabled-state Enabled `
    --http-port 80 `
    --https-port 443 `
    --enable-private-link True `
    --private-link-location AustraliaEast `
    --private-link-request-message 'From AFD' `
    --private-link-resource $webappid `
    --private-link-sub-resource sites
   # az network private-link-resource list -g $rg -n 'pa1-poc-web' --type Microsoft.Web/sites

    az afd route create `
    --resource-group $rg `
    --profile-name pa1pocfd `
    --endpoint-name pa1pocfdep `
    --forwarding-protocol MatchRequest `
    --route-name route `
    --https-redirect Enabled `
    --origin-group og `
    --supported-protocols Http Https `
    --link-to-default-domain Enabled 
Вход в полноэкранный режим Выход из полноэкранного режима

В приведенном выше сценарии мы создали Front door, origin, маршрут и частную ссылку на веб-приложение. Нам нужно утвердить запрос на подключение к частной ссылке, который мы создали в последней части сценария.

Перейдите в WebApp>Networking> Private endpoints (Частные конечные точки).

Выберите ожидающую строку и нажмите Approve.

Наконец, перейдите к ресурсу Azure Front Door Resource в боковой навигационной панели Overview вы найдете End Point hosted. Это url вашего веб-приложения.

Создайте брандмауэр Azure, публичный IP, таблицу маршрутизации и правило приложения

#create Firewall
$fwName = "pa1-poc-fw"
    az network firewall create `
    --name $fwName `
    --resource-group $rg `
    --location $loc
# create Public IP
$pip = "pa1-poc-pip"
az network public-ip create `
    --name $pip `
    --resource-group $rg `
    --location $loc `
    --allocation-method static `
    --sku standard

az network firewall ip-config create `
    --firewall-name $fwName `
    --name FW-config `
    --public-ip-address $pip `
    --resource-group $rg `
    --vnet-name $vnet

az network firewall update `
    --name $fwName `
    --resource-group $rg

az network public-ip show `
    --name $pip `
    --resource-group $rg
$fwprivaddr="$(az network firewall ip-config list -g $rg -f $fwName --query "[?name=='FW-config'].privateIpAddress" --output tsv)"

#create route table
$rt = "pocrt-table"
az network route-table create `
    --name $rt `
    --resource-group $rg `
    --location $loc `
    --disable-bgp-route-propagation true

az network route-table route create `
  --resource-group $rg `
  --name pocroute `
  --route-table-name $rt `
  --address-prefix 0.0.0.0/0 `
  --next-hop-type VirtualAppliance `
  --next-hop-ip-address $fwprivaddr

#associate route table to ovnet
  az network vnet subnet update `
  -n $intgnet `
  -g $rg `
  --vnet-name $vnet `
  --address-prefixes 10.0.3.0/24 `
  --route-table $rt

  #create application firewall
  az network firewall application-rule create `
  --collection-name poccoll `
  --firewall-name $fwName `
  --name AllowAPI `
  --protocols Http=80 Https=443 `
  --resource-group $rg `
  --target-fqdns api.my-ip.io `
  --source-addresses 10.0.3.0/24 `
  --priority 200 `
  --action Allow
Войдите в полноэкранный режим Выйдите из полноэкранного режима

ПРИМЕЧАНИЕ: Здесь я использую классические правила Azure вместо политики брандмауэра, для производственного сценария используйте политики.

Заключение

Это эталонная архитектура, пожалуйста, воспринимайте ее с долей соли. Убедитесь, что вы следуете Azure Well Architected Framework и Azure Design Principles перед реализацией вашего решения.

Ссылки

  • Брандмауэр Azure
  • Безопасный исходящий доступ из веб-приложения
  • Усиленная сеть WebApp
  • Служба приложений Azure, от нуля до героя

Оцените статью
devanswers.ru
Добавить комментарий