Обмеження доступу до хмарних ресурсів за допомогою віртуальної мережі в Microsoft Azure

Іноді вимогою до використання різних хмарних ресурсів є необхідність заборонити взаємодію з ними з усіх 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.

Залишити коментар