Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3b04e9e
Add CrowdStrike plugin
JackTSquppy Sep 2, 2026
a60125f
CrowdStrike: restrict cloud region to a single selection
JackTSquppy Oct 5, 2026
6805a8f
CrowdStrike: handle cloudRegion autocomplete value being an object
JackTSquppy Oct 5, 2026
c628297
CrowdStrike: resolve cloudRegion from string, object or array
JackTSquppy Oct 5, 2026
11cdeed
CrowdStrike: bump version to 1.0.1
JackTSquppy Oct 7, 2026
3534fa7
CrowdStrike: fix duplicate limit and paging for devices, host groups,…
JackTSquppy Oct 8, 2026
7170809
CrowdStrike: rewrite filter expressions without '}}' sequences
JackTSquppy Oct 8, 2026
4a694ef
CrowdStrike: make host group import step optional
JackTSquppy Oct 8, 2026
eaffd63
CrowdStrike: smaller device pages, unpaged host groups
JackTSquppy Oct 8, 2026
925a069
CrowdStrike: 250 devices per page, drop wildcard device columns
JackTSquppy Oct 8, 2026
6d24b80
CrowdStrike: page devices with meta.pagination.next, slim rows via fi…
JackTSquppy Oct 13, 2026
99792a5
CrowdStrike: use 'groups' instead of invalid 'group_ids' device field
JackTSquppy Oct 13, 2026
51d697c
CrowdStrike: lean hostsIndex stream for import, smaller device pages
JackTSquppy Oct 13, 2026
50f0164
CrowdStrike: import hosts 500 per page
JackTSquppy Oct 13, 2026
8425dc1
CrowdStrike: make host/group scope parsing robust to object shape
JackTSquppy Oct 14, 2026
2145a30
CrowdStrike: always send valid alert and vulnerability filters
JackTSquppy Oct 14, 2026
2e18e59
CrowdStrike: single-request count streams for Overview, surface API e…
JackTSquppy Oct 14, 2026
250e411
CrowdStrike: update README, require explicit cloud selection
JackTSquppy Oct 14, 2026
cdb493c
CrowdStrike: address review feedback (scope classification, README, p…
JackTSquppy Oct 14, 2026
7509c52
CrowdStrike: OR together Host and Host Group scope clauses
JackTSquppy Oct 14, 2026
79b6c69
CrowdStrike: derive response latency from seconds_to_triaged
JackTSquppy Oct 14, 2026
cf83791
CrowdStrike: stop Days Open counting at closure
JackTSquppy Oct 14, 2026
ec12559
CrowdStrike: single-sentence descriptions for count and recent hosts …
JackTSquppy Oct 14, 2026
140c573
CrowdStrike: clarify what setup validation checks
JackTSquppy Oct 14, 2026
bd3fc14
CrowdStrike: share one errorHandling script between streams
JackTSquppy Oct 15, 2026
6a92019
CrowdStrike: drop redundant scope callout from README
JackTSquppy Oct 15, 2026
de18eba
CrowdStrike: drop tested-at-scale note from README
JackTSquppy Oct 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions plugins/CrowdStrike/v1/configValidation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"steps": [
{
"displayName": "Authenticate",
"dataStream": { "name": "currentUser" },
"required": true,
"error": "Could not authenticate. Check your Client ID, Client Secret and CrowdStrike Cloud region are correct, and that the API client has the Hosts: Read scope.",
"success": "Connected successfully."
}
]
}
16 changes: 16 additions & 0 deletions plugins/CrowdStrike/v1/custom_types.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[
{
"name": "CrowdStrike Host Group",
"sourceType": "CrowdStrike Host Group",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
"icon": "layer-group",
"singular": "Host Group",
"plural": "Host Groups"
},
{
"name": "CrowdStrike Host",
"sourceType": "CrowdStrike Host",
"icon": "desktop",
"singular": "Host",
"plural": "Hosts"
}
]
232 changes: 232 additions & 0 deletions plugins/CrowdStrike/v1/dataStreams/alerts.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
{
"name": "alerts",
"displayName": "Alerts",
"description": "Detections and incidents from the unified Falcon Alerts API, one row per alert, with computed detection and response latency",
"tags": [
"Security",
"Alerts"
],
"baseDataSourceName": "httpRequestUnscoped",
"config": {
"httpMethod": "post",
"endpointPath": "/alerts/combined/alerts/v1",
"postBody": {
"limit": 1000,
"sort": "created_timestamp|desc",
"filter": "{{ (typeof timeframe !== 'undefined' && timeframe && timeframe.start && timeframe.end ? [ \"created_timestamp:>'\" + timeframe.start.replace(/\\.\\d+Z$/, 'Z') + \"'+created_timestamp:<'\" + timeframe.end.replace(/\\.\\d+Z$/, 'Z') + \"'\" ] : []).concat(((S => S.length > 1 ? [ \"(\" + S.join(\",\") + \")\" ] : S)((typeof scope === 'undefined' || !scope ? [] : [ [\"device.device_id\", scope.filter(o => (typeof o.type === 'string' ? o.type : JSON.stringify(o)).indexOf('Host Group') < 0)], [\"device.groups\", scope.filter(o => (typeof o.type === 'string' ? o.type : JSON.stringify(o)).indexOf('Host Group') >= 0)] ].filter(p => p[1].length).map(p => p[0] + \":[\" + p[1].map(o => \"'\" + String([].concat(o.rawId !== undefined ? o.rawId : (o.sourceId || o.id))[0]).split('~').pop() + \"'\").join(\",\") + \"]\"))))).concat((typeof status === 'undefined' || !status || !status.length ? [] : [ \"status:[\" + status.map(s => \"'\" + (s.value || s) + \"'\").join(\",\") + \"]\" ])).join(\"+\") || \"created_timestamp:>'2000-01-01T00:00:00Z'\" }}"
},
"paging": {
"mode": "token",
"in": {
"realm": "payload",
"path": "meta.pagination.after"
},
"out": {
"realm": "body",
"path": "after"
}
},
"pathToData": "resources",
"expandInnerObjects": true,
"errorHandling": {
"type": "script",
"script": "errorHandling/falconApiError.js"
}
},
"matches": "none",
"ui": [
{
"type": "objects",
"name": "scope",
"label": "Host or Host Group (optional)",
"matches": {
"sourceType": {
"type": "oneOf",
"values": [
"CrowdStrike Host",
"CrowdStrike Host Group"
]
}
}
},
{
"type": "choiceChips",
"name": "status",
"label": "Status",
"isMulti": true,
"options": [
{
"value": "new",
"label": "New"
},
{
"value": "in_progress",
"label": "In Progress"
},
{
"value": "closed",
"label": "Closed"
},
{
"value": "reopened",
"label": "Reopened"
}
]
}
],
"metadata": [
{
"name": "composite_id",
"displayName": "ID",
"shape": "string",
"role": "id",
"visible": false
},
{
"name": "name",
"displayName": "Name",
"shape": "string",
"role": "label"
},
{
"name": "description",
"displayName": "Description",
"shape": "string"
},
{
"name": "status",
"displayName": "Status",
"shape": "string"
},
{
"name": "severity_name",
"displayName": "Severity",
"shape": "string"
},
{
"name": "severity",
"displayName": "Severity Score",
"shape": "number"
},
{
"name": "confidence",
"displayName": "Confidence",
"shape": "number"
},
{
"name": "product",
"displayName": "Product",
"shape": "string"
},
{
"name": "type",
"displayName": "Alert Type",
"shape": "string"
},
{
"name": "tactic",
"displayName": "Tactic",
"shape": "string"
},
{
"name": "technique",
"displayName": "Technique",
"shape": "string"
},
{
"name": "device.device_id",
"displayName": "Device ID",
"shape": "string",
"visible": false
},
{
"name": "device.hostname",
"displayName": "Hostname",
"shape": "string"
},
{
"name": "device.platform_name",
"displayName": "Platform",
"shape": "string"
},
{
"name": "filename",
"displayName": "File Name",
"shape": "string"
},
{
"name": "filepath",
"displayName": "File Path",
"shape": "string"
},
{
"name": "cmdline",
"displayName": "Command Line",
"shape": "string"
},
{
"name": "user_name",
"displayName": "User",
"shape": "string"
},
{
"name": "tags",
"displayName": "Tags",
"shape": "string"
},
{
"name": "created_timestamp",
"displayName": "Created",
"shape": "date",
"role": "timestamp"
},
{
"name": "updated_timestamp",
"displayName": "Last Updated",
"shape": "date"
},
{
"name": "first_behavior",
"displayName": "First Behavior",
"shape": "date"
},
{
"name": "last_behavior",
"displayName": "Last Behavior",
"shape": "date"
},
{
"name": "detectionLatencySeconds",
"displayName": "Detection Latency",
"computed": true,
"valueExpression": "{{ ($['first_behavior'] && $['created_timestamp']) ? Math.max(0, (new Date($['created_timestamp']) - new Date($['first_behavior'])) / 1000) : null }}",
"shape": [
"seconds",
{
"formatDuration": true
}
]
},
{
"name": "responseLatencySeconds",
"displayName": "Response Latency",
"computed": true,
"valueExpression": "{{ ($['seconds_to_triaged'] !== undefined && $['seconds_to_triaged'] !== null && $['seconds_to_triaged'] !== '' && !isNaN(Number($['seconds_to_triaged']))) ? Math.max(0, Number($['seconds_to_triaged'])) : null }}",
"shape": [
"seconds",
{
"formatDuration": true
}
]
},
{
"sourceId": "device.device_id",
"sourceType": "CrowdStrike Host",
"name": "device.hostname"
},
{
"pattern": ".*"
}
],
"timeframes": true
}
18 changes: 18 additions & 0 deletions plugins/CrowdStrike/v1/dataStreams/currentUser.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "currentUser",
"displayName": "Host IDs",
"description": "A minimal Falcon Hosts query, used only to verify the configured credentials can reach the API",
"tags": ["Security"],
"baseDataSourceName": "httpRequestUnscoped",
"config": {
"httpMethod": "get",
"endpointPath": "/devices/queries/devices/v1",
"getArgs": [{ "key": "limit", "value": "1" }],
"paging": { "mode": "none" },
"pathToData": "resources"
},
"matches": "none",
"visibility": { "type": "hidden" },
"metadata": [{ "pattern": ".*" }],
"timeframes": false
}
Loading
Loading