Azure Databricks · Networking & Security · Stage 4

Private Link, DNS & Topologies

The stage where the three connectivity paths stop being backbone-private-by-default and become fully private with no public-IP hop — the reference answer to every regulated "no public internet / prove no exfil" network review. Private Link is a building retrofit, not a new building.
Azure-first 4.1 Connection Types 4.2 Private DNS 4.3 Hub-and-Spoke 4.4 Exfiltration Protection Architect altitude

Private Link is a retrofit of the building you already have

Stage 2 gave you a workspace with three doors — ① users in, ② clusters to the control plane, ③ clusters to storage — already on the Microsoft backbone but reachable at a public phone number. This stage installs private extensions (4.1), edits the directory (DNS) so callers land on them (4.2), builds one guarded lobby reused fleet-wide (4.3), and puts a customs officer on the single exit (4.4).

🧠 Mental model — hold this in your head

A building retrofit. Private Link swaps the public hop on each path for a private IP; DNS decides whether anyone lands on it; hub-and-spoke decides where the endpoints physically live; and DEP forces the residual internet egress through one inspected, default-deny chokepoint. Flip Public Network Access = Disabled once all three paths are private.

The four subtopics map onto the three doors

SubtopicWhat it doesPath(s) it hardensSharpest edge
4.1 Connection typesThree private extensions: front-end / back-end / web-auth① & ②Web-auth = 1 per region (delete it → region-wide login outage)
4.2 Private DNSCNAME→A override so the public name resolves to the private IP① & ②#1 cause of "it doesn't work"; forget pl-auth → SSO fails
4.3 Hub-and-spokeBuild private ingress/DNS/egress once in a transit VNet, peer spokes① ② ③Peering ≠ DNS; Standard vs Simplified = blast radius vs cost
4.4 Exfiltration protectionUDR forces egress through one Azure Firewall FQDN allowlistegress sideRouting SCC through the firewall (self-inflicted outage)

Static topology (zoom-crisp, reusable in slides)

Azure Databricks Private Link topology: corporate user to front-end and web-auth
      private endpoints in a transit hub VNet (path 1), classic container subnet outbound to a back-end private endpoint
      and the control plane (path 2), egress forced through an Azure Firewall allowlist (path 3), and ADLS Gen2 over a
      private/service endpoint (path 4); a private DNS zone linked to both VNets.
Transit hub (front-end + web-auth PEs, firewall, DNS) · workspace spoke (back-end PE, clusters, ADLS) · all three paths private, internet egress through one inspected door.

The line a security team wants to hear

"Every Databricks path — user-in, cluster-out, and the SSO callback — sits on a private IP inside your VNet, so we set Public Network Access = Disabled and nothing touches the internet. The control plane and your storage bypass the firewall on private paths, so we pay to inspect a trickle of genuine internet egress, not your data."

Terms used here (full deep-dive lives in the named module)

Private Endpoint (PE)
A NIC with a private IP in your subnet mapped to a service. A PE is a NIC. → 4.1
groupId
The PE target sub-resource. ADB has exactly two: databricks_ui_api and browser_authentication. → 4.1
Private DNS zone
Fixed name privatelink.azuredatabricks.net — resolves the workspace URL to the PE's private IP. → 4.2
Transit VNet (hub)
Central VNet holding the inbound PEs, DNS, and firewall; spokes peer to it. → 4.3
UDR
User-defined route; 0.0.0.0/0 → firewall forces egress through the chokepoint. → Stage 3 / 4.4
SCC relay
Control-plane endpoint clusters dial out to (no inbound door). Back-end PL makes that hop private. → Stage 2.3

4.1 · Private Link connection types

Three private extensions, one per direction. Switch the diagram between front-end, back-end, and web-auth — the highlighted arrow is the active path; click any box for the "what + why."

TipPick a connection type, then click a box to see what it secures and why.

Two facts to anchor on

Only two groupIds exist: databricks_ui_api (used by both front-end and back-end — the VNet you place it in makes it one or the other) and browser_authentication (SSO only). And Private Link does not replace SCC — it removes the last public hop SCC left behind.

The three connection types side by side

Back-end (classic)Front-end (inbound)Web-auth
SecuresCluster → control plane (SCC relay + REST)User/BI/REST → workspaceSSO/OAuth login callback
groupIddatabricks_ui_apidatabricks_ui_apibrowser_authentication
Lives inWorkspace VNetTransit VNetTransit VNet (web-auth ws)
How many1 per workspace VNet1 per transit VNet1 per region / DNS zone
Required NSG RulesNoAzureDatabricksRulesAllRules (hybrid)NoAzureDatabricksRules

