← Back to SOC feed Coverage →

BitLocker Key Retrieval

kql MEDIUM Azure-Sentinel
T1555
AuditLogsSecurityAlert
backdoorhuntingmicrosoftofficial
This rule was pulled from an open-source repository and enriched with AI. Validate in a test environment before deploying to production.
View original rule at Azure-Sentinel →
Retrieved: 2026-04-22T09:00:00Z · Confidence: medium

Hunt Hypothesis

Adversaries may retrieve BitLocker keys to decrypt encrypted data and exfiltrate sensitive information. SOC teams should proactively hunt for this behavior in Azure Sentinel to identify potential data breaches and unauthorized access to encrypted assets.

KQL Query

AuditLogs
  | where OperationName =~ "Read BitLocker key"
  | extend userPrincipalName = tolower(tostring(parse_json(tostring(InitiatedBy.user)).userPrincipalName))
  | extend KeyId = tostring(TargetResources[0].displayName)
  | extend ipAddress = tostring(parse_json(tostring(InitiatedBy.user)).ipAddress)
  | summarize keys_accessed=dcount(KeyId), ipAddresses=make_set(ipAddress) by userPrincipalName
  | join kind=leftouter (SecurityAlert
  | where ProviderName =~ "IPC"
  | extend userPrincipalName = tolower(tostring(parse_json(ExtendedProperties).["User Account"]))
  | summarize user_alert_count=count() by userPrincipalName) on userPrincipalName
  | project userPrincipalName, keys_accessed, ipAddresses, user_alert_count

Analytic Rule Definition

id: 8ea8b2af-f1ce-4464-964c-6763641cc4f6
name: BitLocker Key Retrieval
description: |
    'Looks for users retrieving BitLocker keys. Enriches these logs with a summary of alerts associated with the user accessing the keys.
    Use this query to start looking for anomalous patterns of key retrieval.
    Ref: https://docs.microsoft.com/azure/active-directory/fundamentals/security-operations-devices#bitlocker-key-retrieval'
requiredDataConnectors:
  - connectorId: AzureActiveDirectory
    dataTypes:
      - AuditLogs
tactics:
  - CredentialAccess
relevantTechniques:
  - T1555
query: |
  AuditLogs
    | where OperationName =~ "Read BitLocker key"
    | extend userPrincipalName = tolower(tostring(parse_json(tostring(InitiatedBy.user)).userPrincipalName))
    | extend KeyId = tostring(TargetResources[0].displayName)
    | extend ipAddress = tostring(parse_json(tostring(InitiatedBy.user)).ipAddress)
    | summarize keys_accessed=dcount(KeyId), ipAddresses=make_set(ipAddress) by userPrincipalName
    | join kind=leftouter (SecurityAlert
    | where ProviderName =~ "IPC"
    | extend userPrincipalName = tolower(tostring(parse_json(ExtendedProperties).["User Account"]))
    | summarize user_alert_count=count() by userPrincipalName) on userPrincipalName
    | project userPrincipalName, keys_accessed, ipAddresses, user_alert_count
entityMappings:
  - entityType: Account
    fieldMappings:
      - identifier: FullName
        columnName: userPrincipalName
  - entityType: IP
    fieldMappings:
      - identifier: Address
        columnName: ipAddress

Required Data Sources

Sentinel TableNotes
AuditLogsEnsure this data connector is enabled
SecurityAlertEnsure this data connector is enabled

MITRE ATT&CK Context

References

False Positive Guidance

Original source: https://github.com/Azure/Azure-Sentinel/blob/main/Hunting Queries/AuditLogs/BitLockerKeyRetrieval.yaml