Skip to main content

Azure: Node & Edge Schema

This document describes the graph model built by the Azure connection, which maps cloud identities, groups, service principals, and IAM roles into a the SlashID identity graph.


Node Types

Node TypeDescription
AzureUserA cloud user in Azure Active Directory
AzureGroupA security or distribution group in Azure AD
AzureRoleA role definition assigned through Azure RBAC
AzureServicePrincipalA service identity for apps and automation in Azure
AzureManagedIdentityA managed identity for Azure services
AzureResourceManagerRoleRole used in ARM for access control
CredentialA login credential (e.g., password, token) tied to an identity
ResourceA cloud resource like VM, storage account, etc.
AzureStorageAccountAn Azure Storage account for blob, file, queue, and table storage
AzureBlobContainerA blob container within an Azure Storage account

Edge Relationships

Membership & Role Edges

Edge TypeFrom NodeTo NodeDescription
IS_MEMBER_OFAzureUser, AzureGroupAzureGroupMembership within Azure groups
HAS_MEMBERAzureGroupAzureUser, AzureGroupReverse of IS_MEMBER_OF
HAS_ROLEAzureUser, AzureServicePrincipalAzureRoleIndicates that a role is granted to a principal
IS_ROLE_OFAzureRoleAzureUser, AzureGroupReverse of HAS_ROLE
HAS_CREDENTIALAzureUser, AzureServicePrincipalCredentialA credential belonging to an identity
IS_CREDENTIAL_OFCredentialAzureUser, AzureServicePrincipalReverse of HAS_CREDENTIAL
IS_ASSIGNEDAzureUser, AzureGroupAzureRole, ResourceRole/resource assignment

Ownership & Containment Edges

Edge TypeFrom NodeTo NodeDescription
OWNSAzureUser, AzureServicePrincipalResourceOwnership of a resource
IS_OWNED_BYResourceAzureUser, AzureServicePrincipalReverse of OWNS
CONTAINSAzureGroup, Resource, AzureStorageAccountNested members or resourcesStructural containment
IS_CONTAINED_BYAzureBlobContainerAzureStorageAccountReverse of CONTAINS

Effective Permission Edges

These edges represent the effective permissions after evaluating Azure RBAC policies, including role assignments at management group, subscription, resource group, and resource levels.

Edge TypeFrom NodeTo NodeDescription
ALLOWS_ACCESS_TOAzureUser, AzureServicePrincipal, AzureGroupResourceEffective allowed access based on RBAC evaluation
IS_ALLOWED_ACCESS_BYResourceAzureUser, AzureGroupReverse of ALLOWS_ACCESS_TO
DENIES_ACCESS_TOAzureUser, AzureServicePrincipal, AzureGroupResourceExplicit deny from NotActions in role definitions
IS_DENIED_ACCESS_BYResourceAzureUser, AzureGroupReverse of DENIES_ACCESS_TO
CAN_ACCESSAzureUser, AzureServicePrincipal, AzureGroupResourceDirect access relationship (legacy)
CAN_BE_ACCESSEDResourceAzureUser, AzureGroupReverse of CAN_ACCESS
Effective Permissions

The ALLOWS_ACCESS_TO and DENIES_ACCESS_TO edges are computed by evaluating Azure RBAC policies across the full scope hierarchy:

  1. Management Group → inherited by all child subscriptions
  2. Subscription → inherited by all resource groups
  3. Resource Group → inherited by all resources
  4. Resource → direct assignment

This ensures that permissions granted at higher levels (like a "Reader" role on a management group) are properly reflected in the graph for all child resources.


Examples

// Membership and roles
(AzureUser)-[:IS_MEMBER_OF]->(AzureGroup)
(AzureUser)-[:HAS_ROLE]->(AzureRole)
(AzureServicePrincipal)-[:HAS_CREDENTIAL]->(Credential)
(AzureUser)-[:OWNS]->(Resource)

// Effective permissions (recommended for access analysis)
(AzureManagedIdentity)-[:ALLOWS_ACCESS_TO]->(Resource)
(AzureServicePrincipal)-[:ALLOWS_ACCESS_TO]->(AzureStorageAccount)
(AzureUser)-[:DENIES_ACCESS_TO]->(AzureBlobContainer)

// Storage hierarchy
(AzureStorageAccount)-[:CONTAINS]->(AzureBlobContainer)

Query Examples

Find all identities with access to storage accounts

MATCH (i:Identity)-[:ALLOWS_ACCESS_TO]->(s:Resource)
WHERE s.resource_type = "azure_storage_account"
RETURN i.name, s.name;

Find identities with denied access to resources

MATCH (i:Identity)-[:DENIES_ACCESS_TO]->(r:Resource)
RETURN i.name AS identity, r.name AS resource, r.resource_type;

Analyze effective permissions from management group inheritance

MATCH (i:Identity)-[a:ALLOWS_ACCESS_TO]->(r:Resource)
WHERE a.scope STARTS WITH "/providers/Microsoft.Management/managementGroups"
RETURN i.name, r.name, a.scope AS inherited_from;