Архитектура облачного решения для веб-приложения, размещенного в Azure, с точки зрения сетевой безопасности с использованием Azure App Service, Azure SQL с использованием частных конечных точек, Azure V-nets, Azure FDN и Azure FireWalls.
Приложения и их инфраструктура должны быть защищены многоуровнево, независимо от того, работают ли они на месте или в облаке. Как в крепости, окруженной различными видами мер безопасности. В центре находится уровень данных, где хранятся данные, затем уровень приложений, за которым следуют сеть и периметр. Хотя «облако» упрощает многие вещи для разработчиков и администраторов, безопасность все еще остается чем-то, чему ИТ-команды должны уделять пристальное внимание и ужесточать ее в зависимости от своих потребностей.
В этой статье я расскажу об архитектуре приложений с сетевой защитой. Безопасность уровня приложений и уровня данных не входит в сферу интересов данной статьи.
- Высокоуровневая архитектура решения
- Краткое описание архитектуры
- Ресурсы Azure, используемые здесь
- Создание виртуальной сети
- Создайте базу данных Azure SQL Database с частной конечной точкой.
- Создайте план службы приложений на базе Linux и Azure Web App
- Создайте Azure Front Door с премиум SKU с политиками WAF.
- Создайте брандмауэр Azure, публичный IP, таблицу маршрутизации и правило приложения
- Заключение
- Ссылки
Высокоуровневая архитектура решения
Краткое описание архитектуры
- Веб-приложение доступно из публичного интернета через 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, от нуля до героя