Архитектура виртуальной сети 3 — Частная конечная точка Key Vault


Резюме

Эта статья является третьей частью цикла об архитектуре виртуальных сетей. Я расскажу о частной конечной точке с Key Vault в api-management-vnet.

  • Архитектура виртуальной сети 1 — Нужна ли мне виртуальная сеть?
  • Архитектура виртуальной сети 2 — конвейеры развертывания
  • Архитектура виртуальной сети 3 — Частная конечная точка Key Vault
  • Архитектура виртуальной сети 4 — Частная конечная точка базы данных SQL
  • Архитектура виртуальной сети 5 — Частная конечная точка службы приложений
  • Архитектура виртуальной сети 6 — Частная конечная точка сервисной шины
  • Архитектура виртуальной сети 7 — Самостоятельно размещаемый агент

TOC

  • Конфигурация частной конечной точки
  • Доступ к хранилищу ключей
  • SSL-сертификат шлюза приложений

Конфигурация частной конечной точки

  • Частная конечная точка: Разверните частную конечную точку и подключите ее к Key Vault и подсети Key Vault в PrivateEndpoint.bicep.
KeyVaultId:existingKv.id
VirtualNetwork2SubnetIdKv:existingVnet2.properties.subnets[3].id

properties: {
  privateLinkServiceConnections: [
    {
      name: pe_name_kv
      properties: {
        privateLinkServiceId: KeyVaultId
        groupIds: [
          'vault'
        ]
      }
    }
  ]
  subnet: {
    id: VirtualNetwork2SubnetIdKv
    properties: {
      privateEndpointNetworkPolicies: 'Enabled'
    }
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Private DNS: Разверните Private DNS с именем DNS privatelink.vaultcore.azure.net в PrivateDns2.bicep.
var pdns_name_kv = 'privatelink.vaultcore.azure.net'

resource PrivateDnsKv 'Microsoft.Network/privateDnsZones@2020-06-01' = {
  name: pdns_name_kv
  location: 'global'
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Ссылка на виртуальную сеть: Свяжите развернутый Private DNS с виртуальной сетью, в которой существует подсеть Key Vault, в файле PrivateDns2.bicep.
VirtualNetwork2Id:existingVnet2.id

resource VnetLinkKv 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = {
  name: '${PrivateDnsKv.name}/${PrivateDnsKv.name}-linkc'
  location: 'global'
  properties: {
    registrationEnabled: false
    virtualNetwork: {
      id: VirtualNetwork2Id
    }
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима
  • Запись A частного DNS: Создайте запись DNS A и задайте IP-адрес развернутой частной конечной точки в файле PrivateDns2.bicep.
output PrivateEndpointKvIpAddress string = PrivateEndpointKv.properties.customDnsConfigs[0].ipAddresses[0]

resource PrivateDnsAKv 'Microsoft.Network/privateDnsZones/A@2020-06-01' = {
  name: '${PrivateDnsKv.name}/${KeyVaultName}'
  properties: {
    ttl: 3600
    aRecords: [
      {
        ipv4Address: PrivateEndpointKvIpAddress
      }
    ]
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Доступ к хранилищу ключей

  • Служба App Service извлекает учетные данные из хранилища ключей с помощью ссылки Key Vault через частную конечную точку. Исходящий доступ из App Service осуществляется через интеграцию v-net. Ссылка на хранилище ключей определяется в файле AppService.bicep.
resource AppServiceConfig 'Microsoft.Web/sites/config@2021-02-01' = {
  properties: {
    'Sql:ConnectionString': '@Microsoft.KeyVault(VaultName=${kv_name};SecretName=${kvsecret_name_sqlcs})'
    'Servicebus:ConnectionString': '@Microsoft.KeyVault(VaultName=${kv_name};SecretName=${kvsecret_name_sbcs})'
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Функции извлекают учетные данные из хранилища ключей так же, как и App Service. Ссылка на хранилище ключей определяется в FunctionApp.bicep.
resource FuncConfig 'Microsoft.Web/sites/config@2021-02-01' = {
  properties: {
    'ServiceBusConnectionString': '@Microsoft.KeyVault(VaultName=${kv_name};SecretName=${kvsecret_name_sbcs})'
    'SqlConnectionString': '@Microsoft.KeyVault(VaultName=${kv_name};SecretName=${kvsecret_name_sqlcs})'
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Экземпляр контейнера, на котором запущен агент self-hosted, извлекает секрет клиентского приложения Azure Active Directory из хранилища ключей, чтобы получить токен Azure Active Directory OAuth2.0 для интеграционного теста в integration-test-bash.yml.
clientSecret=$(az keyvault secret show --vault-name $(KEYVAULT_NAME) --name $(KVSECRET_NAME_AADCLIENT) --query value -o tsv)
Вход в полноэкранный режим Выход из полноэкранного режима
  • Application Gateway реализует завершение TLS для пула бэкенда, что означает управление API, с помощью сертификата, хранящегося в Key Vault. Application Gateway не может получить доступ к Key Vault через Private Endpoint, а только через Service Endpoint.
var agw_kv_secret_id = 'https://${kv_name}${environment().suffixes.keyvaultDns}/secrets/${kvcert_name_agw}'

sslCertificates: [
  {
    name: agw_ssl_certificate_name
    properties: {
      keyVaultSecretId: agw_kv_secret_id
    }
  }
]

httpListeners: [
  {
    properties: {
      sslCertificate: {
        id: resourceId('Microsoft.Network/applicationGateways/sslCertificates', agw_name, agw_ssl_certificate_name)
      }
    }
  }
]
Вход в полноэкранный режим Выход из полноэкранного режима

SSL-сертификат шлюза приложений

Проблема в том, что Application Gateway не может получить доступ к Key Vault через Private Endpoint для извлечения SSL сертификата в вышеуказанной конфигурации, по состоянию на август 2022 года. Это обсуждается на форуме Application Gateway: Интеграция с Key Vault не работает #33157. В общем, Application Gateway должен получить доступ к публичному IP Key Vault через Service Endpoint, а не через частный IP.

  • Service Endpoint: Чтобы включить Service Endpoint для этого случая, необходимо добавить конфигурацию при развертывании подсети виртуальной сети для Key Vault. Вы можете посмотреть VirtualNetwork.bicep и найти конфигурацию ниже. Конфигурация Service Endpoint должна быть реализована в подсети виртуальной сети, где находится служба, которая хочет получить доступ к Key Vault, то есть в подсети Application Gateway.
resource VirtualNetwork1 'Microsoft.Network/virtualNetworks@2021-03-01' = {
  properties: {
    subnets: [
      {
        name: snet_name_1_agw
        properties: {
          addressPrefix: snet_prefix_1_agw
          networkSecurityGroup: {
            id: Nsg1AgwId
          }
          serviceEndpoints: [
            {
              service: 'Microsoft.KeyVault'
              locations: [
                '*'
              ]
            }
          ]
        }
      }
    ]
  }
}
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Доступ к публичной сети должен быть включен, поскольку Application Gateway обращается к Key Vault через публичный IP, но вы можете ограничить доступ только из подсети Application Gateway в KeyVault2.bicep. bypass: 'AzureServices' позволяет всем службам Azure получить доступ к хранилищу ключей через его публичный IP, virtualNetworkRules: [{id: VirtualNetwork1SubnetIdAgw}] разрешает доступ из подсети шлюза приложений, а defaultAction: 'Deny' закрывает все доступы, кроме служб Azure и подсети виртуальной сети шлюза приложений. Весь доступ, кроме SSL-сертификата шлюза приложений, осуществляется через частную конечную точку.
resource KeyVault 'Microsoft.KeyVault/vaults@2021-10-01' = {
  properties: {
    publicNetworkAccess: 'Enabled'
    networkAcls: {
      bypass: 'AzureServices'
      defaultAction: 'Deny'
      virtualNetworkRules: [
        {
          id: VirtualNetwork1SubnetIdAgw
        }
      ]
    }
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

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