Skip to content

Microsoft Defender for Endpoint (microsoft-defender) — Vendor Schema

Source: schemas/vendors/microsoft-defender/microsoft-defender-alerts.yaml

Identity

Field Value
vendor microsoft-defender
product Microsoft Defender for Endpoint
data_source msft_graph_security_alerts_raw
category Endpoint

Raw Schema

Fields available in the raw ingest dataset.

Field Type Array Status JSON Subfields
id string declared
title string declared
description string declared
category string declared
severity string declared
status string declared
serviceSource string declared
productName string declared
providerAlertId string declared
alertWebUrl string declared
incidentId string declared
mitreTechniques json ✓ declared
evidence json ✓ declared @odata.type, imageFile, processCommandLine, processCreationDateTime, detectio...
detectorId string inferred_from_correlation

Correlation Rules

SOC Microsoft Graph Defender EndPoint

Field Value
global_rule_id SOC Microsoft Graph Defender EndPoint
subtype passthrough
fromversion 6.10.0

Creates an XSIAM alert for each Microsoft Graph Endpoint Detection Event.

Tags: SOCFramework, Passthrough, Endpoint, MicrosoftDefenderForEndpoint

Schema Constants

Field Value
rule_id 0
alert_category User Defined
alert_domain DOMAIN_SECURITY
action ALERTS
execution_mode SCHEDULED
mapping_strategy CUSTOM
user_defined_category tactic
user_defined_severity severity
is_enabled ✓
drilldown_query_timeframe ALERT
severity User Defined

Suppression

Field Value
enabled ✓
duration 1 hours
fields providerAlertId

providerAlertId is Microsoft Graph's per-alert unique identifier. Suppressing on it scopes dedup to a single alert — different alerts on the same device fire independently. 1-hour window prevents back-to-back ingestion polls from re-creating the same alert.

Alert Fields

Issue-field assignments emitted by the correlation rule. The Description column captures intent — when present, this is what downstream playbooks rely on the field meaning.

Issue Field Source Bucket Description
vendor vendor computed
product product computed
originalalertid originalalertid computed
originalalertname originalalertname computed
originalalertsource originalalertsource computed
externallink externallink computed
alert_description alert_description computed
severity severity computed
mitretacticid mitretacticid computed
mitretacticname mitretacticname computed
mitretechniqueid mitretechniqueid computed
mitretechniquename mitretechniquename computed
agent_hostname agent_hostname computed
agent_id agent_id computed
agent_device_domain agent_device_domain computed
actor_effective_username actor_effective_username computed
actor_process_image_name actor_process_image_name computed
actor_process_image_path actor_process_image_path computed
actor_process_image_sha256 actor_process_image_sha256 computed
actor_process_command_line actor_process_command_line computed
actor_process_os_pid actor_process_os_pid computed
causality_actor_process_image_name causality_actor_process_image_name computed
causality_actor_process_image_path causality_actor_process_image_path computed
causality_actor_process_image_sha256 causality_actor_process_image_sha256 computed
action_file_name action_file_name computed
action_file_path action_file_path computed
action_file_sha256 action_file_sha256 computed
action_local_ip action_local_ip computed
action_remote_ip action_remote_ip computed
usersid evidence_user_userSid computed
actor_process_signature_vendor evidence_process_signer computed
processid evidence_process_pid computed
processcreationtime evidence_process_starttime computed
causality_actor_process_signature_vendor evidence_parent_process_signer computed
parentprocessid evidence_parent_process_pid computed
parentprocessname evidence_parent_process_name computed
parentprocesspath evidence_parent_process_path computed
parentprocesssha256 evidence_parent_process_sha256 computed
deviceexternalips evidence_device_externalip computed
deviceosname evidence_device_os computed
action_remote_ip_v6 evidence_remote_ipv6 computed
user_principal user_principal computed
causality_actor_causality_id causality_synth computed
xdmsourceprocesscausalityid causality_synth computed
samaccountname evidence_loggedon_user computed
userid evidence_user_upn computed
socfwidentityuserdisplayname idr_display_name cie
alertaction evidence_process_action computed
detectionid detectorId raw
alert_name alert_name computed
agentid agent_id computed
hostname agent_hostname computed
domain agent_device_domain computed
username actor_effective_username computed
initiatedby actor_process_image_name computed
initiatorpath actor_process_image_path computed
initiatorsha256 actor_process_image_sha256 computed
initiatorcmd actor_process_command_line computed
initiatorpid actor_process_os_pid computed
cgosha256 causality_actor_process_image_sha256 computed
filename action_file_name computed
filepath action_file_path computed
filesha256 action_file_sha256 computed
localip action_local_ip computed
remoteip action_remote_ip computed

