Іноді вимогою до використання різних хмарних ресурсів є необхідність заборонити взаємодію з ними з усіх IP-адрес, окрім IP-адрес ваших застосунків або обраних IP-адрес. Зазвичай це стосується доступу до ресурсів, які зберігають дані, наприклад Azure Storage Account, Azure Key Vault, Azure SQL Server.
Для реалізації такої вимоги щодо обмеження доступу до майже всіх ресурсів існує можливість налаштування обмеження доступу за IP-адресою, але, на жаль, довжина списку правил обмежена. Однак, якщо всі ваші застосунки розгорнуті або будуть розгорнуті в Microsoft Azure, і список необхідних правил перевищує ліміт, то ви можете використати інший підхід – підхід з використанням віртуальних мереж (Virtual network).
Підхід з використанням віртуальних мереж полягає в додаванні всіх ресурсів до віртуальної мережі та дозволяє доступ до ресурсів з вказаної віртуальної мережі та окремих зовнішніх IP-адрес, або взагалі заборонити доступ із зовні. Давайте розглянемо приклад реалізації наступної задачі: у нас є App Service, Azure Key Vault та Storage Account. Доступ до Azure Key Vault та Storage Account має мати тільки App Service. Для реалізації цієї задачі ми будемо використовувати Virtual network. Тобто наша кінцева схема буде такою, як на малюнку нижче.
Ми будемо розгортати цю схему за допомогою BICEP.
Для початку, давайте підготуємо базовий шаблон, який створюватиме App Service Plan, App Service, Key Vault та Storage Account.
param location string = resourceGroup().location
param appServiceName string = 'app-${uniqueString(resourceGroup().id)}'
param appServicePlanName string = 'AppServicePlan-${appServiceName}'
param keyVaultName string = 'test-kv-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'teststg${uniqueString(resourceGroup().id)}'
resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
name: appServicePlanName
location: location
sku: {
name: 's1'
tier: 'Standard'
}
}
resource appService 'Microsoft.Web/sites@2022-03-01' = {
name: appServiceName
location: location
properties: {
serverFarmId: appServicePlan.id
}
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: storageAccountName
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
resource keyVault 'Microsoft.KeyVault/vaults@2022-11-01' = {
name: keyVaultName
location: location
properties: {
sku: {
name: 'standard'
family: 'A'
}
tenantId: subscription().tenantId
enableRbacAuthorization: true
}
}
Тепер давайте оновимо цей шаблон створенням віртуальної мережі та під мережі (subnet), додавши наступне:
resource vnet 'Microsoft.Network/virtualNetworks@2022-09-01' = {
name: vnetName
location: location
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/16'
]
}
}
}
resource defaultSubnet 'Microsoft.Network/virtualNetworks/subnets@2022-09-01' = {
parent: vnet
name: 'default'
properties: {
addressPrefix: '10.0.0.0/24'
serviceEndpoints: [
{
service: 'Microsoft.KeyVault'
locations: [
location
]
}
{
service: 'Microsoft.Storage'
locations: [
location
]
}
{
service: 'Microsoft.Web'
locations: [
location
]
}
]
delegations: [
{
name: 'delegation'
properties: {
serviceName: 'Microsoft.Web/serverfarms'
}
type: 'Microsoft.Network/virtualNetworks/subnets/delegations'
}
]
}
}
Хочу звернути увагу, що ця підмережа одразу надає кінцевий доступ до таких сервісів, як Key Vault, Storage Account та App Service, а також дозволяє інтегрувати App Service з підмережею.
Останнім кроком буде безпосереднє додавання наших ресурсів до віртуальної мережі. Для цього до опису налаштувань Key Vault додамо.
networkAcls: {
bypass: 'AzureServices'
virtualNetworkRules: [
{
id: defaultSubnet.id
}]
ipRules: [ { value: '8.8.8.8/32' } ]
defaultAction: 'Deny'
}
“`
Цей блок дозволить доступ тільки з віртуальної мережі. Значення для параметру ipRules додано як приклад.
Майже такий саме блок необхідно додати для Storage Account (зверніть увагу на значення ipRules)
properties: {
networkAcls: {
bypass: 'AzureServices'
virtualNetworkRules: [
{
id: defaultSubnet.id
}
]
ipRules: [ { value: '8.8.8.8' } ]
defaultAction: 'Deny'
}
}
А для того щоб наш App service мав доступ до Virtual Network, треба додати тільки одну строку до описи його властивостей
virtualNetworkSubnetId: defaultSubnet.id
Тепер можна запускати процес розгортання. Для цього виконуємо наступну команду:
az deployment group create
--name <deployment name> \
--template-file <bicep file name> \
--resource-group <resource group name> \
--subscription <subscription id>
Кінцеву версію файла знайходиться за посиланням
Хочу звернути вашу увагу, на те що, при повторному запуску цього шаблону виникне помилка, тому що Azure Resource Manager буде намагатись видалити Virtual Network.
Залишити коментар