Azure Databricks · Networking & Security · Stage 6

Security, Identity & Access

The guarded front door of the platform — for the FDE/RSA who has to explain who is on the other end of the connection, how they prove it, and from where they may connect to a customer's security team. Everything here hardens path ① (user → control plane); authorization (Unity Catalog) is topic 6.3.
Azure-first 6.1 Identity & Authentication 6.2 Network Access Controls Architect altitude

The front door, and the layers around it

Networking (Stages 1–4) decided which network paths can reach a workspace. This topic decides who is on the other end and from where. Two subtopics: 6.1 Identity (who are you, how proven) and 6.2 Network access controls (from where you connect). Both harden the start of path ① (user/client → control plane) — they do nothing for path ② (compute ↔ control) or path ③ (compute → storage).

🧠 Mental model — hold this in your head

Identity is the front door; network controls are the layers around it. Microsoft Entra ID is the single keymaker that issues badges (SSO); a service principal is a robot's badge; a token is a day-pass. At the door: Conditional Access is the badge reader, IP access lists are the bouncer reading the return address, and front-end Private Link is a private tunnel that bricks over the public door. Define identity once in Entra ID, prove it via SSO or short-lived OAuth, then gate the door by where the request comes from.

The one crossover to remember

A path-① control can break path ②

Under Secure Cluster Connectivity (No Public IP), the classic compute plane's egress IP also knocks on this same front door. If you enable a workspace IP access list and forget that egress IP, classic clusters won't launch — the #1 self-inflicted break in this topic.

Static topology (zoom-crisp, reusable in slides)

Azure Databricks identity and network access: Microsoft Entra ID as
      source of truth syncs into the Databricks account; humans authenticate via browser SSO + MFA and
      robots via service-principal OAuth M2M; the workspace front door is gated by Conditional Access,
      context-based ingress + IP access lists (IPv4, must allow the SCC egress IP); front-end Private Link
      replaces the public door with private endpoints in a transit VNet.
Identity (6.1) proves WHO; the gated front door and the private tunnel (6.2) prove FROM WHERE. PATs / pre-issued tokens bypass Conditional Access.

The line a security team wants to hear

"Microsoft Entra ID is our single source of truth — humans log in with SSO + MFA, every production job runs as a service principal on short-lived OAuth, and long-lived PATs are capped or disabled. The workspace front door is then gated by Conditional Access, IP access lists, and — where a regulator demands it — front-end Private Link that removes the public door entirely. The controls stack; you don't pick one."

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

Automatic identity mgmt
SCIM-free sync of Entra ID users/groups/SPs (incl. nested) — default after 2025-08-01. → 6.1
Service principal
A non-human "robot" identity for jobs/CI-CD; authenticates via OAuth M2M. → 6.1
Conditional Access
Entra ID sign-in policy (MFA / device / location); evaluated before a token is issued. → 6.2
Context-based ingress
Account-level ingress policy (identity + request type + IP); enforced together with workspace IP lists. → 6.2
SCC egress IP
The classic compute plane's stable public egress IP — must be on the workspace allow list. → Stage 2.3
VNet injection
Workspace in your own VNet; required for front-end Private Link. → Stage 2.1

6.1 · Identity & Authentication

Microsoft Entra ID is the single source of truth: identities are defined once in the account and assigned to identity-federated workspaces. Switch the diagram between the provisioning model (how identities get in) and the authentication flow (how humans vs robots prove it), and click any box for the "what + why."

TipClick any component to see what it is and why it's there.

Account-first is the modern model

Define a user/group/SP once in the account, then assign it to identity-federated workspaces. Workspace-local groups (from a legacy non-federated workspace) cannot receive Unity Catalog grants — convert them to account groups.

Provisioning — Automatic identity management vs SCIM

CapabilityAutomatic identity managementSCIM provisioning
Sync users / groups✓ / ✓✓ / ✓ (direct members only)
Sync nested groups✓✗
Sync service principals✓✗
Needs an Entra app / admin role✗✓ (Cloud App Administrator)
On by default✓ (accounts after 2025-08-01)✗
Requires identity federation✓recommended (account-level)

Don't mix the two on the same identity

Provisioning the same principal via both SCIM and automatic identity management creates duplicates and permission conflicts. Pick one source of truth (Databricks recommends automatic identity management; keep SCIM as a documented fallback).

PAT vs OAuth — and token lifetime (the part reviewers probe)