Pre-Alter XQL

// Vendor / product (required for SOCProductCategoryMap routing)
| alter vendor_name = "Microsoft", product_name = productName

// Focus on Defender endpoint / XDR alerts
| filter productName in ("Microsoft Defender for Endpoint", "Microsoft Defender XDR")

// Exclude resolved alerts
| filter status != "resolved"

// Tactic alias — drives user_defined_category
| alter tactic = category

// MITRE helpers
| alter
    cat_norm  = replace(replace(replace(replace(lowercase(category), " ", ""), "-", ""), "_", ""), ".", ""),
    mitre_str = lowercase(coalesce(mitreTechniques, ""))

// XSIAM MITRE Normalization
| alter
    mitre_tactic       = category,
    mitre_tactic_id    = if(
        cat_norm contains "initialaccess",       "TA0001",
        cat_norm contains "execution",           "TA0002",
        cat_norm contains "persistence",         "TA0003",
        cat_norm contains "privilegeescalation", "TA0004",
        cat_norm contains "defenseevasion",      "TA0005",
        cat_norm contains "credentialaccess",    "TA0006",
        cat_norm contains "discovery",           "TA0007",
        cat_norm contains "lateralmovement",     "TA0008",
        cat_norm contains "collection",          "TA0009",
        cat_norm contains "commandandcontrol",   "TA0011",
        cat_norm contains "exfiltration",        "TA0010",
        cat_norm contains "impact",              "TA0040",
        ""),
    mitre_technique       = mitreTechniques,
    mitre_technique_id    = mitreTechniques,
    mitre_technique_first = arrayindex(mitreTechniques -> [], 0),
    mitre_technique_str   = arraystring(mitreTechniques -> [], ", ")

// First element of each evidence type (lightweight extraction)
| alter
    processEvidence = arrayindex(arrayfilter(evidence -> [], "@element" -> ["@odata.type"] contains "processEvidence"), 0),
    fileEvidence    = arrayindex(arrayfilter(evidence -> [], "@element" -> ["@odata.type"] contains "fileEvidence"), 0),
    deviceEvidence  = arrayindex(arrayfilter(evidence -> [], "@element" -> ["@odata.type"] contains "deviceEvidence"), 0),
    userEvidence    = arrayindex(arrayfilter(evidence -> [], "@element" -> ["@odata.type"] contains "userEvidence"), 0),
    ipEvidence      = arrayindex(arrayfilter(evidence -> [], "@element" -> ["@odata.type"] contains "ipEvidence"), 0)

// Process evidence (initiator / target process)
| alter
    evidence_process_name          = processEvidence -> imageFile.fileName,
    evidence_process_path          = processEvidence -> imageFile.filePath,
    evidence_process_command_line  = processEvidence -> processCommandLine,
    evidence_process_signer        = processEvidence -> imageFile.filePublisher,
    evidence_process_sha256        = processEvidence -> imageFile.sha256,
    evidence_process_pid           = processEvidence -> processId,
    evidence_process_starttime     = processEvidence -> processCreationDateTime,
    evidence_process_action        = processEvidence -> detectionStatus,
    evidence_parent_process_signer = processEvidence -> parentProcessImageFile.filePublisher,
    evidence_parent_process_name   = coalesce(processEvidence -> parentProcessImageFile.fileName, null),
    evidence_parent_process_path   = coalesce(processEvidence -> parentProcessImageFile.filePath, null),
    evidence_parent_process_sha256 = coalesce(processEvidence -> parentProcessImageFile.sha256, null),
    evidence_parent_process_pid    = processEvidence -> parentProcessId

// File evidence (target file)
| alter
    evidence_file_name   = fileEvidence -> fileDetails.fileName,
    evidence_file_sha256 = fileEvidence -> fileDetails.sha256

// Device evidence
| alter
    evidence_device_hostname   = deviceEvidence -> hostName,
    evidence_device_ntdomain   = deviceEvidence -> ntDomain,
    evidence_device_os         = deviceEvidence -> osPlatform,
    evidence_device_agentid    = deviceEvidence -> mdeDeviceId,
    evidence_device_externalip = deviceEvidence -> lastExternalIpAddress,
    evidence_local_ipv4        = deviceEvidence -> lastIpAddress,
    evidence_device_dnsdomain  = deviceEvidence -> deviceDnsName

// Mailbox evidence (some XDR email-flavored alerts carry it) -- feeds the
// username coalesce when user evidence is absent, i.e. exactly the alerts
// that should pivot against Proofpoint TAP.
| alter
    mailboxEvidence = arrayindex(arrayfilter(evidence -> [], "@element" -> ["@odata.type"] contains "mailboxEvidence"), 0)