Illustrative config — the three endpoints + the two flags

Terraform (azurerm). Full apply-ready module deferred; only DEP (4.4) ships a standalone main.tf.

resource "azurerm_private_endpoint" "backend" {        # BACK-END: in the WORKSPACE VNet
  subnet_id = var.workspace_pe_subnet_id                # dedicated /27
  private_service_connection {
    private_connection_resource_id = var.workspace_id
    subresource_names = ["databricks_ui_api"]           # SAME groupId as front-end; location decides the role
    is_manual_connection = false
  }
  private_dns_zone_group { private_dns_zone_ids = [azurerm_private_dns_zone.adb.id] }
}
# FRONT-END: same groupId, placed in the TRANSIT VNet.
# WEB-AUTH:  subresource_names = ["browser_authentication"] on the LOCKED web-auth workspace (1 per region).
# Flags: back-end/full = public_network_access_enabled=false + NSG "NoAzureDatabricksRules";
#        front-end hybrid = public_network_access_enabled=true + NSG "AllRules".

Portal: workspace → Settings → Networking → Private endpoint connections → + Private endpoint → Target sub-resource → transit (front-end/web-auth) or workspace (back-end) VNet → Integrate with private DNS zone = Yes.

Why it breaks (cause → effect)

Forget web-auth → REST works but browser login spins/fails region-wide (the #1 Private Link outage). Wrong NSG mode → connectivity drops. Delete the web-auth host workspace → every workspace in the region loses browser login.

4.2 · Private DNS for Private Link

Private Link gives you the private IP; DNS is the switch that decides whether anyone lands on it. Switch the diagram between the workspace name and the SSO name to see the CNAME→A override chain; click any box for the "what + why."

TipPick a name above, then click a box to trace how it resolves to a private IP.

The resolution chain

The public zone hands out a CNAME to ….privatelink.azuredatabricks.net; your private zone holds the A record to the private IP. nslookup from inside the VNet proves it: the public name is an alias, the Address is the PE's private IP. The zone name is fixed: privatelink.azuredatabricks.net.

Automatic vs custom DNS

AspectAzure-integrated Private DNSCustom DNS (own server)
Who writes recordsAzure auto-creates on PE creationYou (forwarding or manual A records)
SSO (pl-auth) nameHandled automaticallyMust add explicitly — easy to forget
Shared PE, multi-workspaceAzure maps many names → right IPsSingle-entry risk — clean to do 1 ws / PE
When to useGreenfield Azure-DNSEnterprises with central/on-prem DNS

Illustrative config — zone, two records, VNet link

resource "azurerm_private_dns_zone" "adb" {
  name = "privatelink.azuredatabricks.net"               # FIXED zone name — do not change
  resource_group_name = "dns-rg"
}
resource "azurerm_private_dns_a_record" "workspace" {    # adb-<id>.<n> -> databricks_ui_api PE IP
  name = "adb-1234567890123456.7"                        # host LABEL only (zone supplies the suffix)
  zone_name = azurerm_private_dns_zone.adb.name ; resource_group_name = "dns-rg" ; ttl = 10
  records = [azurerm_private_endpoint.ui_api.private_service_connection[0].private_ip_address]
}
# webauth A record: name = "westus.pl-auth" -> browser_authentication PE IP (required for front-end SSO)
# Link the zone to EVERY VNet that must resolve privately (workspace + transit + spokes).

Custom DNS: conditional-forward *.azuredatabricks.net, *.privatelink.azuredatabricks.net, *.databricksapps.com to 168.63.129.16.

Why it breaks (cause → effect)

PE created but zone not linked → clients resolve the public IP → Control Plane Request Failure. Workspace record present, pl-auth forgotten → login page loads, then the SSO callback fails. Full FQDN in the A-record name → no resolution (use just the host label).

4.3 · Transit / hub-and-spoke

Build the private front door, DNS, and egress firewall once in a transit VNet, then peer every workspace spoke to it. Switch between the Standard and Simplified deployments; click any box for the "what + why."

TipPick a deployment, then click a box to see what lives where and why.

Peering gives a hallway, not a directory

VNet peering gives IP reachability only — not DNS. You still must link the privatelink.azuredatabricks.net zone to both VNets (or conditional-forward), or clusters and users resolve the public IP and Private Link silently does nothing.

Standard vs Simplified — blast radius vs cost/effort

DimensionStandard (separate transit VNet)Simplified (combined PE host)
browser_authentication PEDedicated locked web-auth workspaceOn an existing workspace
Blast radius of deleting the hostLow — web-auth ws does nothing elseHigh — breaks SSO for all regional ws
Infra & costMore (extra VNet + workspace)Fewer resources
Recommended forProduction, multi-ws, regulatedNon-prod, single-ws-per-region, PoC

Illustrative config — peering + PE placement + DNS link

resource "azurerm_virtual_network_peering" "ws_to_hub" {
  virtual_network_name      = azurerm_virtual_network.ws.name      # spoke
  remote_virtual_network_id = azurerm_virtual_network.transit.id   # hub
  allow_forwarded_traffic   = true                                 # let hub firewall forward spoke egress
  resource_group_name = "ws-rg" ; name = "ws-to-hub"
}
# FRONT-END PE in transit VNet, BACK-END PE in workspace VNet — same groupId, location decides the role.
# Link the ONE privatelink.azuredatabricks.net zone to BOTH VNets.

Subnet sizing: transit PE subnet /26–/25 · web-auth ws host+container /28 or /27 · classic back-end PE /27. Stop all compute before NSG/Private Link changes (15+ min).

Why it breaks (cause → effect)

Forget port 6666 on the PE-subnet NSG → front-end works, clusters fail. Route SCC (6666) through the hub firewall → extra hop that breaks back-end connectivity. Put browser_authentication on a deletable workspace (Simplified) in prod → one destroy kills SSO region-wide.

4.4 · Data exfiltration protection (DEP)

Force every internet-bound packet through one inspected, default-deny chokepoint — but keep the control plane and your storage on private paths that bypass it. Switch the diagram between the four flows; click any box for the "what + why."

TipPick a flow above, then click a box to see the control at each hop.

Two paths bypass the firewall by design

With back-end Private Link on, the docs say "the Azure Databricks service tag isn't required" in the UDR — the control plane/SCC drop off the firewall entirely. ADLS data uses a Private/Service Endpoint. So you pay to inspect a trickle of genuine internet egress, not your data or control-plane chatter.

Egress controls for classic compute

ControlRestrictsCostUse when
NSG egress rulesBy IP/port/service tag (coarse)FreeCheap coarse guardrail
Service Endpoint PolicyStorage egress to approved accountsFreeStop data to unapproved ADLS
Azure Firewall + UDR (DEP)All egress, FQDN/port allowlistHourly + per-GBRegulated; exfil-proof pattern
Full Private Link (no internet)Control + data plane fully privatePE per-GBMaximum isolation; pair with DEP

Illustrative config — firewall allowlist + the forcing UDR

A focused, apply-ready main.tf ships alongside the lesson — DEP is the deliverable the network team applies.

resource "azurerm_firewall" "hub" {
  sku_name = "AZFW_VNet" ; sku_tier = "Standard"          # Standard = FQDN application rules
  ip_configuration {
    subnet_id = azurerm_subnet.fw.id                      # MUST be named "AzureFirewallSubnet"
    public_ip_address_id = var.fw_pip                     # stable egress IP for downstream allowlists
    name = "fw-ipconfig"
  }
  name = "adb-hub-fw" ; resource_group_name = "adb-hub-rg" ; location = var.region
  firewall_policy_id = azurerm_firewall_policy.dep.id
}
resource "azurerm_route" "to_firewall" {                  # the forcing function (BOTH subnets)
  address_prefix = "0.0.0.0/0" ; next_hop_type = "VirtualAppliance"
  next_hop_in_ip_address = azurerm_firewall.hub.ip_configuration[0].private_ip_address
  route_table_name = azurerm_route_table.spoke.name ; resource_group_name = "adb-rg" ; name = "to-firewall"
}
# With back-end Private Link on, NO AzureDatabricks service-tag route is needed.
# Allowlist (East US ex.): dbartifactsprodeastus.blob… , ucstprdeastus.dfs… , *.pypi.org , login.microsoftonline.com.
# Network rules: metastore 3306/TCP, Event Hubs 9093/TCP.

Why it breaks (cause → effect) — sequence matters

Attach the 0.0.0.0/0→firewall UDR before allowlisting / Private Link → clusters can't reach the relay/artifacts and won't launch. Route SCC through the firewall → latency, per-GB cost, fragile FQDN rules. Route table on only one subnet → the un-routed subnet's egress escapes the firewall. Assume DEP covers serverless → it doesn't (that's NCC, Stage 5).

Decision guide — what an architect recommends

Full private isolation + DEP

  • Regulated (FSI / healthcare / gov), "no public internet" mandate
  • All 3 Private Link types + publicNetworkAccess=Disabled
  • Azure Firewall + UDR default-deny egress + Service Endpoint Policy
  • Standard hub-and-spoke (dedicated transit VNet + locked web-auth ws)
  • Premium tier; accept per-endpoint + per-GB cost

Targeted / cheaper baselines

  • Data-plane-only compliance → back-end PL alone, users stay public
  • Restrict ingress but Power BI/SaaS can't traverse hub → front-end hybrid + IP ACLs
  • Greenfield Azure-DNS → Azure-integrated Private DNS ("Integrate = Yes")
  • Stop data to wrong storage → Service Endpoint Policy (free)
  • Dev sandbox → NSG egress rules + Service Endpoint Policy (free)

Rule of thumb

Start free, step up only when mandated. SCC + VNet injection + storage firewall + Service Endpoint cost nothing and are backbone-private. Add Private Link / DEP only when a regulator demands no public-IP hop or a provable internet allowlist. Use Standard hub-and-spoke for production and Simplified only for non-prod / single-workspace-per-region.

Customer Q&A — what the security team actually asks

The one-liner
"Private Link puts every Databricks path — user-in, cluster-out, and the SSO callback — on a private IP inside your VNet, so we set Public Network Access to Disabled and answer 'nothing touches the internet.' DNS is the switch that moves traffic onto those private IPs. We build the private front door, DNS, and one inspected egress firewall once in a transit hub and reuse it fleet-wide; the control plane and your storage bypass the firewall, so you pay to inspect a trickle of internet egress, not your data."

Common asks & the answer

Customer asks…Architect answers…
"Does any Databricks traffic ever hit the public internet?"With all 3 PL types + publicNetworkAccess=Disabled, no — only the explicit FQDN allowlist (pypi, artifacts, Entra ID) egresses, via the firewall's single public IP.
"Prove a compromised notebook can't POST our data out."The firewall's implicit deny-all + the FQDN allowlist; we show the rule collection (and disable notebook download/export too).
"Can we keep a few trusted IPs / Power BI on the public URL during rollout?"Yes — front-end hybrid (publicNetworkAccess=Enabled + AllRules) gated by IP access lists.
"Will Private Link replace SCC / VNet injection?"No — it complements them; they're prerequisites for back-end.
"Give us one stable egress IP for partner allowlists."The Azure Firewall's public IP (classic). Serverless IPs are dynamic — pivot to the service tag / NCC.
"Does this cover our serverless SQL warehouses?"No — DEP is classic compute in your VNet; serverless egress is NCC + network policies (Stage 5). Set this expectation early.

What breaks in the field — and the FIRST check

Browser login spins but REST works

Web-auth missing or its DNS wrong.First check: does <region>.pl-auth.azuredatabricks.net resolve to the browser_authentication PE's private IP?

Cluster start fails Control Plane Request Failure

Back-end path not actually private.First check: is the zone linked to the workspace VNet, and does the URL resolve to the private IP from a cluster subnet?

Connectivity drops after enabling back-end

Wrong NSG mode.First check: NoAzureDatabricksRules for back-end, AllRules for hybrid front-end.

Region-wide login outage

Web-auth host workspace/endpoint deleted.First check: does WEB_AUTH_DO_NOT_DELETE_<region> still exist with a Delete lock?

Clusters won't launch after the UDR goes on

UDR attached before allowlist/Private Link.First check: firewall deny logs for the artifact-blob / tunnel.<region> FQDN.

Egress "leaks" past the firewall

Route table on only one subnet.First check: is it associated with BOTH host and container subnets?

Three questions to ask before recommending an architecture

  1. Is there a regulatory mandate for no public-IP hop / a provable internet allowlist, or is backbone-private enough?
  2. Is the customer on Premium with VNet injection + SCC (prerequisites for back-end / DEP)?
  3. Do they run their own DNS (custom DNS + conditional forwarding) — and is it classic or serverless (DEP vs NCC)?