NDR (check-point-ndr) — Vendor Schema¶
Source:
schemas/vendors/checkpoint-ndr/ndr-generic-alerts.yaml
Identity¶
| Field | Value |
|---|---|
| vendor | check-point-ndr |
| product | NDR |
| data_source | checkpointndr_generic_alert_raw |
| category | Network |
Raw Schema¶
Fields available in the raw ingest dataset.
| Field | Type | Array | Status | JSON Subfields |
|---|---|---|---|---|
insight |
string |
declared | ||
type |
string |
declared | ||
id |
string |
declared | ||
count |
string |
declared | ||
probability |
string |
declared | ||
filter |
string |
declared | ||
from |
string |
declared | ||
to |
string |
declared | ||
domain |
string |
declared | ||
targetdomain |
string |
declared | ||
data |
string |
declared | ||
externalid |
string |
declared | ||
editable |
string |
declared | ||
mdr |
string |
declared | ||
user |
string |
declared | ||
updated |
string |
declared | ||
created |
string |
declared | ||
_alert_data |
string |
declared |
Modeling Rule — SOC Check Point NDR Modeling Rule¶
| Field | Value |
|---|---|
| modeling_rule_id | SOC_CheckPointNDR_ModelingRule |
| modeling_rule_name | SOC Check Point NDR Modeling Rule |
| directory_name | SOCCheckPointNDRModelingRules |
| fromversion | 6.10.0 |
Field Mappings¶
What each XDM field is, where it sources from, what issue field it surfaces on, and why the mapping is shaped the way it is.
| XDM Path | Expression | Sources | Issue Field | Description |
|---|---|---|---|---|
xdm.event.id |
to_string(id) |
id |
originalalertid |
|
xdm.event.type |
type |
type |
||
xdm.alert.original_alert_id |
to_string(id) |
id |
||
xdm.alert.name |
insight |
insight |
originalalertname |
|
xdm.alert.description |
json_extract_scalar(_alert_data, "$.alert_description") |
_alert_data |
alert_description |
|
xdm.alert.severity |
json_extract_scalar(_alert_data, "$.severity") |
_alert_data |
severity |
Raw Check Point severity (SEV_0X0_X). The correlation rule's pre_alter does the standard severity-string mapping; this XDM field preserves the raw vendor value for analytics. |
xdm.alert.category |
arrayindex(split(insight, "."), 0) |
insight |
First dot-segment of insight: "Behavioral" / "Threat" / "Reputation" / "Anomaly" — Check Point's top-level alert family. | |
xdm.alert.subcategory |
arrayindex(split(insight, "."), 1) |
insight |
Second dot-segment: "Geo" / "Port" / etc. — the analytic dimension within the family. | |
xdm.source.ipv4 |
json_extract_scalar(_alert_data, "$.sourceips[0]") |
_alert_data |
action_remote_ip |
|
xdm.target.ipv4 |
json_extract_scalar(_alert_data, "$.destinationips[0]") |
_alert_data |
action_local_ip |
|
xdm.target.port |
to_integer(json_extract_scalar(_alert_data, "$.dstports[0]")) |
_alert_data |
action_remote_port |
Contributes (Artifacts.*)¶
Fields populated for downstream lifecycle Artifacts schemas:
Network.RemoteIPNetwork.LocalIPNetwork.RemotePort
Correlation Rules¶
SOC CheckPoint NDR - Behavioral Alerts¶
| Field | Value |
|---|---|
| global_rule_id | SOC CheckPoint NDR - Behavioral Alerts |
| subtype | passthrough |
| fromversion | 6.10.0 |
Reshapes Check Point NDR Behavioral alerts (from checkpointndr_generic_alert_raw) into properly-formed XSIAM alerts. Replaces the OEM-default rule, which produced empty alert_fields and missing DS tags, causing SOC Framework playbooks to hang on unclassified alerts. Extracts source/destination IPs, derives category from the insight prefix, maps Check Point's SEV_0X0_X severity ladder to XSIAM severity, and injects DS:Check Point/NDR and DOM:Security tags so Foundation Product Classification routes the alert into the Network category.
Tags: SOCFramework, Passthrough, Network, Check Point
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 | cp_category |
| user_defined_severity | severity |
| is_enabled | ✓ |
| drilldown_query_timeframe | ALERT |
| severity | User Defined |
Suppression¶
| Field | Value |
|---|---|
| enabled | ✓ |
| duration | 1 hours |
| fields | originalalertid |
originalalertid sources from the dataset's id column —
Check Point NDR's per-alert unique identifier. Hourly
suppression handles cases where the same alert re-fires
on subsequent polling cycles before being closed.
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 |
mitre |
|
mitretacticname |
mitretacticname |
mitre |
|
mitretechniqueid |
mitretechniqueid |
mitre |
|
mitretechniquename |
mitretechniquename |
mitre |
|
action_local_ip |
action_local_ip |
computed |
|
action_remote_ip |
action_remote_ip |
computed |
|
action_remote_port |
action_remote_port |
computed |
|
externalconfidence |
originalalertconfidence |
computed |
|
checkpoint_protection |
checkpoint_protection |
computed |
|
checkpoint_subcategory |
checkpoint_subcategory |
computed |
|
checkpoint_bytes_sent |
checkpoint_bytes_sent |
computed |
|
tags |
alert_tags |
computed |
Pre-Alter XQL¶
// Vendor / product (required for SOCProductCategoryMap routing)
| alter vendor_name = "Check Point", product_name = "NDR"
// Scope to Behavioral.* insights. Other top-level types
// (Threat.*, Reputation.*, Anomaly.*) get their own rule entries
// with matching filters when samples appear.
| filter type = "Behavioral"
// Top-level columns are already parsed — rename for readability.
// `from` / `to` are XQL keywords; backtick-quote when referencing.
| alter
cp_insight = insight,
cp_type = type,
cp_id = id,
cp_filter = `filter`,
cp_probability = to_integer(probability),
cp_domain = domain
// Extract scalar fields from the _alert_data payload
| alter
alert_name_raw = json_extract_scalar(_alert_data, "$.alert_name"),
alert_description_raw = json_extract_scalar(_alert_data, "$.alert_description"),
severity_raw = json_extract_scalar(_alert_data, "$.severity"),
alert_action_status = json_extract_scalar(_alert_data, "$.alert_action_status"),
external_link = json_extract_scalar(_alert_data, "$.externallink"),
cp_alert_source = json_extract_scalar(_alert_data, "$.alert_source"),
bytes_sent = to_integer(json_extract_scalar(_alert_data, "$.sentbytes")),
bytes_received = to_integer(json_extract_scalar(_alert_data, "$.receivedbytes"))
// Extract IP / port arrays from _alert_data; first element is the
// actionable IOC. For inbound NDR alerts (Behavioral.Geo, Behavioral.Port):
// sourceips[0] = external attacker → action_remote_ip
// destinationips[0] = target / asset → action_local_ip
| alter
src_ip = json_extract_scalar(_alert_data, "$.sourceips[0]"),
dst_ip = json_extract_scalar(_alert_data, "$.destinationips[0]"),
dst_port = json_extract_scalar(_alert_data, "$.dstports[0]")
// Extract enrichment from data.statistics. top_protection_name may
// be empty for Behavioral subtypes that don't have a Threat
// Prevention signature association (e.g. Behavioral.Geo.*).
| alter
protection_name = arrayindex(json_extract_array(data, "$.statistics.top_protection_name"), 0),
total_src_count = to_integer(json_extract_scalar(data, "$.statistics.total_src")),
total_dst_count = to_integer(json_extract_scalar(data, "$.statistics.total_dst"))
// Severity mapping: Check Point SEV_0X0_X → XSIAM standard.
// Today only SEV_020_LOW and SEV_030_MEDIUM observed in this PoV;
// full ladder included for resilience.
| alter severity = if(
severity_raw = "SEV_050_CRITICAL", "Critical",
severity_raw = "SEV_040_HIGH", "High",
severity_raw = "SEV_030_MEDIUM", "Medium",
severity_raw = "SEV_020_LOW", "Low",
severity_raw = "SEV_010_INFO", "Informational",
"Low"
)
// Category derivation from the insight string structure.
// Behavioral.Geo.Mexico → cp_category=Behavioral, cp_subcategory=Geo
// Behavioral.Port.11211.InnoDB → cp_category=Behavioral, cp_subcategory=Port
| alter
cp_category = arrayindex(split(cp_insight, "."), 0),
cp_subcategory = arrayindex(split(cp_insight, "."), 1)
// Default category fallback when insight is empty or malformed
| alter cp_category = coalesce(cp_category, "Network")
// MITRE — empty for Behavioral alerts. Columns must exist for the
// four MITRE alert_fields entries required by the passthrough
// subtype validator.
| alter
mitretacticid = null,
mitretacticname = null,
mitretechniqueid = null,
mitretechniquename = null
// Build readable alert name following the Falcon / ProofPoint
// pattern: [Category] {actor} - {phase}: {detail}.
//
// For NDR alerts, the "actor" is the source→destination connection
// (visible directionality at a glance), the "phase" is Check Point's
// analytic dimension (Geo / Port / etc. — second insight segment),
// and the "detail" is the Threat Prevention signature name when
// associated, falling back to the full insight string when not.
//
// Behavioral.Geo.Mexico (no protection_name):
// [Network] 177.245.208.115 → 198.140.5.229 - Geo: Behavioral.Geo.Mexico
//
// Behavioral.Port.11211.InnoDB (with protection_name):
// [Network] 65.49.1.94 → 192.189.186.36 - Port: Memcached Web-Servers Network Flood Denial of Service
| alter alert_name = concat(
"[Network] ",
coalesce(src_ip, "Unknown"),
" → ",
coalesce(dst_ip, "Unknown"),
" - ",
coalesce(cp_subcategory, "Behavioral"),
": ",
coalesce(protection_name, cp_insight, "Anomaly")
)
// Build alert description: Check Point's original text (preserved
// for analyst context — note that it sometimes references different
// IPs than sourceips/destinationips because it describes the
// originating behavioral pattern while the alert is a narrowed
// slice per the filter expression) plus a piped fact-list of the
// actionable IOCs and key metadata. Pattern matches Falcon's
// description format.
| alter alert_description = concat(
coalesce(alert_description_raw, "Check Point NDR Behavioral alert"),
" | Source: ", coalesce(src_ip, "Unknown"),
" | Destination: ", coalesce(dst_ip, "Unknown"),
" | Port: ", coalesce(to_string(dst_port), "Unknown"),
" | Severity: ", coalesce(severity, "Unknown"),
" | Confidence: ", coalesce(to_string(cp_probability), "0"),
" | Bytes Sent: ", coalesce(to_string(bytes_sent), "0")
)
// ============================================================
// CANONICAL CORE NORMALIZATION
// Endpoint-shaped columns (agent_*, actor_*, parent_process_*)
// stay null for network alerts. Network-shaped columns drive
// Foundation_-_Normalize_Network_V3.
// ============================================================
| alter
vendor = vendor_name,
product = product_name,
originalalertid = cp_id,
originalalertname = cp_insight,
originalalertsource = "Check Point - NDR",
externallink = external_link,
alert_description = alert_description,
severity = severity,
action_local_ip = dst_ip,
action_remote_ip = src_ip,
action_remote_port = dst_port
// Check Point NDR-specific extensions preserved for analyst
// context and downstream enrichment.
| alter
originalalertconfidence = cp_probability,
originalalertfilter = cp_filter,
checkpoint_protection = protection_name,
checkpoint_subcategory = cp_subcategory,
checkpoint_total_src = total_src_count,
checkpoint_total_dst = total_dst_count,
checkpoint_bytes_sent = bytes_sent
// Tag injection — load-bearing for routing.
// Foundation Product Classification reads issue.tags, filters for
// entries containing DS:, lowercases and normalizes non-alnum
// characters to underscore. "DS:Check Point/NDR" becomes
// ds_check_point_ndr, which keys into SOCProductCategoryMap_V3
// → category: Network. Without this, downstream Workflow routing
// has no category to dispatch to and the playbook stalls.
| alter alert_tags = arraycreate("DS:Check Point/NDR", "DOM:Security")