CredentialLifetimeUse it whenAvoid because
PAT (legacy)max 730 days; auto-revoked after 90 days unusedA tool only supports PATsLong-lived secret; bypasses Conditional Access
OAuth M2M (service principal)Short-livedAutomation / CI-CD / jobs — recommended—
OAuth U2MShort-lived, auto-refreshedAttended CLI/SDK as yourself—
Entra ID tokenPer Entra policyAzure resources that only speak Entra IDNot for hand-creating ADB user tokens

Illustrative config — service principal + token policy

Databricks CLI — create a robot identity for prod and cap PAT lifetime. Full IaC is the hands-on artifact.

# Create a Databricks-managed service principal + OAuth M2M secret (account-admin auth).
databricks account service-principals create --json '{"displayName":"prod-job-runner"}'
databricks account service-principal-secrets create <SP_ID>   # store secret in Azure Key Vault

# Cap NEW PATs at 90 days (Databricks advises < 90). "0" reverts to the 730-day default.
databricks workspace-conf set-status --json '{ "maxTokenLifetimeDays": "90" }'
# Disable PATs entirely (warning: Partner Connect needs PATs ON):
databricks workspace-conf set-status --json '{ "enableTokensConfig": "false" }'

Portal: Account console → Security → User provisioning → Automatic identity management = Enabled; Account console → User management → Service principals → Add; Workspace → Settings → Advanced → Personal Access Tokens.

What breaks & the first check

User logs in but has no access → is the workspace federated / is the group an account group? Duplicate users → same principal via SCIM and automatic identity management? Job fails to auth → ran as an off-boarded human, or a PAT that hit its lifetime / the 90-day-unused auto-revoke? (Deactivation does not auto-revoke existing PATs.)

6.2 · Network access controls for users

Three layers gate the workspace front door, weakest to strongest. Switch the diagram between the gated public door (Conditional Access → context ingress + IP list) and the private tunnel (front-end Private Link), and click any box for the "what + why."

TipClick any box to see what it checks and how it's secured.

Evaluation order that matters

Conditional Access is evaluated at sign-in (before a token issues). Databricks then checks ingress on the request: the account-level context-based ingress policy and the workspace IP access list are enforced together — a request must pass both, and a workspace list can only narrow, never widen, what the account policy allows. Front-end Private Link sits beneath all of this — it changes which IP the request even arrives on.

The three controls side by side

ControlWhat it checksStrengthTier / prereqKey limitation
IP access list (account / workspace)Source IPv4SoftPremiumIPv4 only; must allow SCC egress IP; only narrows context ingress
Context-based ingressIdentity + request type + IPMediumPremiumAccount-level; verify GA/region before prod
Entra ID Conditional AccessIdentity, MFA, device, locationMedium-strongPremium + Entra ID PremiumInteractive sign-in only — PATs bypass it
Front-end Private LinkArrives on a private IP in your VNetStrongestPremium + VNet injectionNeeds browser_authentication PE + private DNS

Illustrative config — IP list + front-end Private Endpoint

Workspace IP list (CLI) + the user-facing databricks_ui_api PE (Terraform). Full runbook is the Stage 3 hands-on.

# Enable first — lists are silently ignored until the flag is true. MUST allow the SCC/NAT egress IP.
databricks workspace-conf set-status --json '{ "enableIpAccessLists": "true" }'
databricks ip-access-lists create --json '{
  "label": "office-and-vpn", "list_type": "ALLOW",
  "ip_addresses": ["1.1.1.0/24", "203.0.113.7/32"]   # include the SCC/NAT egress IP!
}'
resource "azurerm_private_endpoint" "ui_api" {
  name                = "adb-fe-ui-api-pe"
  subnet_id           = azurerm_subnet.transit_pe.id        # PE subnet in the TRANSIT VNet
  private_service_connection {
    private_connection_resource_id = azurerm_databricks_workspace.this.id
    subresource_names              = ["databricks_ui_api"]  # exact sub-resource name
    is_manual_connection           = false
  }
  private_dns_zone_group {                                  # resolve URL to the PRIVATE IP
    private_dns_zone_ids = [azurerm_private_dns_zone.adb.id] # privatelink.azuredatabricks.net (fixed name)
  }
}

Portal: Conditional Access → target app 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d (AzureDatabricks), Report-only first; Private Link → add databricks_ui_api + browser_authentication PEs, delete-lock the web-auth workspace, verify nslookup returns the private IP.

What breaks & the first check

