Repository navigation
Add CrowdStrike plugin #146
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
JackTSquppy
wants to merge
27
commits into
main
Choose a base branch
from
work/jt/crowdstrike-plugin
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+3,362
−0
Open
Changes from all commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
3b04e9e
Add CrowdStrike plugin
JackTSquppy a60125f
CrowdStrike: restrict cloud region to a single selection
JackTSquppy 6805a8f
CrowdStrike: handle cloudRegion autocomplete value being an object
JackTSquppy c628297
CrowdStrike: resolve cloudRegion from string, object or array
JackTSquppy 11cdeed
CrowdStrike: bump version to 1.0.1
JackTSquppy 3534fa7
CrowdStrike: fix duplicate limit and paging for devices, host groups,…
JackTSquppy 7170809
CrowdStrike: rewrite filter expressions without '}}' sequences
JackTSquppy 4a694ef
CrowdStrike: make host group import step optional
JackTSquppy eaffd63
CrowdStrike: smaller device pages, unpaged host groups
JackTSquppy 925a069
CrowdStrike: 250 devices per page, drop wildcard device columns
JackTSquppy 6d24b80
CrowdStrike: page devices with meta.pagination.next, slim rows via fi…
JackTSquppy 99792a5
CrowdStrike: use 'groups' instead of invalid 'group_ids' device field
JackTSquppy 51d697c
CrowdStrike: lean hostsIndex stream for import, smaller device pages
JackTSquppy 50f0164
CrowdStrike: import hosts 500 per page
JackTSquppy 8425dc1
CrowdStrike: make host/group scope parsing robust to object shape
JackTSquppy 2145a30
CrowdStrike: always send valid alert and vulnerability filters
JackTSquppy 2e18e59
CrowdStrike: single-request count streams for Overview, surface API e…
JackTSquppy 250e411
CrowdStrike: update README, require explicit cloud selection
JackTSquppy cdb493c
CrowdStrike: address review feedback (scope classification, README, p…
JackTSquppy 7509c52
CrowdStrike: OR together Host and Host Group scope clauses
JackTSquppy 79b6c69
CrowdStrike: derive response latency from seconds_to_triaged
JackTSquppy cf83791
CrowdStrike: stop Days Open counting at closure
JackTSquppy ec12559
CrowdStrike: single-sentence descriptions for count and recent hosts …
JackTSquppy 140c573
CrowdStrike: clarify what setup validation checks
JackTSquppy bd3fc14
CrowdStrike: share one errorHandling script between streams
JackTSquppy 6a92019
CrowdStrike: drop redundant scope callout from README
JackTSquppy de18eba
CrowdStrike: drop tested-at-scale note from README
JackTSquppy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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." | ||
| } | ||
| ] | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| [ | ||
| { | ||
| "name": "CrowdStrike Host Group", | ||
| "sourceType": "CrowdStrike Host Group", | ||
| "icon": "layer-group", | ||
| "singular": "Host Group", | ||
| "plural": "Host Groups" | ||
| }, | ||
| { | ||
| "name": "CrowdStrike Host", | ||
| "sourceType": "CrowdStrike Host", | ||
| "icon": "desktop", | ||
| "singular": "Host", | ||
| "plural": "Hosts" | ||
| } | ||
| ] | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.