azure-dbx-access-connector-mi-attach

Attach/swap a user-assigned MI on a Databricks Access Connector, giving all workspace clusters access to that MI via IMDS.

derived azure emits CanAttachIdentity

match

A conjunctive graph pattern. Variables (?x) bind node ids; every clause must hold.

{'principal': None} CanPassIdentity {'userMI': None}

where

?principal has EFFECTIVE Microsoft.Databricks/accessConnectors/write on the target Access Connector ?principal has EFFECTIVE Microsoft.ManagedIdentity/userAssignedIdentities/assign/action on ?userMI

emit

source typeIdentity
target typeCompute
source<principal>
target<Databricks Access Connector (GenericCompute — identity broker)>
permissionsMicrosoft.Databricks/accessConnectors/write Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
conditionsrole_compatibility service_state

Narrative

{principal.name} can attach/swap user-assigned MI {userMI.name} on Access Connector {target.name} (accessConnectors/write + assign/action on {userMI.name}), so cluster code will execute as {userMI.name} via IMDS after cluster restart.

Raw rule rules/derived/azure/databricks.yaml

id: azure-dbx-access-connector-mi-attach
emits: CanAttachIdentity
description: Attach/swap a user-assigned MI on a Databricks Access Connector, giving all workspace clusters
  access to that MI via IMDS.
match:
- - principal: null
  - CanPassIdentity
  - userMI: null
where:
- ?principal has EFFECTIVE Microsoft.Databricks/accessConnectors/write on the target Access Connector
- ?principal has EFFECTIVE Microsoft.ManagedIdentity/userAssignedIdentities/assign/action on ?userMI
emit:
  source_type: Identity
  target_type: Compute
  source: <principal>
  target: "<Databricks Access Connector (GenericCompute \u2014 identity broker)>"
  permissions:
  - Microsoft.Databricks/accessConnectors/write
  - Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
  conditions:
  - role_compatibility
  - service_state
  false_positive_note: 'BOTH ARM permissions are required: assign/action on the MI AND accessConnectors/write.
    Neither alone attaches the MI. The new MI becomes accessible to cluster code only after clusters are
    restarted (the Access Connector change propagates, but running clusters hold a cached token until
    expiry or restart). Escalation only if the attached MI out-privileges the caller. Honor the assign/action
    resource scope.'
  derived_from:
  - <CanPassIdentity edge_id>
  narrative: '{principal.name} can attach/swap user-assigned MI {userMI.name} on Access Connector {target.name}
    (accessConnectors/write + assign/action on {userMI.name}), so cluster code will execute as {userMI.name}
    via IMDS after cluster restart.'
move · open · esc close