Clusters won't launch after enabling IP lists → is the SCC/NAT egress IP on the ALLOW list? Lists "do nothing" → is enableIpAccessLists true? Allowed-but-denied → the account context-based ingress policy denies it (pass both). SSO redirect fails after Private Link → nslookup the regional *.pl-auth.azuredatabricks.net; missing browser_authentication PE or DNS forwarding. CA "isn't blocking" a tool → it's using a PAT (bypasses Conditional Access).

Decision guide — what an architect recommends

Always (any Premium customer)

  • Entra ID SSO as the single source of truth
  • Automatic identity management (no Entra app, syncs nested groups + SPs)
  • Every production job as a service principal on OAuth M2M
  • Conditional Access: MFA + block legacy auth + compliant device for admins
  • Cap PATs < 90 days or disable them where a partner tool doesn't need them

Step up when mandated

  • "Users must be on our network" → IP access lists / context-based ingress
  • "No public internet path" → front-end Private Link, Public Network Access = Disabled
  • Cross-tenant identity → SCIM + Entra B2B (not automatic identity management)
  • Pair front-end with back-end Private Link for end-to-end privatization

Rule of thumb

Identity first, then network location. Make Entra ID the single source of truth and run jobs as service principals before touching any network control. Then layer controls from cheap (Conditional Access) → soft (IP lists) → hard (front-end Private Link), only as the regulatory bar demands. They stack; you don't choose one.

Customer Q&A — what the security team actually asks

The one-liner
"Authentication proves who you are; network access controls prove where you're connecting from. Microsoft Entra ID is our single source of truth, every robot is a service principal on short-lived OAuth, and we gate the front door with Conditional Access, IP access lists, and — for a regulator — front-end Private Link that deletes the public door. The honest caveat: PATs and pre-issued tokens bypass Conditional Access, so we cap or kill them."

Common asks & the answer

Customer asks…Architect answers…
"When someone leaves, does their access really disappear?"Yes if Entra ID is the source of truth (SCIM / automatic identity mgmt) — but existing PATs aren't auto-revoked; revoke them explicitly via the Token report.
"Can we force MFA / block off-network logins?"Yes — Entra ID Conditional Access on the AzureDatabricks app, not a Databricks toggle. Pairs with IP access lists / front-end Private Link.
"We're rolling out MFA tenant-wide — does it cover Databricks?"Yes, via app 2ff814a6-...-cd0e6f879c1d — but warn that PATs and pre-issued tokens bypass it.
"Can you pin access to our corporate egress / VPN ranges?"Yes — workspace + account IP access lists (IPv4), or account-level context-based ingress.
"Does any user traffic ever cross the public internet?"Only front-end Private Link with Public Network Access = Disabled gives a clean "no"; IP lists and Conditional Access still ride the public front door.
"Will turning this on lock our admins or break clusters?"Two real risks: omitting your own IP, and omitting the SCC/NAT egress IP (clusters won't launch).
"Can we use Okta directly instead of Entra ID?"On Azure, federate it into Entra ID; Entra ID stays the IdP Databricks talks to.

What breaks in the field — and the FIRST check

Classic clusters won't launch after IP lists

Under SCC the compute egress IP hits the same front door.First check: is the SCC/NAT egress IP on the ALLOW list?

Admins locked out of the workspace/console

An ALLOW list that omits the current IP.First check: hit the REST API/CLI as account admin, or disable enableIpAccessLists.

IP lists "do nothing"

Lists are ignored until the feature flag is on.First check: databricks workspace-conf get-status enableIpAccessLists.

Allowed by workspace list but still denied

The account context-based ingress policy denies it.First check: the account policy (and dry-run vs enforced) — a request must pass both.

SSO redirect fails after front-end Private Link

Missing web-auth endpoint or DNS forwarding.First check: nslookup the regional *.pl-auth.azuredatabricks.net URL.

Duplicate users / conflicting permissions

Same principal via SCIM and automatic identity mgmt.First check: the provisioning source — pick one.

A nested group's members / an SP are missing

SCIM syncs neither; SPs provision on first use.First check: automatic identity mgmt on, and has the SP run once?

Conditional Access "isn't blocking" a tool

The client uses a PAT/pre-issued token.First check: the auth method, not the CA policy.

Three questions to ask before recommending a posture

  1. Is Entra ID the single source of truth, and are production jobs running as service principals (not humans)?
  2. Is the mandate "users must be on our network" (IP lists suffice) or "no public internet path" (front-end Private Link)?
  3. Are PATs capped/disabled — and does the customer understand they bypass Conditional Access?