Entra ID (microsoft-entra-id) — Vendor Schema¶
Source:
schemas/vendors/microsoft-entra-id/microsoft-entra-id-signins.yaml
Identity¶
| Field | Value |
|---|---|
| vendor | microsoft-entra-id |
| product | Entra ID |
| data_source | msft_azure_ad_raw |
| category | Identity |
Raw Schema¶
Fields available in the raw ingest dataset.
| Field | Type | Array | Status | JSON Subfields |
|---|---|---|---|---|
id |
string |
declared | ||
correlationid |
string |
declared | ||
createddatetime |
string |
declared | ||
userprincipalname |
string |
declared | ||
userdisplayname |
string |
declared | ||
userid |
string |
declared | ||
usertype |
string |
declared | ||
appdisplayname |
string |
declared | ||
appid |
string |
declared | ||
resourcedisplayname |
string |
declared | ||
ipaddress |
string |
declared | ||
autonomoussystemnumber |
int |
declared | ||
clientappused |
string |
declared | ||
isinteractive |
boolean |
declared | ||
conditionalaccessstatus |
string |
declared | ||
risklevelduringsignin |
string |
declared | ||
risklevelaggregated |
string |
declared | ||
riskstate |
string |
declared | ||
riskdetail |
string |
declared | ||
riskeventtypes_v2 |
json |
✓ | declared | |
status |
json |
declared | ||
location |
json |
declared | ||
devicedetail |
json |
declared |
Correlation Rules¶
SOC Identity - Entra ID Suspicious Sign-In¶
| Field | Value |
|---|---|
| global_rule_id | SOC Identity - Entra ID Suspicious Sign-In |
| subtype | passthrough |
| fromversion | 6.10.0 |
Creates an XSIAM alert for Entra ID sign-in events with risk indicators: failed authentication, elevated risk level during sign-in, or an active risk state. Canonicalizes the user principal email-first as the identity grouping pivot and maps the source IP, application, resource, risk and conditional-access context. XSIAM native behavioral identity analytics also fire on this data after baseline learning; this rule fires on field values immediately.
Tags: SOCFramework, Detection, Identity, EntraID, T1078
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 | alert_category |
| user_defined_severity | alert_severity |
| is_enabled | ✓ |
| drilldown_query_timeframe | ALERT |
| severity | User Defined |
Suppression¶
| Field | Value |
|---|---|
| enabled | ✓ |
| duration | 1 hours |
| fields | correlationid |
Preserved from the shipped rule.
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 |
|---|---|---|---|
agent_device_domain |
domain_part |
computed |
|
action_remote_ip |
action_remote_ip |
computed |
|
vendor |
vendor_name |
computed |
|
product |
product_name |
computed |
|
user_principal |
userprincipalname |
raw |
|
userid |
userprincipalname |
raw |
|
usersid |
userid |
raw |
|
socfwidentityaction |
sign_in_action |
computed |
|
socfwidentityapp |
appdisplayname |
raw |
|
socfwidentityresource |
resourcedisplayname |
raw |
|
socfwidentityrisk |
risklevelduringsignin |
raw |
|
socfwidentityriskstate |
riskstate |
raw |
|
socfwidentitylocation |
location_str |
computed |
|
socfwidentitycondaccess |
conditionalaccessstatus |
raw |
|
socfwidentityerrorcode |
error_code_str |
computed |
|
socfwidentityfailurereason |
failure_reason |
computed |
|
mitretacticid |
mitre_tactic_id |
computed |
|
mitretacticname |
mitre_tactic |
computed |
|
mitretechniqueid |
mitre_ids_str |
computed |
|
mitretechniquename |
mitre_ids_str |
computed |
|
actor_effective_username |
actor_effective_username |
computed |
|
originalalertid |
originalalertid |
computed |
|
originalalertname |
originalalertname |
computed |
|
originalalertsource |
originalalertsource |
computed |
|
externallink |
externallink |
computed |
|
alert_description |
alert_description |
computed |
|
severity |
severity |
computed |
|
agent_hostname |
agent_hostname |
computed |
|
agent_id |
agent_id |
computed |
|
action_local_ip |
action_local_ip |
computed |
|
username |
actor_effective_username |
computed |
|
remoteip |
action_remote_ip |
computed |
|
domain |
agent_device_domain |
computed |
|
socfwidentityuserdisplayname |
idr_display_name |
cie |
|
entra_sign_in_id |
entra_sign_in_id |
computed |
|
entra_risk_detail |
entra_risk_detail |
computed |
|
entra_risk_events |
entra_risk_events |
computed |
|
entra_client_app |
entra_client_app |
computed |
|
entra_is_interactive |
entra_is_interactive |
computed |
|
entra_user_type |
entra_user_type |
computed |
|
entra_asn |
entra_asn |
computed |
|
tags |
alert_tags |
computed |
|
alert_name |
alert_name |
computed |
Pre-Alter XQL¶
// Vendor / product (required for SOCProductCategoryMap routing)
| alter vendor_name = "Microsoft", product_name = "Entra ID"
// Extract nested status fields (status is a JSON string)
| alter
error_code = json_extract_scalar(status, "$.errorCode"),
failure_reason = json_extract_scalar(status, "$.failureReason")
// Gate: only fire on events with risk indicators
// 1. Failed auth (errorCode != 0)
// 2. Risk level elevated during sign-in
// 3. Risk state indicates active risk
| filter (
error_code != "0"
or risklevelduringsignin not in ("none", "")
or riskstate not in ("none", "")
)
// Exclude baseline normal events (no risk, successful)
| filter not (error_code = "0" and risklevelduringsignin = "none" and riskstate = "none")
// Alert severity based on risk level
| alter
alert_severity = if(
risklevelduringsignin = "high", "SEV_050_CRITICAL",
risklevelduringsignin = "medium", "SEV_040_HIGH",
error_code != "0", "SEV_030_MEDIUM",
"SEV_020_LOW"
),
alert_category = "Identity Security",
sign_in_action = if(
error_code != "0", "failed_sign_in",
risklevelduringsignin = "high", "risky_sign_in",
risklevelduringsignin = "medium", "risky_sign_in",
"suspicious_sign_in"
),
alert_name = concat(
"[Identity] ",
coalesce(userprincipalname, userdisplayname, "Unknown"),
if(error_code != "0",
concat(" - Failed Auth (", error_code, ") to ", coalesce(appdisplayname, "Unknown App")),
concat(" - Risky Sign-In (", coalesce(risklevelduringsignin, "unknown"), ") to ", coalesce(appdisplayname, "Unknown App"))
)
),
alert_description = concat(
if(error_code != "0", "Failed authentication", "Risky sign-in detected"),
" | User: ", coalesce(userprincipalname, "Unknown"),
" | App: ", coalesce(appdisplayname, "Unknown"),
" | IP: ", coalesce(ipaddress, "Unknown"),
" | Risk: ", coalesce(risklevelduringsignin, "none"),
" | Location: ", coalesce(json_extract_scalar(location, "$.countryOrRegion"), "Unknown")
)
// Location as flat string for alert_fields
| alter location_str = concat(
coalesce(json_extract_scalar(location, "$.city"), ""),
", ",
coalesce(json_extract_scalar(location, "$.state"), ""),
", ",
coalesce(json_extract_scalar(location, "$.countryOrRegion"), "")
)
// Domain extraction from UPN
| alter domain_part = arrayindex(split(userprincipalname, "@"), 1)
// Error code as string for alert_fields
| alter error_code_str = to_string(error_code)
// MITRE ATT&CK — Identity events are Valid Accounts / Initial Access
| alter
mitre_tactic = "Initial Access",
mitre_tactic_id = "TA0001",
mitre_technique = "Valid Accounts",
mitre_technique_id = "T1078",
mitre_ids_str = "T1078 - Valid Accounts"
// ============================================================
// ADDITIVE — canonical core, identity block, tags. Nothing above changes.
// ============================================================
| alter
original_upn = userprincipalname
| alter
user_principal = userprincipalname,
user_name = lowercase(userprincipalname),
display_name = userdisplayname
| alter
vendor = vendor_name,
product = product_name,
originalalertid = coalesce(correlationid, id),
originalalertname = alert_name,
originalalertsource = "Microsoft Entra ID - Sign-in Logs",
externallink = null,
severity = if(
alert_severity = "SEV_050_CRITICAL", "Critical",
alert_severity = "SEV_040_HIGH", "High",
alert_severity = "SEV_030_MEDIUM", "Medium",
"Low"),
agent_hostname = null,
agent_id = null,
action_local_ip = null,
action_remote_ip = ipaddress,
actor_effective_username = lowercase(userprincipalname),
agent_device_domain = domain_part
| alter entra_sign_in_id = id,
entra_risk_detail = riskdetail,
entra_risk_events = to_string(riskeventtypes_v2),
entra_client_app = clientappused,
entra_is_interactive = isinteractive,
entra_user_type = usertype,
entra_asn = to_string(autonomoussystemnumber)
// Tag injection — DS:Microsoft/Entra ID → ds_microsoft_entra_id
| alter alert_tags = arraycreate("DS:Microsoft/Entra ID", "DOM:Security")