가상 네트워크 아키텍처 3 - Key Vault Private Endpoint

9529 단어

요약



이 기사는 가상 네트워크 아키텍처 시리즈의 Part.3입니다. 개인 끝점의 세부 정보를 api-management-vnet에서 Key Vault와 공유하겠습니다.








  • 목차


  • Private Endpoint configuration
  • Access to Key Vault
  • Application Gateway SSL certificate

  • 프라이빗 엔드포인트 구성

  • Private Endpoint: Deploy the private endpoint and connect it to Key Vault and Key Vault's subnet in 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'
        }
      }
    }
    



  • 사설 DNS: PrivateDns2.bicep에 DNS 이름이 privatelink.vaultcore.azure.net인 사설 DNS를 배포합니다.

  • var pdns_name_kv = 'privatelink.vaultcore.azure.net'
    
    resource PrivateDnsKv 'Microsoft.Network/privateDnsZones@2020-06-01' = {
      name: pdns_name_kv
      location: 'global'
    }
    



  • 가상 네트워크 링크: 배포된 개인 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
        }
      }
    }
    



  • 프라이빗 DNS A 레코드: DNS A 레코드를 생성하고 PrivateDns2.bicep에 배포된 프라이빗 엔드포인트의 IP 주소를 설정합니다.

  • 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
          }
        ]
      }
    }
    


    Key Vault에 대한 액세스

  • App Service extracts credentials from the Key Vault with Key Vault reference through the Private Endpoint. The outbound from App Service is through the v-net integration. The Key Vault reference is defined in 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})'
      }
    }
    



  • Functions는 App Service와 동일한 방식으로 Key Vault에서 자격 증명을 추출합니다. Key Vault 참조는 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})'
      }
    }
    



  • 자체 호스팅 에이전트를 실행하는 컨테이너 인스턴스는 Key Vault에서 Azure Active Directory 클라이언트 앱 비밀을 추출하여 integration-test-bash.yml의 통합 테스트를 위한 Azure Active Directory OAuth2.0 토큰을 가져옵니다.

  • clientSecret=$(az keyvault secret show --vault-name $(KEYVAULT_NAME) --name $(KVSECRET_NAME_AADCLIENT) --query value -o tsv)
    



  • Application Gateway는 Key Vault에 저장된 인증서를 사용하여 API Management를 의미하는 백 엔드 풀에 대한 TLS 종료를 구현합니다. Application Gateway는 Private Endpoint를 통해 Key Vault에 액세스할 수 없지만 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)
          }
        }
      }
    ]
    




    Application Gateway SSL 인증서

    The problem is that Application Gateway cannot access Key Vault through Private Endpoint to extract SSL certificate in the configuration above, as of August 2022. This is discussed in the forum Application Gateway: Integration with Key Vault does not work #33157 . 요컨대 Application Gateway는 개인 IP가 아닌 Service Endpoint을 통해 Key Vault의 공용 IP에 액세스해야 합니다.

  • 서비스 엔드포인트: 이 경우에 서비스 엔드포인트를 사용하려면 Key Vault에 대한 가상 네트워크 서브넷을 배포할 때 구성을 추가해야 합니다. VirtualNetwork.bicep을 보고 아래 구성을 찾을 수 있습니다. Service Endpoint 구성은 Application Gateway 서브넷을 의미하는 Key Vault에 액세스하려는 서비스가 있는 가상 네트워크 서브넷에 구현되어야 합니다.

  • 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가 공용 IP를 통해 Key Vault에 도달하기 때문에 공용 네트워크 액세스를 사용하도록 설정해야 하지만 KeyVault2.bicep 의 Application Gateway 서브넷에서만 액세스를 제한할 수 있습니다. bypass: 'AzureServices'는 모든 Azure 서비스가 공용 IP를 통해 Key Vault에 액세스할 수 있도록 하고, virtualNetworkRules: [{id: VirtualNetwork1SubnetIdAgw}]는 Application Gateway 서브넷에서 액세스를 허용하고, defaultAction: 'Deny' Azure 서비스 및 Application Gateway 가상 네트워크 서브넷을 제외한 모든 액세스를 종료합니다. Application Gateway SSL 인증서 이외의 모든 액세스는 Private Endpoint를 통해 이루어집니다.

  • resource KeyVault 'Microsoft.KeyVault/vaults@2021-10-01' = {
      properties: {
        publicNetworkAccess: 'Enabled'
        networkAcls: {
          bypass: 'AzureServices'
          defaultAction: 'Deny'
          virtualNetworkRules: [
            {
              id: VirtualNetwork1SubnetIdAgw
            }
          ]
        }
      }
    }
    

    좋은 웹페이지 즐겨찾기