1. The Problem: Public PaaS Endpoints
- Azure Storage, SQL, Key Vault, etc. are reachable over the internet by default (e.g.,
mystorageacct.blob.core.windows.net→ public IP). - Even with firewall rules, traffic traverses the Microsoft backbone but leaves the VNet boundary — violating zero-trust network segmentation.
- Compliance frameworks (PCI-DSS, HIPAA) often require data-plane traffic to stay on private networks end-to-end.
2. Service Endpoints vs Private Endpoints
3. Private Endpoint Architecture
- Private Endpoint — A network interface placed in your subnet with a private IP, mapped to a specific sub-resource (e.g.,
blob,sqlServer,vault). - Private Link — The underlying platform that maps the PE NIC to the PaaS resource's data plane via Microsoft's backbone.
- Traffic never leaves Microsoft's network; no public IP exposure for the PaaS resource.
- PE supports sub-resource targeting: one PE per sub-resource (e.g., separate PEs for blob vs table on same storage account).
4. DNS Integration — The Critical Piece
- Private DNS Zones — Azure-managed DNS zones (e.g.,
privatelink.blob.core.windows.net) hosting A records for PE IPs. - VNet Links — Link Private DNS Zone to each VNet needing resolution. Auto-registration optional.
- Azure DNS Private Resolver — Enables on-prem → Azure DNS queries (inbound endpoint) and Azure → on-prem (outbound endpoint + ruleset).
- Conditional Forwarding — On-prem DNS forwards
*.privatelink.*.core.windows.netto Private Resolver inbound IP. - Pitfall: Without correct DNS, clients resolve the public IP and bypass the PE — traffic blocked if public access is disabled.
5. Common Services with Private Endpoints
| Service | Sub-resource | DNS Zone |
|---|---|---|
| Storage (Blob) | blob | privatelink.blob.core.windows.net |
| Azure SQL | sqlServer | privatelink.database.windows.net |
| Cosmos DB | Sql / MongoDB | privatelink.documents.azure.com |
| Key Vault | vault | privatelink.vaultcore.azure.net |
| ACR | registry | privatelink.azurecr.io |
| AKS API | management | privatelink.{region}.azmk8s.io |
6. Private Link Service — Expose YOUR Service
- Private Link Service (PLS) — Place behind a Standard Load Balancer to expose your service to consumers in other VNets/tenants.
- Consumer creates a Private Endpoint that targets your PLS — gets a private IP in their VNet mapped to your LB frontend.
- Approval workflow — You control who can connect (auto-approve by subscription or manual approval).
- NAT — Consumer's source IP is NAT'd; you see traffic from the PLS NAT IP range, not the consumer's original IP.
- Use case: ISV SaaS platforms exposing APIs privately to enterprise customers without peering.
7. Disable Public Access
- Creating a PE alone does NOT block public access — you must explicitly disable it.
- Storage: Set
publicNetworkAccess: Disabledor use "Allow access from selected VNets" with no entries. - SQL: Set "Deny public network access" = Yes.
- Key Vault: Disable public access under Networking → Firewalls.
- Validate: From an external network, confirm connections are refused; from PE-enabled VNet, confirm connectivity.
🌍 Real-World Scenario
Zero-Trust Data Platform
A financial services firm builds an analytics platform: Azure SQL, Storage (Data Lake), Key Vault, and Azure Data Factory — all with public access disabled. Private Endpoints for each service are deployed into a dedicated "data-services" subnet in a spoke VNet. Private DNS Zones are centralized in the hub VNet with VNet links to all spokes. On-premises ETL servers reach PaaS services via ExpressRoute → hub DNS Private Resolver → PE resolution. NSGs on the PE subnet restrict traffic to only the Data Factory managed VNet and the analytics App Service subnet. Result: all data-plane traffic is private, auditable, and passes through network-layer controls — satisfying PCI-DSS and internal zero-trust mandates.
📝 Exam Tip
When a question involves on-premises access to PaaS over VPN/ExpressRoute, the answer is Private Endpoint (not Service Endpoint — those don't work from on-prem). Remember: DNS is the #1 failure point — if the question mentions "client still connects to public IP despite PE," the fix is Private DNS Zone + VNet link or conditional forwarding. Also: Private Endpoint works cross-region; Service Endpoint is same-region only.
🧪 Knowledge Check
Q1: An on-premises application needs to access Azure SQL via ExpressRoute without any public internet exposure. What should you use?
Q2: After creating a Private Endpoint for a Storage account, users in the VNet still connect via the public IP. What is the most likely cause?
Q3: Which statement about Private Link Service is correct?
Q4: What is a key limitation of Service Endpoints compared to Private Endpoints?