| alter
    evidence_mailbox_address = mailboxEvidence -> primaryAddress

// User evidence
| alter
    evidence_user_upn      = userEvidence -> userAccount.userPrincipalName,
    evidence_user_domain   = userEvidence -> userAccount.domainName,
    evidence_user_userSid  = userEvidence -> userAccount.userSid,
    evidence_loggedon_user = userEvidence -> userAccount.accountName

// IP evidence — discriminate IPv4 vs IPv6 by regex
| alter
    evidence_remote_ipv4 = if(ipEvidence -> ipAddress ~= "(?:\d{1,3}\.){3}\d{1,3}",
                              ipEvidence -> ipAddress, null),
    evidence_remote_ipv6 = if(ipEvidence -> ipAddress ~= "^[0-9a-f:]+$",
                              ipEvidence -> ipAddress, null)

// Unified source_user + SOC Framework grouping keys.
// Username normalization: lowercase full principal, UPN preferred.
// userPrincipalName arrives mixed-case (e.g. "Jane.Doe@example.com") and
// accountName bare (e.g. "jane.doe"); lowercasing avoids a casing
// pivot-killer. user_principal keeps raw-case UPN as the parallel pivot.
// causality_synth: Graph alerts carry no process-causality id, but
// Microsoft already correlated them into incidents -- namespaced
// msgraph-incident-<id> makes alerts of one Defender incident case-group
// in XSIAM, and can never collide with process-causality GUIDs.
| alter
    source_user           = lowercase(coalesce(evidence_user_upn, evidence_mailbox_address, evidence_loggedon_user)),
    user_principal        = evidence_user_upn,
    causality_synth       = if(incidentId != null, concat("msgraph-incident-", to_string(incidentId)), null),
    cid                   = incidentId,
    initiator_sha256      = evidence_process_sha256,
    cgo_sha256            = evidence_parent_process_sha256,
    target_process_sha256 = evidence_process_sha256,
    file_sha256           = evidence_file_sha256,
    remote_ip             = evidence_remote_ipv4

// user_name / display_name are read by the shared identity seed +
// finalization (identity: true). MDE's Graph evidence carries neither as
// a native field, so define them here or the install-time schema check
// rejects the rule (101704). user_name is email-first as a grouping
// pivot; display_name is null (Graph MDE evidence has no display name).
| alter user_name    = source_user
| alter display_name = null

// Final description and alert_name
| alter
    description = coalesce(description,
                           concat("Microsoft Defender for Endpoint alert: ", title)),
    alert_name  = concat(
        "[Endpoint] ",
        coalesce(evidence_device_hostname, "Unknown Host"),
        " | ",
        coalesce(category, "Detection"),
        " | ",
        coalesce(arrayindex(mitreTechniques -> [], 0), arraystring(mitreTechniques -> [], ","), title)
    )

// ============================================================
// CANONICAL CORE NORMALIZATION
// Produces the 29 canonical core columns every vendor pack must
// expose. Column names match issue field names in alert_fields.
// Foundation, Universal Command, and SOC Framework dashboards
// all read from this normalized surface.
//
// Defender ships MITRE per-alert via mitreTechniques + the category
// field. mitre_tactic_id is computed earlier from category via
// an if-chain. mitre_technique_first is the array's first element.
// ============================================================
| alter
        vendor                              = vendor_name,
        product                             = product_name,
        originalalertid                     = providerAlertId,
        originalalertname                   = alert_name,
        originalalertsource                 = productName,
        externallink                        = alertWebUrl,
        alert_description                   = description,
        severity                            = severity,
        mitretacticid                       = mitre_tactic_id,
        mitretacticname                     = mitre_tactic,
        mitretechniqueid                    = mitre_technique_first,
        mitretechniquename                  = mitre_technique_str,
        agent_hostname                      = evidence_device_hostname,
        agent_id                            = evidence_device_agentid,
        agent_device_domain                 = evidence_device_ntdomain,
        actor_effective_username            = source_user,
        actor_process_image_name            = evidence_process_name,
        actor_process_image_path            = evidence_process_path,
        actor_process_image_sha256          = evidence_process_sha256,
        actor_process_command_line          = evidence_process_command_line,
        actor_process_os_pid                = evidence_process_pid,
        causality_actor_process_image_name  = evidence_parent_process_name,
        causality_actor_process_image_path  = evidence_parent_process_path,
        causality_actor_process_image_sha256 = evidence_parent_process_sha256,
        action_file_name                    = evidence_file_name,
        action_file_path                    = null,
        action_file_sha256                  = evidence_file_sha256,
        action_local_ip                     = evidence_local_ipv4,
        action_remote_ip                    = evidence_remote_ipv4