[ESET PROTECT] Add device inventory and CDR vulnerability findings data streams (v2.3.0)#19139
[ESET PROTECT] Add device inventory and CDR vulnerability findings data streams (v2.3.0)#19139m11tch wants to merge 9 commits into
Conversation
|
💚 CLA has been signed |
ReviewersBuildkite won't run for external contributors automatically; you need to add a comment:
NOTE: https://github.com/elastic/integrations/blob/main/.buildkite/pull-requests.json contains all those details. |
|
Pinging @elastic/security-service-integrations (Team:Security-Service Integrations) |
|
I've signed the CLA in the meantime. |
- Introduced a new data stream for collecting device vulnerability logs from ESET PROTECT. - Implemented CEL configuration for fetching device vulnerabilities and managing state. - Created an Elasticsearch ingest pipeline for processing device vulnerability logs. - Defined base fields and additional fields for device vulnerability data. - Added sample event for device vulnerability logs. - Updated README documentation to include new fields and integration details. - Implemented transforms for managing the latest device vulnerability findings. - Bumped version to 2.3.0 to reflect new features and enhancements.
…ice_vulnerability streams If the Device Management API returns a non-200/non-202 response during Phase 1, the CEL programs now proceed to Phase 2 with an empty device map rather than aborting the poll cycle entirely. Detections and vulnerabilities continue to flow without host enrichment until the device API recovers.
…ost.id mapping Replace package.name + package.version in the transform unique_key with eset_protect.device_vulnerability.type + eset_protect.device_vulnerability.vulnerability_id. The previous key excluded OS vulnerabilities (no package.* fields) and could collapse distinct application/package records sharing the same CVE on the same device. The new key mirrors the source _id fingerprint (host.id + vulnerability_id) and correctly represents all three vulnerability types. Also declare host.id in device_vulnerability/fields/fields.yml and the transform fields, fixing the missing mapping that was already being populated by the ingest pipeline.
…score ESET's riskScore (0-100) is not a CVSS base score and does not belong in vulnerability.score.base (0-10, NVD-sourced). The value is already preserved in eset_protect.device_vulnerability.risk_score.
…e.base mapping
Construct vulnerability.title using the m365_defender pattern:
- "Vulnerability found in {package.name} {package.version} - {CVE}"
for application and package vulnerability types
- "Vulnerability found - {CVE}" fallback for OS vulnerabilities
Declare vulnerability.score.base as float in the transform destination
fields so the CDR panel can sort on it even though ESET does not provide
a CVSS score. The field is intentionally left unpopulated; the pipeline
no longer maps ESET's proprietary risk score (0-100) onto this field.
The fingerprint caused re-ingested vulnerability documents to be rejected by the data stream (op_type: create), preventing event.ingested and @timestamp from refreshing on each poll cycle. This meant the transform destination would never be updated for unchanged vulnerabilities, causing the retention policy to eventually delete them regardless of whether they were remediated. Removing the fingerprint aligns with how m365_defender and other CDR vulnerability integrations work: each poll emits fresh documents, the transform latest deduplication handles the CDR view, and the 2h retention policy correctly ages out only remediated vulnerabilities.
|
/test |
💔 Build Failed
Failed CI StepsHistory |
This comment has been minimized.
This comment has been minimized.
|
Pipeline test failure: |
TL;DR
Remediation
Investigation detailsRoot CauseThe static test
Evidence
Verification
Follow-up
Note 🔒 Integrity filter blocked 2 itemsThe following items were blocked because they don't meet the GitHub integrity level.
To allow these resources, lower tools:
github:
min-integrity: approved # merged | approved | unapproved | noneWhat is this? | From workflow: PR Buildkite Detective Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not. |
Suggested label: Enhancement (pick the matching GitHub label)
WHAT
Adds two new data streams to the ESET PROTECT integration at v2.3.0:
device— Collects managed device inventory from the ESET Device Management API (/v1/devices). Maps device identity, OS, hardware profiles, and network adapters to ECS (host.*). Uses an_idfingerprint ondevice.uuidto deduplicate inventory records across polls. Includes MAC address extraction, OS type/platform/family normalisation, and hardware profile camelCase → snake_case renaming via Painless scripts.device_vulnerability— Collects per-vulnerability records from the ESET Vulnerability Management API (/v1/device-vulnerabilities). Supports all three ESET vulnerability types (application, OS, package) and maps them to ECSvulnerability.*andpackage.*fields. Includes alatesttransform (latest_cdr_vuln) that writes to thesecurity_solution-eset_protect.vulnerability_latestalias consumed by Kibana's CDR vulnerability findings panel. Each poll emits fresh documents (no_idfingerprint) so the transform destination stays current and the 2h retention policy correctly ages out remediated vulnerabilities.detection(updated) — The detection stream previously only carriedhost.id(device UUID). Since the ESET detection API returns only adeviceUuidwith no host metadata, a two-phase CEL collection cycle is introduced: Phase 1 pre-fetches the full device inventory and builds an in-memory UUID → device info map; Phase 2 fetches detections and embedshost.name,host.ip, andhost.os.*into each event at collection time. This makes host context visible in the Kibana host flyout without requiring the entity store. The device pre-fetch is best-effort — a Phase 1 API failure falls through to Phase 2 with an empty map so detections continue to flow without enrichment.WHY
ESET PROTECT customers using Kibana Security need:
devicestream)device_vulnerabilitystream + transform)detectionstream enrichment)The ESET API design requires the two-phase detection approach because — unlike CrowdStrike, SentinelOne, and Microsoft Defender — the ESET detection endpoint returns only a
deviceUuidreference with no host metadata inline. The device pre-fetch is the only way to enrich detections without a separate lookup at query time.The vulnerability transform does not set
vulnerability.score.basefrom ESET'sriskScorefield because ESET's score uses a 0–100 proprietary scale that is not comparable to CVSS (0–10). The field is declared in the transform destination mapping to satisfy the CDR panel's sort requirement, but left unpopulated. ESET's risk score is preserved ineset_protect.device_vulnerability.risk_score.Note for reviewers: The
latest_cdr_vulntransform destination index requires thekibana_systembuilt-in role to have read access tologs-eset_protect.device_vulnerability-*and manage/write access tosecurity_solution-eset_protect.vulnerability_latest*. A follow-up PR to the Elasticsearch repository will be needed to update the role after this integration merges.Checklist
changelog.ymlfile.How to test this PR locally
detection,device,device_vulnerabilitylogs-eset_protect.device-*and host metadata (IP, OS) is visible in the Kibana host flyout from detection eventskibana_systemrole updateScreenshots