Skip to content

Private Endpoints

Private endpoints give Azure PaaS services (SQL, Redis, Key Vault, ACR) a private IP address within the VNet, eliminating all public internet exposure. All Microtec environments use private endpoints for every data plane service.


Overview

Private endpoints are NICs placed in the 10.x.6.0/24 privateEndpoints subnet. DNS resolution routes service FQDNs to private IPs automatically via Azure Private DNS.


SQL Server Private Endpoint

PropertyValue
ResourceAzure SQL VM (mic-backend-shared-sql-rg)
Private IP (dev)10.0.6.4
Private IP (stage)10.1.6.4
Private IP (preprod)10.6.6.4
Private IP (uat)10.5.6.4
Private IP (prod)10.2.6.4
Port1433
Private DNS zoneprivatelink.database.windows.net

Shared SQL VM Uses a Single Public IP

The SQL VM at 20.50.120.95 is accessible from outside via SSH for administrative tasks. However, application services never connect through the public IP — they always route through the VNet private endpoint on port 1433.

DNS A record example (dev):

sql.privatelink.database.windows.net → 10.0.6.4

The connection string in appsettings resolves the private DNS name automatically:

Server=mic-backend-shared-sql.database.windows.net,1433;...

Azure resolves mic-backend-shared-sql.database.windows.net to mic-backend-shared-sql.privatelink.database.windows.net which resolves to the private IP within the VNet.


Redis Private Endpoint

PropertyValue
ResourceAzure Cache for Redis (per environment)
Port10000 (SSL)
Private DNS zoneprivatelink.redis.cache.windows.net
EnvironmentResource NamePrivate IP
devmic-erp-be-dev-redis10.0.6.5
stagemic-erp-be-stage-redis10.1.6.5
preprodmic-erp-be-preprod-redis10.6.6.5
uatmic-erp-be-uat-redis10.5.6.5
productionmic-erp-be-prod-redis10.2.6.5

When a microservice connects to mic-erp-be-stage-redis.uksouth.redis.azure.net:10000, the DNS chain resolves:

mic-erp-be-stage-redis.uksouth.redis.azure.net
  → mic-erp-be-stage-redis.privatelink.redis.cache.windows.net
  → 10.1.6.5 (private IP in stage privateEndpoints subnet)

No traffic leaves the VNet. The Redis public endpoint is disabled on all environments.


Key Vault Private Endpoint

PropertyValue
Port443 (HTTPS)
Private DNS zoneprivatelink.vaultcore.azure.net
EnvironmentKey VaultPrivate IP
devmic-erp-be-dev-skv10.0.6.6
stagemic-erp-stg-kv10.1.6.6
preprodmic-erp-be-preprod-skv10.6.6.6
uatmic-erp-uat-kv10.5.6.6
production(production KV name)10.2.6.6

Key Vault keyvaultref: environment variable injection in Container Apps resolves via the private endpoint — the CAE runtime reads secrets through the VNet without traversing the internet.

Key Vault Firewall

Key Vault is configured with Allow trusted Microsoft services to bypass this firewall: On and a VNet-specific allowlist. The public network access is Disabled on all environments. This means Key Vault is only reachable from within the VNet private endpoint or from Azure DevOps pipeline agents that are VNet-peered.


ACR Private Endpoint

PropertyValue
Port443 (HTTPS)
Private DNS zoneprivatelink.azurecr.io
EnvironmentACRPrivate IP
devmicerpbedevacr10.0.6.7
stagemicerpbestageacr10.1.6.7
preprodmicerpbepreprodacr10.6.6.7
uatmicerpbeuatacr10.5.6.7
productionmicerpbeprdacr10.2.6.7

Container App Environments pull images from ACR through the private endpoint. The ACR admin account is disabled; authentication uses user-assigned managed identities with the AcrPull role.

ACR also has a private endpoint for the data subdomain (used for blob layer pulls):

Private DNS zone: privatelink.azurecr.io
Records:
  micerpbedevacr.azurecr.io           → 10.0.6.7
  micerpbedevacr.uksouth.data.azurecr.io → 10.0.6.8

Private DNS Zone Configuration

Each private DNS zone is linked to the VNet of every environment:

DNS ZoneLinked VNetsPurpose
privatelink.database.windows.netAll env VNetsSQL
privatelink.redis.cache.windows.netAll env VNetsRedis
privatelink.vaultcore.azure.netAll env VNetsKey Vault
privatelink.azurecr.ioAll env VNetsACR

Zones are managed in a dedicated resource group mic-erp-be-shared-dns-rg and linked to each environment VNet:

bicep
resource vnetLink 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = {
  parent: privateDnsZone
  name: '${vnetName}-link'
  location: 'global'
  properties: {
    registrationEnabled: false
    virtualNetwork: {
      id: vnet.id
    }
  }
}

Verifying Private Endpoint Resolution

From within a microservice container (exec into a running Container App):

bash
# Should return a 10.x.6.x address, not a public IP
nslookup mic-erp-be-stage-redis.uksouth.redis.azure.net

# Should return a 10.x.6.x address
nslookup mic-erp-stg-kv.vault.azure.net

# Connectivity test
nc -zv mic-erp-be-stage-redis.uksouth.redis.azure.net 10000

If nslookup returns a public IP instead of a private one, the private DNS zone VNet link is missing or misconfigured.

Internal Documentation — Microtec Platform Team