From 1ac93dea046d24fc033a30d391acce596506d25d Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 13 May 2026 08:32:31 +0100 Subject: [PATCH 01/49] feat: initial commit --- .../v1/dataStreams/advancedHuntingQuery.json | 52 ++ .../v1/dataStreams/deviceSecureStore.json | 24 + .../v1/dataStreams/devicesNew.json | 84 +++ .../v1/dataStreams/exposureScore.json | 24 + .../v1/dataStreams/listDevices.json | 42 ++ .../v1/dataStreams/listRecommendations.json | 25 + .../v1/dataStreams/listVulnerabilities.json | 26 + .../Devices/deviceStatus.dash.json | 378 ++++++++++++++ .../v1/defaultContent/Devices/manifest.json | 12 + .../defaultContent/Devices/overview.dash.json | 197 +++++++ .../v1/defaultContent/cockpit.dash.json | 494 ++++++++++++++++++ .../v1/defaultContent/manifest.json | 20 + .../defaultContent/recommendations.dash.json | 442 ++++++++++++++++ .../v1/defaultContent/scopes.json | 19 + .../defaultContent/vulnerabilities.dash.json | 231 ++++++++ .../Microsoft Defender (Preview)/v1/icon.png | Bin 0 -> 67410 bytes .../v1/indexDefinitions/default.json | 31 ++ .../v1/metadata.json | 46 ++ .../Microsoft Defender (Preview)/v1/ui.json | 29 + 19 files changed, 2176 insertions(+) create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/icon.png create mode 100644 plugins/Microsoft Defender (Preview)/v1/indexDefinitions/default.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/metadata.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/ui.json diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json new file mode 100644 index 00000000..df4d4788 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json @@ -0,0 +1,52 @@ +{ + "name": "advancedHuntingQuery", + "displayName": "Advanced Hunting Query", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "post", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "pathToData": "Results", + "endpointPath": "/api/advancedqueries/run", + "postBody": { + "Query": "{{query}}" + }, + "getArgs": [], + "headers": [] + }, + "matches": "none", + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear" + ], + "providesPluginDiagnostics": true, + "tags": [ + "KQL", + "Advanced Hunting" + ], + "ui": [ + { + "name": "query", + "language": "kusto", + "label": "Query", + "type": "code", + "validation": { + "required": true + } + } + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json new file mode 100644 index 00000000..d6d809bb --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json @@ -0,0 +1,24 @@ +{ + "name": "deviceSecureStore", + "displayName": "Device Secure Score", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "/api/configurationScore", + "getArgs": [], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [ + "Device" + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json new file mode 100644 index 00000000..a9822366 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json @@ -0,0 +1,84 @@ +{ + "name": "devicesNew", + "displayName": "Devices", + "baseDataSourceName": "httpRequestScopedSingle", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "api/machines/{{object.deviceid}}", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "sourceId": "id", + "name": "computerDnsName", + "shape": "string", + "role": "label", + "sourceType": "defender-device" + }, + { + "shape": [ + "state", + { + "map": { + "unmonitored": [], + "unknown": [ + "Unknown", + "Inactive" + ], + "error": [ + "ImpairedCommunication", + "NoSensorDataImpairedCommunication", + "NoSensorData" + ], + "warning": [], + "success": [ + "Active" + ] + } + } + ], + "name": "healthStatus" + }, + { + "shape": [ + "state", + { + "map": { + "unmonitored": [], + "unknown": [], + "error": [ + "High" + ], + "warning": [ + "Medium" + ], + "success": [ + "Low" + ] + } + } + ], + "name": "exposureLevel" + }, + { + "pattern": ".*" + } + ], + "matches": { + "sourceType": { + "type": "equals", + "value": "defender-device" + } + }, + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json new file mode 100644 index 00000000..0605c999 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json @@ -0,0 +1,24 @@ +{ + "name": "exposureScore", + "displayName": "Device Exposure Score", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "api/exposurescore", + "getArgs": [], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [ + "Device" + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json new file mode 100644 index 00000000..00a2a450 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json @@ -0,0 +1,42 @@ +{ + "name": "listDevices", + "displayName": "List Devices", + "description": "", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "api/machines", + "pathToData": "value", + "getArgs": [], + "headers": [] + }, + "matches": [ + { + "sourceType": { + "type": "equals", + "value": "squaredup/data-source" + }, + "pluginId": { + "type": "equals", + "value": "plugin-bi89KMBtdXqKNJIwcn2N" + }, + "sourceId": { + "type": "equals", + "value": "config-TPvNIMMPMu4LhSro2Rk7" + } + } + ], + "providesPluginDiagnostics": true, + "timeframes": false, + "tags": [], + "visibility": { + "type": "hidden" + } +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json new file mode 100644 index 00000000..c18f891a --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json @@ -0,0 +1,25 @@ +{ + "name": "listRecommendations", + "displayName": "Recommendations", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "api/recommendations", + "pathToData": "value", + "getArgs": [], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [ + "Recommendations" + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json new file mode 100644 index 00000000..0d9750da --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json @@ -0,0 +1,26 @@ +{ + "name": "listVulnerabilities", + "displayName": "Vulnerabilities", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "api/vulnerabilities/machinesVulnerabilities", + "pathToData": "value", + "getArgs": [], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [ + "Machines", + "Vulnerabilities" + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json new file mode 100644 index 00000000..7133c368 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json @@ -0,0 +1,378 @@ +{ + "name": "Device Status", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 0, + "y": 0, + "i": "6038c7ef-4b3b-484d-bfda-94d509b4517d", + "z": 0, + "config": { + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Exposure Level", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "exposureLevel", + "linkColumn": "none", + "labelColumn": "exposureLevel[Expanded].rawState" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 1, + "y": 0, + "i": "c5c507d9-02c0-44f1-adfb-d39aaac0ba22", + "z": 0, + "config": { + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Health Status (Sensor)", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "healthStatus", + "linkColumn": "none", + "labelColumn": "healthStatus[Expanded].rawState" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 2, + "y": 0, + "i": "5c51849e-01ae-4319-8505-f89854815182", + "z": 0, + "config": { + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devicesNew", + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [], + "unmonitored": [], + "error": [ + "Down" + ], + "success": [ + "Up" + ], + "unknown": [] + } + } + ], + "name": "ipAddresses.0.operationalStatus" + } + ], + "id": "{{dataStreams.devicesNew}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Network Operational Status", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "ipAddresses.0.operationalStatus", + "linkColumn": "none", + "labelColumn": "ipAddresses.0.operationalStatus[Expanded].rawState" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 3, + "y": 0, + "i": "76485e06-c17a-4239-bf23-561ae12ceaa4", + "z": 0, + "config": { + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Risk Score", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "riskScore", + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 3, + "i": "0c276a67-d530-42a2-86a9-8aeb613372ac", + "z": 0, + "config": { + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Device Attributes", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "mergedIntoMachineId", + "isPotentialDuplication", + "isExcluded", + "exclusionReason", + "firstSeen", + "lastSeen", + "agentVersion", + "deviceValue", + "rbacGroupId", + "rbacGroupName", + "isAadJoined", + "aadDeviceId", + "onboardingStatus", + "managedBy", + "managedByStatus" + ], + "hiddenColumns": [ + "@odata.context", + "computerDnsName", + "osPlatform", + "osProcessor", + "version", + "lastIpAddress", + "lastExternalIpAddress", + "osBuild", + "healthStatus", + "riskScore", + "exposureLevel", + "osArchitecture", + "ipAddresses.0.ipAddress", + "ipAddresses.0.macAddress", + "ipAddresses.0.type", + "ipAddresses.0.operationalStatus", + "ipAddresses.1.ipAddress", + "ipAddresses.1.macAddress", + "ipAddresses.1.type", + "ipAddresses.1.operationalStatus", + "ipAddresses.2.ipAddress", + "ipAddresses.2.macAddress", + "ipAddresses.2.type", + "ipAddresses.2.operationalStatus", + "ipAddresses.3.ipAddress", + "ipAddresses.3.macAddress", + "ipAddresses.3.type", + "ipAddresses.3.operationalStatus", + "healthStatus[Expanded].rawState", + "exposureLevel[Expanded].rawState", + "id", + "vmMetadata.vmId", + "vmMetadata.cloudProvider", + "vmMetadata.resourceId", + "vmMetadata.subscriptionId" + ], + "transpose": true + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 3, + "i": "d815528c-6c58-4e27-b390-d95f070fa1a4", + "z": 0, + "config": { + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Devices Properties", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "osPlatform", + "osProcessor", + "version", + "lastIpAddress", + "lastExternalIpAddress", + "agentVersion", + "osBuild", + "osArchitecture", + "vmMetadata.cloudProvider", + "vmMetadata.resourceId", + "vmMetadata.subscriptionId", + "id", + "vmMetadata.vmId" + ], + "hiddenColumns": [ + "@odata.context", + "mergedIntoMachineId", + "isPotentialDuplication", + "isExcluded", + "exclusionReason", + "firstSeen", + "lastSeen", + "healthStatus", + "deviceValue", + "rbacGroupId", + "rbacGroupName", + "riskScore", + "exposureLevel", + "isAadJoined", + "aadDeviceId", + "onboardingStatus", + "managedBy", + "managedByStatus", + "ipAddresses.0.ipAddress", + "ipAddresses.0.macAddress", + "ipAddresses.0.type", + "ipAddresses.0.operationalStatus", + "ipAddresses.1.ipAddress", + "ipAddresses.1.macAddress", + "ipAddresses.1.type", + "ipAddresses.1.operationalStatus", + "ipAddresses.2.ipAddress", + "ipAddresses.2.macAddress", + "ipAddresses.2.type", + "ipAddresses.2.operationalStatus", + "ipAddresses.3.ipAddress", + "ipAddresses.3.macAddress", + "ipAddresses.3.type", + "ipAddresses.3.operationalStatus", + "healthStatus[Expanded].rawState", + "computerDnsName", + "exposureLevel[Expanded].rawState" + ], + "transpose": true + } + } + } + } + } + ], + "version": 124, + "columns": 4 + }, + "variables": [ + "{{variables.[Defender Device]}}" + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json new file mode 100644 index 00000000..4b56ba1b --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json @@ -0,0 +1,12 @@ +{ + "items": [ + { + "name": "overview", + "type": "dashboard" + }, + { + "name": "deviceStatus", + "type": "dashboard" + } + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json new file mode 100644 index 00000000..7cae0d3e --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json @@ -0,0 +1,197 @@ +{ + "name": "Overview", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 0, + "y": 0, + "i": "29387eac-2ed1-4862-bbb1-c7a23079733e", + "z": 0, + "config": { + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}", + "sort": { + "by": [ + [ + "exposureLevel", + "desc" + ] + ] + } + }, + "scope": { + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Exposure Level", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "exposureLevel", + "linkColumn": "computerDnsName", + "sublabel": "exposureLevel[Expanded].rawState", + "columns": 1, + "labelColumn": "computerDnsName" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 3, + "x": 2, + "y": 0, + "i": "395663f6-9e18-4837-89ec-6013d3e85493", + "z": 0, + "config": { + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}", + "sort": { + "by": [ + [ + "healthStatus", + "desc" + ] + ] + } + }, + "scope": { + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Health Status (Sensor)", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "healthStatus", + "linkColumn": "computerDnsName", + "sublabel": "healthStatus[Expanded].rawState", + "columns": 1, + "labelColumn": "computerDnsName" + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 3, + "i": "1a8ad0a9-dbf6-4b42-91d8-d0c0ef62a9b3", + "z": 0, + "config": { + "dataStream": { + "name": "devicesNew", + "id": "{{dataStreams.devicesNew}}", + "sort": { + "by": [ + [ + "computerDnsName", + "asc" + ] + ] + } + }, + "scope": { + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Properties", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "computerDnsName", + "exposureLevel", + "healthStatus", + "riskScore", + "onboardingStatus", + "lastSeen", + "agentVersion", + "osPlatform", + "osBuild", + "osProcessor", + "version", + "id", + "mergedIntoMachineId", + "isPotentialDuplication", + "isExcluded", + "exclusionReason", + "firstSeen", + "lastIpAddress", + "lastExternalIpAddress", + "deviceValue", + "rbacGroupId", + "rbacGroupName", + "isAadJoined", + "aadDeviceId", + "osArchitecture", + "managedBy", + "managedByStatus", + "ipAddresses.0.ipAddress", + "ipAddresses.0.macAddress", + "ipAddresses.0.type", + "ipAddresses.0.operationalStatus", + "ipAddresses.1.ipAddress", + "ipAddresses.1.macAddress", + "ipAddresses.1.type", + "ipAddresses.1.operationalStatus", + "ipAddresses.2.ipAddress", + "ipAddresses.2.macAddress", + "ipAddresses.2.type", + "ipAddresses.2.operationalStatus", + "ipAddresses.3.ipAddress", + "ipAddresses.3.macAddress", + "ipAddresses.3.type", + "ipAddresses.3.operationalStatus", + "vmMetadata.vmId", + "vmMetadata.cloudProvider", + "vmMetadata.resourceId", + "vmMetadata.subscriptionId", + "@odata.context", + "healthStatus[Expanded].rawState", + "exposureLevel[Expanded].rawState" + ], + "hiddenColumns": [] + } + } + } + } + } + ], + "version": 59, + "columns": 4 + } +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json new file mode 100644 index 00000000..d7a6297b --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json @@ -0,0 +1,494 @@ +{ + "name": "Cockpit", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 2, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "c10e229a-9e67-41f0-ba01-83ee1e33e7b2", + "z": 0, + "config": { + "dataStream": { + "name": "deviceSecureStore", + "id": "{{dataStreams.deviceSecureStore}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Device Secure Score", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "score_percentage", + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "ef878c08-56ff-4b33-b499-8809b0bbc73a", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "exposureScore", + "id": "{{dataStreams.exposureScore}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [ + "score" + ], + "logic": { + "if": [ + { + ">": [ + { + "var": "top" + }, + 70 + ] + }, + "error", + { + ">": [ + { + "var": "top" + }, + 30 + ] + }, + "warning" + ] + } + }, + "_type": "simple", + "column": "score", + "aggregation": "top", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Device Exposure Score", + "visualisation": { + "type": "data-stream-gauge", + "config": { + "data-stream-gauge": { + "value": { + "type": "mean", + "columns": [ + "score" + ] + } + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 0, + "y": 2, + "i": "1740a4de-4864-498e-a3e0-747a5d8ffa11", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "ActionType", + "operation": "equals", + "value": "AntivirusDetection" + }, + { + "column": "ActionType", + "operation": "equals", + "value": "AntivirusDetectionCancelled" + }, + { + "column": "ActionType", + "operation": "equals", + "value": "AntivirusMalwareActionFailed" + } + ] + }, + "dataSourceConfig": { + "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "group": { + "by": [], + "aggregate": [] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Malware & Antivirus Detected", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 1, + "y": 2, + "i": "f5de789a-8f5e-4a36-82b6-f6a2fc2e0ba9", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "ActionType", + "operation": "equals", + "value": "UserAccountCreated" + }, + { + "column": "ActionType", + "operation": "equals", + "value": "ScheduledTaskCreated" + }, + { + "column": "ActionType", + "operation": "equals", + "value": "ScheduledTaskDeleted" + }, + { + "column": "ActionType", + "operation": "equals", + "value": "UserAccountModified" + }, + { + "column": "ActionType", + "operation": "equals", + "value": "UserAccountAddedToLocalGroup" + } + ] + }, + "dataSourceConfig": { + "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "group": { + "by": [], + "aggregate": [] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Persistence & Privilege Escalation", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 2, + "y": 2, + "i": "76f4a20b-d428-479f-93ae-7899f2274b99", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "ActionType", + "operation": "contains", + "value": "AppControl*" + } + ] + }, + "dataSourceConfig": { + "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "group": { + "by": [], + "aggregate": [] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Application Control", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 3, + "y": 2, + "i": "b63f2258-84f3-4f2e-9ee5-701a7953eea3", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "filter": { + "multiOperation": "or", + "filters": [ + { + "column": "ActionType", + "operation": "equals", + "value": "ExploitGuardNetworkProtectionBlocked" + }, + { + "column": "ActionType", + "operation": "equals", + "value": "ExploitGuardNonMicrosoftSignedBlocked" + } + ] + }, + "dataSourceConfig": { + "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "group": { + "by": [], + "aggregate": [] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Exploits", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 2, + "x": 0, + "y": 5, + "i": "956930e3-37fa-49da-a015-7630a5d2d754", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "group": { + "by": [], + "aggregate": [] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Events Timeline", + "visualisation": { + "type": "data-stream-line-graph", + "config": { + "data-stream-line-graph": { + "seriesColumn": "none", + "cumulative": false, + "xAxisColumn": "Timestamp", + "yAxisColumn": [ + "builtin_count_by_label" + ] + } + } + } + } + } + ], + "version": 99, + "columns": 4 + } +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json new file mode 100644 index 00000000..34a749f1 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json @@ -0,0 +1,20 @@ +{ + "items": [ + { + "name": "cockpit", + "type": "dashboard" + }, + { + "name": "Devices", + "type": "folder" + }, + { + "name": "recommendations", + "type": "dashboard" + }, + { + "name": "vulnerabilities", + "type": "dashboard" + } + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json new file mode 100644 index 00000000..22bcbbcc --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json @@ -0,0 +1,442 @@ +{ + "name": "Recommendations", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "530fbd65-3d58-407a-951e-7569b1222ab5", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listRecommendations", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "Active" + } + ] + }, + "id": "{{dataStreams.listRecommendations}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Active", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "2b047798-81f8-4a32-8b5d-e350bb41aaf8", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listRecommendations", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "Active" + } + ] + }, + "id": "{{dataStreams.listRecommendations}}", + "group": { + "by": [ + [ + "remediationType", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Remediation Type", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "count", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table", + "labelColumn": "remediationType_uniqueValues" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "5e08dc7b-d981-4abc-8051-6f389b745b8e", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listRecommendations", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "Active" + } + ] + }, + "id": "{{dataStreams.listRecommendations}}", + "group": { + "by": [ + [ + "recommendationCategory", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Category", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "count", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table", + "labelColumn": "recommendationCategory_uniqueValues" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "2ba85224-a580-4164-bafa-b727fc931fe8", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "dataSourceConfig": { + "version": "2.0", + "tables": [ + { + "config": { + "timeframe": "none", + "activePluginConfigIds": [ + "{{configId}}" + ], + "dataStream": { + "name": "listRecommendations", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "status", + "operation": "equals", + "value": "Active" + } + ] + }, + "metadata": [ + { + "shape": [ + "number", + { + "decimalPlaces": 0 + } + ], + "name": "severityScore_uniqueValues" + }, + { + "pattern": ".*" + } + ], + "id": "{{dataStreams.listRecommendations}}", + "group": { + "by": [ + [ + "severityScore", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, + "pluginConfigId": "{{configId}}" + } + }, + "tableName": "dataset1" + } + ], + "sql": "WITH \"scores\" AS (\n SELECT 0 AS \"severityScore_uniqueValues\"\n UNION ALL SELECT 1\n UNION ALL SELECT 2\n UNION ALL SELECT 3\n UNION ALL SELECT 4\n UNION ALL SELECT 5\n UNION ALL SELECT 6\n UNION ALL SELECT 7\n UNION ALL SELECT 8\n UNION ALL SELECT 9\n)\nSELECT\n \"scores\".\"severityScore_uniqueValues\",\n COALESCE(\"dataset1\".\"count\", 0) AS \"count\"\nFROM \"scores\"\nLEFT JOIN \"dataset1\" ON \"scores\".\"severityScore_uniqueValues\" = \"dataset1\".\"severityScore_uniqueValues\"" + }, + "id": "datastream-sql" + }, + "scope": { + "query": "g.V().has('id', within(ids_OhlTXsVd3W6ErLLqvWW8))", + "bindings": { + "ids_OhlTXsVd3W6ErLLqvWW8": [ + "node-1dwkxV4HX7rWIiV3UddbjAZxFztYmHV1NQ8t1-TPvNIMMPMu4LhSro2Rk7" + ] + }, + "queryDetail": { + "ids": [ + "node-1dwkxV4HX7rWIiV3UddbjAZxFztYmHV1NQ8t1-TPvNIMMPMu4LhSro2Rk7" + ] + } + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Severity Score", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "severityScore_uniqueValues", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": false, + "yAxisData": [ + "count" + ], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 2, + "i": "193720b0-9e92-4782-b1ff-70280e2bade0", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listRecommendations", + "id": "{{dataStreams.listRecommendations}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "List", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "recommendationName", + "id", + "productName", + "weaknesses", + "vendor", + "recommendedVersion", + "recommendedVendor", + "recommendedProgram", + "recommendationCategory", + "subCategory", + "severityScore", + "publicExploit", + "activeAlert", + "remediationType", + "status", + "associatedThreats.85", + "associatedThreats.86", + "configScoreImpact", + "exposureImpact", + "totalMachineCount", + "exposedMachinesCount", + "nonProductivityImpactedAssets", + "relatedComponent", + "hasUnpatchableCve", + "tags.0", + "exposedCriticalDevices", + "tags.1" + ], + "hiddenColumns": [ + "associatedThreats.0", + "associatedThreats.1", + "associatedThreats.2", + "associatedThreats.3", + "associatedThreats.4", + "associatedThreats.5", + "associatedThreats.6", + "associatedThreats.7", + "associatedThreats.8", + "associatedThreats.9", + "associatedThreats.10", + "associatedThreats.11", + "associatedThreats.12", + "associatedThreats.13", + "associatedThreats.14", + "associatedThreats.15", + "associatedThreats.16", + "associatedThreats.17", + "associatedThreats.18", + "associatedThreats.19", + "associatedThreats.20", + "associatedThreats.21", + "associatedThreats.22", + "associatedThreats.23", + "associatedThreats.24", + "associatedThreats.25", + "associatedThreats.26", + "associatedThreats.27", + "associatedThreats.28", + "associatedThreats.29", + "associatedThreats.30", + "associatedThreats.31", + "associatedThreats.32", + "associatedThreats.33", + "associatedThreats.34", + "associatedThreats.35", + "associatedThreats.36", + "associatedThreats.37", + "associatedThreats.38", + "associatedThreats.39", + "associatedThreats.40", + "associatedThreats.41", + "associatedThreats.42", + "associatedThreats.43", + "associatedThreats.44", + "associatedThreats.45", + "associatedThreats.46", + "associatedThreats.47", + "associatedThreats.48", + "associatedThreats.49", + "associatedThreats.50", + "associatedThreats.51", + "associatedThreats.52", + "associatedThreats.53", + "associatedThreats.54", + "associatedThreats.55", + "associatedThreats.56", + "associatedThreats.57", + "associatedThreats.58", + "associatedThreats.59", + "associatedThreats.60", + "associatedThreats.61", + "associatedThreats.62", + "associatedThreats.63", + "associatedThreats.64", + "associatedThreats.65", + "associatedThreats.66", + "associatedThreats.67", + "associatedThreats.68", + "associatedThreats.69", + "associatedThreats.70", + "associatedThreats.71", + "associatedThreats.72", + "associatedThreats.73", + "associatedThreats.74", + "associatedThreats.75", + "associatedThreats.76", + "associatedThreats.77", + "associatedThreats.78", + "associatedThreats.79", + "associatedThreats.80", + "associatedThreats.81", + "associatedThreats.82", + "associatedThreats.83", + "associatedThreats.84" + ] + } + } + } + } + } + ], + "version": 44, + "columns": 4 + } +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json new file mode 100644 index 00000000..0232f0f4 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json @@ -0,0 +1,19 @@ +[ + { + "name": "Defender Devices", + "matches": { + "sourceType": { + "type": "oneOf", + "values": [ + "defender-device" + ] + } + }, + "variable": { + "name": "Defender Device", + "type": "object", + "default": "none", + "allowMultipleSelection": false + } + } +] \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json new file mode 100644 index 00000000..557dcacd --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json @@ -0,0 +1,231 @@ +{ + "name": "Vulnerabilities", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 2, + "y": 0, + "i": "0c28021b-1047-423b-915f-ac975bf61c71", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listVulnerabilities", + "id": "{{dataStreams.listVulnerabilities}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Product", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "builtin_count_by_label", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table", + "labelColumn": "productName" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 0, + "y": 0, + "i": "a66e092f-73d9-4fb2-9344-91ff1b072dcb", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listVulnerabilities", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "severity", + "operation": "equals", + "value": "Critical" + } + ] + }, + "id": "{{dataStreams.listVulnerabilities}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Critical", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 1, + "y": 0, + "i": "776252a0-8be0-4082-b239-ea5b4d9f789e", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listVulnerabilities", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "severity", + "operation": "equals", + "value": "High" + } + ] + }, + "id": "{{dataStreams.listVulnerabilities}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "High", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 3, + "y": 0, + "i": "07a49165-983f-465c-b1ae-d8990f1a6772", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listVulnerabilities", + "id": "{{dataStreams.listVulnerabilities}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Severity", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "severity", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": false, + "yAxisData": [ + "builtin_count_by_label" + ], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 3, + "x": 0, + "y": 3, + "i": "3e302230-6ee0-46a0-9415-0a79381dda06", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "listVulnerabilities", + "id": "{{dataStreams.listVulnerabilities}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "List", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "cveId", + "severity", + "machineId", + "productName", + "productVendor", + "productVersion", + "fixingKbId", + "id" + ], + "hiddenColumns": [] + } + } + } + } + } + ], + "version": 44, + "columns": 4 + } +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/icon.png b/plugins/Microsoft Defender (Preview)/v1/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a34e4d4285d6a0653f947dbba6c6bc2d8a9988c5 GIT binary patch literal 67410 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 Date: Thu, 14 May 2026 09:35:35 +0100 Subject: [PATCH 02/49] feat: basic test button --- .../v1/configValidation.json | 13 ++++++++ .../v1/dataStreams/validation.json | 32 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 plugins/Microsoft Defender (Preview)/v1/configValidation.json create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json diff --git a/plugins/Microsoft Defender (Preview)/v1/configValidation.json b/plugins/Microsoft Defender (Preview)/v1/configValidation.json new file mode 100644 index 00000000..d9c93aad --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/configValidation.json @@ -0,0 +1,13 @@ +{ + "steps": [ + { + "displayName": "API Access Test", + "dataStream": { + "name": "validation" + }, + "success": "Successfully connected to Endpoint", + "error": "Cannot access the Endpoint API - check your client ID & secret. Do you have the correct permissions set?", + "required": true + } + ] +} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json new file mode 100644 index 00000000..54ca99f1 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json @@ -0,0 +1,32 @@ +{ + "name": "validation", + "displayName": "Validation", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "api/alerts", + "pathToData": "value", + "getArgs": [ + { + "key": "$top", + "value": "1", + "needsEncryption": false + } + ], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "visibility": { + "type": "hidden" + }, + "options": { "noMatch": true } +} \ No newline at end of file From 46cf8de1627e1e44cf71470e0f56f4b6db2df4e1 Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 14 May 2026 11:01:55 +0100 Subject: [PATCH 03/49] feat: Alerts data stream --- .../v1/dataStreams/alerts.json | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json new file mode 100644 index 00000000..a10f9783 --- /dev/null +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json @@ -0,0 +1,115 @@ +{ + "name": "alerts", + "displayName": "Alerts", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "offset", + "pageSize": { + "realm": { + "value": "queryArg", + "label": "Query parameter" + }, + "path": "$top", + "value": "100" + }, + "offset": { + "rowCountIn": { + "realm": { + "value": "payloadArraySize", + "label": "Body array size" + }, + "path": "value" + }, + "mode": "row", + "base": "0" + }, + "out": { + "realm": { + "value": "queryArg", + "label": "queryArg" + }, + "path": "$skip" + } + }, + "expandInnerObjects": true, + "endpointPath": "api/alerts", + "getArgs": [ + { + "key": "$filter", + "value": "{{ status && status.length > 0 ? \"(status eq \" + status.map((m) => { return `'${m}'` }).join(\" or status eq \") + \") and \" : \"\" }}{{ severity && severity.length > 0 ? \"(severity eq \" + severity.map((m) => { return `'${m}'` }).join(\" or severity eq \") + \") and \" : \"\" }}{{ category ? \"(category eq \" + category.split(\",\").map(c => {return `'${c.trim()}'`}).join(\" or category eq \") + \") and \" : \"\"}}{{timeframe.enum !== \"none\" ? timeframeCol + \" ge \" + timeframe.start + \" and \" + timeframeCol + \" le \" + timeframe.end : \"1 eq 1\"}}" + } + ], + "pathToData": "value", + "headers": [] + }, + "providesPluginDiagnostics": true, + "manualConfigApply": true, + "rowPath": [], + "matches": [ + { + "sourceType": { + "type": "equals", + "value": "squaredup/data-source" + }, + "pluginId": { + "type": "equals", + "value": "plugin-bi89KMBtdXqKNJIwcn2N" + }, + "sourceId": { + "type": "equals", + "value": "config-4Y3oF35ZzEn8X2Gxq8we" + } + } + ], + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear" + ], + "tags": [ + "Alerts" + ], + "ui": [ + { + "name": "status", + "description": "Filter alerts by the specified status", + "label": "Status", + "type": "autocomplete", + "data": { + "source": "fixed", + "values": [ + { + "value": "Unknown", + "label": "Unknown" + }, + { + "value": "New", + "label": "New" + }, + { + "value": "InProgress", + "label": "InProgress" + }, + { + "value": "Resolved", + "label": "Resolved" + } + ] + }, + "isClearable": true + } + ] +} \ No newline at end of file From 03c6f1c4a72bdf2e9ed0960990e491f733a07447 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 15 May 2026 08:59:42 +0100 Subject: [PATCH 04/49] chore: add none timeframe to defender --- .../v1/dataStreams/alerts.json | 88 ++++++++++++++----- 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json index a10f9783..7363160e 100644 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json +++ b/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json @@ -1,6 +1,7 @@ { "name": "alerts", "displayName": "Alerts", + "supportsNoneTimeframe": true, "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", @@ -50,22 +51,7 @@ "providesPluginDiagnostics": true, "manualConfigApply": true, "rowPath": [], - "matches": [ - { - "sourceType": { - "type": "equals", - "value": "squaredup/data-source" - }, - "pluginId": { - "type": "equals", - "value": "plugin-bi89KMBtdXqKNJIwcn2N" - }, - "sourceId": { - "type": "equals", - "value": "config-4Y3oF35ZzEn8X2Gxq8we" - } - } - ], + "matches": "none", "timeframes": [ "last1hour", "last12hours", @@ -79,13 +65,16 @@ "lastQuarter", "lastYear" ], - "tags": [ - "Alerts" - ], + "tags": ["Alerts"], "ui": [ + { + "name": "category", + "label": "Category", + "placeholder": "Category1, Category2", + "type": "text" + }, { "name": "status", - "description": "Filter alerts by the specified status", "label": "Status", "type": "autocomplete", "data": { @@ -110,6 +99,63 @@ ] }, "isClearable": true + }, + { + "name": "severity", + "label": "Severity", + "type": "autocomplete", + "data": { + "source": "fixed", + "values": [ + { + "value": "UnSpecified", + "label": "Unspecified" + }, + { + "value": "Informational", + "label": "Informational" + }, + { + "value": "Low", + "label": "Low" + }, + { + "value": "Medium", + "label": "Medium" + }, + { + "value": "High", + "label": "High" + } + ] + }, + "isClearable": true + }, + { + "isMulti": false, + "help": "Select the column to apply the timeframe", + "data": { + "source": "fixed", + "values": [ + { + "value": "alertCreationTime", + "label": "Creation Time" + }, + { + "value": "lastUpdateTime", + "label": "Last Update Time" + }, + { + "value": "lastEventTime", + "label": "Last Event Time" + } + ] + }, + "defaultValue": "alertCreationTime", + "name": "timeframeCol", + "label": "Timeframe Column", + "type": "autocomplete", + "isClearable": false } ] -} \ No newline at end of file +} From 9f5145fce0bf7ac691958c5019a90881bb69b496 Mon Sep 17 00:00:00 2001 From: jame2O Date: Mon, 1 Jun 2026 07:57:20 +0100 Subject: [PATCH 05/49] feat: graph plugin --- .../v1/configValidation.json | 13 + .../MicrosoftDefender/v1/custom_types.json | 9 + .../v1/dataStreams/Vulnerabilities.json | 44 ++ .../v1/dataStreams/advancedHuntingQuery.json | 50 +++ .../v1/dataStreams/alerts.json | 143 ++++++ .../v1/dataStreams/devices.json | 64 +++ .../v1/dataStreams/incidents.json | 151 +++++++ .../v1/dataStreams/listDevices.json | 29 ++ .../v1/dataStreams/recommendations.json | 32 ++ .../v1/dataStreams/secureScoreHistory.json | 49 +++ .../v1/dataStreams/validation.json | 32 ++ .../Devices/deviceStatus.dash.json | 393 +++++++++++++++++ .../v1/defaultContent/Devices/manifest.json | 12 + .../defaultContent/Devices/overview.dash.json | 175 ++++++++ .../v1/defaultContent/cockpit.dash.json | 406 ++++++++++++++++++ .../v1/defaultContent/manifest.json | 20 + .../defaultContent/recommendations.dash.json | 291 +++++++++++++ .../v1/defaultContent/scopes.json | 29 ++ .../defaultContent/vulnerabilities.dash.json | 394 +++++++++++++++++ plugins/MicrosoftDefender/v1/icon.png | Bin 0 -> 67410 bytes .../v1/indexDefinitions/default.json | 29 ++ plugins/MicrosoftDefender/v1/metadata.json | 43 ++ plugins/MicrosoftDefender/v1/ui.json | 29 ++ 23 files changed, 2437 insertions(+) create mode 100644 plugins/MicrosoftDefender/v1/configValidation.json create mode 100644 plugins/MicrosoftDefender/v1/custom_types.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/alerts.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/devices.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/incidents.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/listDevices.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/recommendations.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/validation.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/manifest.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/scopes.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json create mode 100644 plugins/MicrosoftDefender/v1/icon.png create mode 100644 plugins/MicrosoftDefender/v1/indexDefinitions/default.json create mode 100644 plugins/MicrosoftDefender/v1/metadata.json create mode 100644 plugins/MicrosoftDefender/v1/ui.json diff --git a/plugins/MicrosoftDefender/v1/configValidation.json b/plugins/MicrosoftDefender/v1/configValidation.json new file mode 100644 index 00000000..d9c93aad --- /dev/null +++ b/plugins/MicrosoftDefender/v1/configValidation.json @@ -0,0 +1,13 @@ +{ + "steps": [ + { + "displayName": "API Access Test", + "dataStream": { + "name": "validation" + }, + "success": "Successfully connected to Endpoint", + "error": "Cannot access the Endpoint API - check your client ID & secret. Do you have the correct permissions set?", + "required": true + } + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/custom_types.json b/plugins/MicrosoftDefender/v1/custom_types.json new file mode 100644 index 00000000..23ac01b6 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/custom_types.json @@ -0,0 +1,9 @@ +[ + { + "name": "Defender Device", + "sourceType": "Defender Device", + "icon": "server", + "singular": "Device", + "plural": "Devices" + } +] \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json new file mode 100644 index 00000000..4e2a8a1d --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -0,0 +1,44 @@ +{ + "name": "Vulnerabilities", + "displayName": "Vulnerabilities", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "post", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "runHuntingQuery", + "postBody": { + "Query": "DeviceTvmSoftwareVulnerabilities | where DeviceId in ({{objects.map(o => {return `\"${o.deviceid}\"`}).join(\",\")}})", + "Timespan": "{{timeframe.enum != \"none\" ? `${timeframe.start}/${timeframe.end}` : \"\" }}" + }, + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "sourceId": "DeviceId", + "name": "DeviceName", + "shape": "string", + "role": "label", + "sourceType": "Defender Device" + }, + { + "pattern": ".*" + } + ], + "matches": { + "sourceType": { + "type": "equals", + "value": "Defender Device" + } + }, + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json b/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json new file mode 100644 index 00000000..e2053f53 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json @@ -0,0 +1,50 @@ +{ + "name": "advancedHuntingQuery", + "displayName": "Advanced Hunting Query", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "post", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "runHuntingQuery", + "postBody": { + "Query": "{{query}}", + "Timespan": "{{timeframe.enum != \"none\" ? `${timeframe.start}/${timeframe.end}` : \"\" }}" + }, + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear" + ], + "supportsNoneTimeframe": true, + "providesPluginDiagnostics": true, + "tags": [], + "ui": [ + { + "name": "query", + "language": "kusto", + "label": "Query", + "type": "code", + "validation": { + "required": true + } + } + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json new file mode 100644 index 00000000..993a4d62 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -0,0 +1,143 @@ +{ + "name": "alerts", + "displayName": "Alerts", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "nextUrl", + "pageSize": { + "realm": { + "value": "none", + "label": "none" + } + }, + "in": { + "realm": { + "value": "payload", + "label": "payload" + }, + "path": "@odata.nextLink" + } + }, + "expandInnerObjects": true, + "endpointPath": "alerts", + "pathToData": "value", + "getArgs": [ + { + "key": "$filter", + "value": "{{ status && status.length > 0 ? \"(status eq \" + status.map((m) => { return `'${m}'` }).join(\" or status eq \") + \") and \" : \"\" }}{{ severity && severity.length > 0 ? \"(severity eq \" + severity.map((m) => { return `'${m}'` }).join(\" or severity eq \") + \") and \" : \"\" }}{{timeframe.enum !== \"none\" ? timeframeCol + \" ge \" + timeframe.start + \" and \" + timeframeCol + \" le \" + timeframe.end : \"1 eq 1\"}}" + } + ], + "headers": [] + }, + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear" + ], + "supportsNoneTimeframe": true, + "providesPluginDiagnostics": true, + "tags": [], + "ui": [ + { + "name": "severity", + "label": "Severity", + "type": "autocomplete", + "data": { + "source": "fixed", + "values": [ + { + "value": "low", + "label": "Low" + }, + { + "value": "medium", + "label": "Medium" + }, + { + "value": "high", + "label": "High" + }, + { + "value": "informational", + "label": "Informational" + }, + { + "value": "unknown", + "label": "Unknown" + }, + { + "value": "unknownFutureValue", + "label": "Unknown Future Value" + } + ] + }, + "isClearable": true + }, + { + "name": "status", + "label": "Status", + "type": "autocomplete", + "data": { + "source": "fixed", + "values": [ + { + "value": "new", + "label": "New" + }, + { + "value": "inProgress", + "label": "In Progress" + }, + { + "value": "resolved", + "label": "Resolved" + }, + { + "value": "unknown", + "label": "Unknown" + }, + { + "value": "unknownFutureValue", + "label": "Unknown Future Value" + } + ] + }, + "isClearable": true + }, + { + "isMulti": false, + "help": "Select the column to apply the timeframe", + "data": { + "source": "fixed", + "values": [ + { + "value": "createdDateTime", + "label": "Creation Time" + }, + { + "value": "lastUpdateDateTime", + "label": "Last Update Time" + } + ] + }, + "defaultValue": "createdDateTime", + "name": "timeframeCol", + "label": "Timeframe Column", + "type": "autocomplete", + "isClearable": false + } + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json new file mode 100644 index 00000000..c1afcae8 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -0,0 +1,64 @@ +{ + "name": "devices", + "displayName": "Devices", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "post", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "runHuntingQuery", + "postBody": { + "Query": "DeviceInfo | where DeviceId in ({{objects.map(o => {return `\"${o.deviceid}\"`}).join(\",\")}}) | summarize arg_max(Timestamp, *) by DeviceId" + }, + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "metadata": [ + { + "sourceId": "DeviceId", + "name": "DeviceName", + "shape": "string", + "role": "label", + "sourceType": "Defender Device" + }, + { + "shape": [ + "state", + { + "map": { + "unmonitored": [], + "unknown": [], + "error": [ + "High" + ], + "warning": [ + "Medium" + ], + "success": [ + "Low" + ] + } + } + ], + "name": "ExposureLevel" + }, + { + "pattern": ".*" + } + ], + "matches": { + "sourceType": { + "type": "equals", + "value": "Defender Device" + } + }, + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json new file mode 100644 index 00000000..d95529ea --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json @@ -0,0 +1,151 @@ +{ + "name": "incidents", + "displayName": "Incidents", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "nextUrl", + "pageSize": { + "realm": { + "value": "none", + "label": "None" + } + }, + "in": { + "realm": { + "value": "payload", + "label": "Body" + }, + "path": "@odata.nextLink" + } + }, + "expandInnerObjects": true, + "endpointPath": "incidents", + "pathToData": "value", + "getArgs": [ + { + "key": "$filter", + "value": "{{ status && status.length > 0 ? \"(status eq \" + status.map((m) => { return `'${m}'` }).join(\" or status eq \") + \") and \" : \"\" }}{{ severity && severity.length > 0 ? \"(severity eq \" + severity.map((m) => { return `'${m}'` }).join(\" or severity eq \") + \") and \" : \"\" }}{{timeframe.enum !== \"none\" ? timeframeCol + \" ge \" + timeframe.start + \" and \" + timeframeCol + \" le \" + timeframe.end : \"1 eq 1\"}}" + } + ], + "headers": [] + }, + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear" + ], + "supportsNoneTimeframe": true, + "providesPluginDiagnostics": true, + "tags": [], + "ui": [ + { + "name": "severity", + "label": "Severity", + "type": "autocomplete", + "data": { + "source": "fixed", + "values": [ + { + "value": "low", + "label": "Low" + }, + { + "value": "medium", + "label": "Medium" + }, + { + "value": "high", + "label": "High" + }, + { + "value": "unknown", + "label": "Unknown" + }, + { + "value": "unknownFutureValue", + "label": "Unknown Future Value" + }, + { + "value": "new", + "label": "New" + }, + { + "value": "informational", + "label": "Informational" + } + ] + }, + "isClearable": true + }, + { + "name": "status", + "label": "Status", + "type": "autocomplete", + "data": { + "source": "fixed", + "values": [ + { + "value": "active", + "label": "Active" + }, + { + "value": "resolved", + "label": "Resolved" + }, + { + "value": "inProgress", + "label": "In Progress" + }, + { + "value": "redirected", + "label": "Redirected" + }, + { + "value": "unknownFutureValue", + "label": "Unknown Future Value" + }, + { + "value": "awaitingAction", + "label": "Awaiting Action" + } + ] + }, + "isClearable": true + }, + { + "isMulti": false, + "help": "Select the column to apply the timeframe", + "data": { + "source": "fixed", + "values": [ + { + "value": "createdDateTime", + "label": "Creation Time" + }, + { + "value": "lastUpdateDateTime", + "label": "Last Update Time" + } + ] + }, + "defaultValue": "createdDateTime", + "name": "timeframeCol", + "label": "Timeframe Column", + "type": "autocomplete", + "isClearable": false + } + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/listDevices.json b/plugins/MicrosoftDefender/v1/dataStreams/listDevices.json new file mode 100644 index 00000000..4cb0ffc5 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/listDevices.json @@ -0,0 +1,29 @@ +{ + "name": "listDevices", + "displayName": "List Devices", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "post", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "runHuntingQuery", + "postBody": { + "Query": "DeviceInfo | summarize arg_max(Timestamp, *) by DeviceId" + }, + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "providesPluginDiagnostics": true, + "manualConfigApply": true, + "timeframes": false, + "tags": [], + "visibility": { + "type": "hidden" + } +} diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json new file mode 100644 index 00000000..e4953fd7 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -0,0 +1,32 @@ +{ + "name": "recommendations", + "displayName": "Recommendations", + "baseDataSourceName": "httpRequestScoped", + "config": { + "httpMethod": "post", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "runHuntingQuery", + "postBody": { + "Query": "DeviceTvmSecureConfigurationAssessment | where DeviceId in ({{objects.map(o => {return `\"${o.deviceid}\"`}).join(\",\")}}) | join kind=leftouter (DeviceTvmSecureConfigurationAssessmentKB) on ConfigurationId | project DeviceId, DeviceName, Timestamp, ConfigurationId, ConfigurationName, ConfigurationCategory, ConfigurationSubcategory, ConfigurationImpact, RiskDescription, RemediationOptions, IsApplicable, IsCompliant, Tags", + "Timespan": "{{timeframe.enum != \"none\" ? `${timeframe.start}/${timeframe.end}` : \"\" }}" + }, + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "matches": { + "sourceType": { + "type": "equals", + "value": "Defender Device" + } + }, + "timeframes": false, + "providesPluginDiagnostics": true, + "tags": [] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json b/plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json new file mode 100644 index 00000000..07b03b15 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json @@ -0,0 +1,49 @@ +{ + "name": "secureScoreHistory", + "displayName": "Secure Score History", + "description": "Retrieves the current tenant's Secure Score data from the past 90 days", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "offset", + "pageSize": { + "realm": { + "value": "queryArg", + "label": "Query parameter" + }, + "path": "$top", + "value": "100" + }, + "offset": { + "rowCountIn": { + "realm": { + "value": "payloadArraySize", + "label": "Body array size" + }, + "path": "value" + }, + "mode": "row", + "base": "0" + }, + "out": { + "realm": { + "value": "queryArg", + "label": "queryArg" + }, + "path": "$skip" + } + }, + "expandInnerObjects": true, + "endpointPath": "secureScores", + "pathToData": "value", + "getArgs": [], + "headers": [] + }, + "providesPluginDiagnostics": true, + "timeframes": false, + "tags": [] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/validation.json b/plugins/MicrosoftDefender/v1/dataStreams/validation.json new file mode 100644 index 00000000..bc279031 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/validation.json @@ -0,0 +1,32 @@ +{ + "name": "validation", + "displayName": "Validation", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "alerts", + "pathToData": "value", + "getArgs": [ + { + "key": "$top", + "value": "1", + "needsEncryption": false + } + ], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "visibility": { + "type": "hidden" + }, + "options": { "noMatch": true } +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json new file mode 100644 index 00000000..82b0a2ab --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json @@ -0,0 +1,393 @@ +{ + "name": "Device Status", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 0, + "y": 0, + "i": "a42fe41f-7cbd-42d0-b32e-6d68eb4f016f", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Exposure Level", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "ExposureLevel", + "linkColumn": "DeviceName", + "labelColumn": "ExposureLevel[Expanded].rawState" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 1, + "y": 0, + "i": "b606fb70-4a88-4fdf-9a19-dded55059092", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devices", + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [ + "Inactive" + ], + "unmonitored": [], + "error": [ + "ImpairedCommunication", + "NoSensorData", + "Misconfigured" + ], + "success": [ + "Active" + ], + "unknown": [ + "Unknown" + ] + } + } + ], + "name": "SensorHealthState" + } + ], + "id": "{{dataStreams.devices}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Sensor Health State", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "SensorHealthState", + "linkColumn": "DeviceName", + "labelColumn": "SensorHealthState[Expanded].rawState" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 2, + "y": 3, + "i": "384ae7b5-a86c-46eb-aa43-02057f67f2f3", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Device Properties", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "DeviceId", + "PublicIP", + "ConnectivityType", + "OSPlatform", + "OSBuild", + "OSArchitecture", + "OSVersion", + "OSDistribution", + "OSVersionInfo", + "OsBuildRevision", + "ClientVersion", + "HardwareUuid" + ], + "hiddenColumns": [ + "@odata.context", + "mergedIntoMachineId", + "isPotentialDuplication", + "isExcluded", + "exclusionReason", + "firstSeen", + "lastSeen", + "healthStatus", + "deviceValue", + "rbacGroupId", + "rbacGroupName", + "riskScore", + "exposureLevel", + "isAadJoined", + "aadDeviceId", + "onboardingStatus", + "managedBy", + "managedByStatus", + "ipAddresses.0.ipAddress", + "ipAddresses.0.macAddress", + "ipAddresses.0.type", + "ipAddresses.0.operationalStatus", + "ipAddresses.1.ipAddress", + "ipAddresses.1.macAddress", + "ipAddresses.1.type", + "ipAddresses.1.operationalStatus", + "ipAddresses.2.ipAddress", + "ipAddresses.2.macAddress", + "ipAddresses.2.type", + "ipAddresses.2.operationalStatus", + "ipAddresses.3.ipAddress", + "ipAddresses.3.macAddress", + "ipAddresses.3.type", + "ipAddresses.3.operationalStatus", + "healthStatus[Expanded].rawState", + "computerDnsName", + "exposureLevel[Expanded].rawState", + "Timestamp", + "DeviceName", + "OSBuild@odata.type", + "IsAzureADJoined@odata.type", + "IsAzureADJoined", + "JoinType", + "AadDeviceId", + "LoggedOnUsers", + "RegistryDeviceTag", + "MachineGroup", + "ReportId@odata.type", + "ReportId", + "OnboardingStatus", + "AdditionalFields", + "DeviceCategory", + "DeviceType", + "DeviceSubtype", + "Model", + "Vendor", + "MergedDeviceIds", + "MergedToDeviceId", + "SensorHealthState", + "IsExcluded@odata.type", + "IsExcluded", + "ExclusionReason", + "ExposureLevel", + "AssetValue", + "DeviceManualTags", + "DeviceDynamicTags", + "CloudPlatforms", + "AzureVmId", + "AzureResourceId", + "AzureVmSubscriptionId", + "GcpFullResourceName", + "AwsResourceName", + "IsTransient@odata.type", + "IsTransient", + "HostDeviceId", + "MitigationStatus", + "FirmwareVersions", + "DiscoverySources", + "DlpInfo", + "ExposureLevel[Expanded].rawState" + ], + "transpose": true + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 4, + "x": 0, + "y": 3, + "i": "b0526c96-e0ea-4028-b44b-13c120e5ae83", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[Defender Device]}}" + ], + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}" + }, + "scope": { + "variable": "{{variables.[Defender Device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[Defender Devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Device Attributes", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "DeviceId", + "PublicIP", + "ConnectivityType", + "OSPlatform", + "OSBuild", + "OSArchitecture", + "OSVersion", + "OSDistribution", + "OSVersionInfo", + "OsBuildRevision", + "ClientVersion", + "HardwareUuid" + ], + "hiddenColumns": [ + "@odata.context", + "mergedIntoMachineId", + "isPotentialDuplication", + "isExcluded", + "exclusionReason", + "firstSeen", + "lastSeen", + "healthStatus", + "deviceValue", + "rbacGroupId", + "rbacGroupName", + "riskScore", + "exposureLevel", + "isAadJoined", + "aadDeviceId", + "onboardingStatus", + "managedBy", + "managedByStatus", + "ipAddresses.0.ipAddress", + "ipAddresses.0.macAddress", + "ipAddresses.0.type", + "ipAddresses.0.operationalStatus", + "ipAddresses.1.ipAddress", + "ipAddresses.1.macAddress", + "ipAddresses.1.type", + "ipAddresses.1.operationalStatus", + "ipAddresses.2.ipAddress", + "ipAddresses.2.macAddress", + "ipAddresses.2.type", + "ipAddresses.2.operationalStatus", + "ipAddresses.3.ipAddress", + "ipAddresses.3.macAddress", + "ipAddresses.3.type", + "ipAddresses.3.operationalStatus", + "healthStatus[Expanded].rawState", + "computerDnsName", + "exposureLevel[Expanded].rawState", + "Timestamp", + "DeviceName", + "OSBuild@odata.type", + "IsAzureADJoined@odata.type", + "IsAzureADJoined", + "JoinType", + "AadDeviceId", + "LoggedOnUsers", + "RegistryDeviceTag", + "MachineGroup", + "ReportId@odata.type", + "ReportId", + "OnboardingStatus", + "AdditionalFields", + "DeviceCategory", + "DeviceType", + "DeviceSubtype", + "Model", + "Vendor", + "MergedDeviceIds", + "MergedToDeviceId", + "SensorHealthState", + "IsExcluded@odata.type", + "IsExcluded", + "ExclusionReason", + "ExposureLevel", + "AssetValue", + "DeviceManualTags", + "DeviceDynamicTags", + "CloudPlatforms", + "AzureVmId", + "AzureResourceId", + "AzureVmSubscriptionId", + "GcpFullResourceName", + "AwsResourceName", + "IsTransient@odata.type", + "IsTransient", + "HostDeviceId", + "MitigationStatus", + "FirmwareVersions", + "DiscoverySources", + "DlpInfo", + "ExposureLevel[Expanded].rawState" + ], + "transpose": true + } + } + } + } + } + ], + "version": 28, + "columns": 4 + }, + "variables": [ + "{{variables.[Defender Device]}}" + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json new file mode 100644 index 00000000..4b56ba1b --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json @@ -0,0 +1,12 @@ +{ + "items": [ + { + "name": "overview", + "type": "dashboard" + }, + { + "name": "deviceStatus", + "type": "dashboard" + } + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json new file mode 100644 index 00000000..0cba9bd7 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json @@ -0,0 +1,175 @@ +{ + "name": "Overview", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 4, + "moved": false, + "h": 3, + "x": 0, + "y": 0, + "i": "a42fe41f-7cbd-42d0-b32e-6d68eb4f016f", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}", + "sort": { + "by": [ + [ + "ExposureLevel", + "desc" + ] + ] + } + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Exposure Level", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "ExposureLevel", + "linkColumn": "DeviceName", + "sublabel": "ExposureLevel[Expanded].rawState", + "columns": 3, + "labelColumn": "DeviceName" + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 4, + "x": 0, + "y": 3, + "i": "e5ec8d5c-4184-46cb-8c61-94913be88729", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "name": "devices", + "filter": { + "multiOperation": "and", + "filters": [] + }, + "id": "{{dataStreams.devices}}", + "sort": { + "by": [ + [ + "DeviceName", + "asc" + ] + ] + } + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Properties", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "DeviceId", + "Timestamp", + "DeviceName", + "ClientVersion", + "PublicIP", + "OSArchitecture", + "OSPlatform", + "OSBuild@odata.type", + "OSBuild", + "IsAzureADJoined@odata.type", + "IsAzureADJoined", + "JoinType", + "AadDeviceId", + "LoggedOnUsers", + "RegistryDeviceTag", + "OSVersion", + "MachineGroup", + "ReportId@odata.type", + "ReportId", + "OnboardingStatus", + "AdditionalFields", + "DeviceCategory", + "DeviceType", + "DeviceSubtype", + "Model", + "Vendor", + "OSDistribution", + "OSVersionInfo", + "MergedDeviceIds", + "MergedToDeviceId", + "SensorHealthState", + "IsExcluded@odata.type", + "IsExcluded", + "ExclusionReason", + "ExposureLevel", + "AssetValue", + "DeviceManualTags", + "DeviceDynamicTags", + "HardwareUuid", + "CloudPlatforms", + "AzureVmId", + "AzureResourceId", + "AzureVmSubscriptionId", + "GcpFullResourceName", + "AwsResourceName", + "IsTransient@odata.type", + "IsTransient", + "OsBuildRevision", + "HostDeviceId", + "MitigationStatus", + "ConnectivityType", + "DiscoverySources", + "FirmwareVersions", + "DlpInfo", + "IsInternetFacing@odata.type", + "IsInternetFacing", + "ExposureLevel[Expanded].rawState" + ], + "hiddenColumns": [] + } + } + } + } + } + ], + "version": 22, + "columns": 4 + }, + "variables": [ + "{{variables.[All Object]}}" + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json new file mode 100644 index 00000000..5346e993 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json @@ -0,0 +1,406 @@ +{ + "name": "Cockpit", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 2, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "7a6ca038-e744-488e-8f2f-ad3d86b4e42d", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "secureScoreHistory", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "createdDateTime", + "unit": "days", + "operation": "datewithinlast", + "value": "1" + } + ] + }, + "id": "{{dataStreams.secureScoreHistory}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Current Secure Score", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "currentScore", + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "bc314cab-b69a-4379-920a-872a3b005c66", + "z": 0, + "config": { + "dataStream": { + "pluginConfigId": "{{configId}}", + "id": "{{dataStreams.devices}}", + "group": { + "by": [ + [ + "ExposureLevel", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + } + }, + "scope": { + "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"Defender Device\")).limit(500)", + "bindings": {}, + "queryDetail": {} + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Device Exposure State", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "ExposureLevel_uniqueValues", + "showTotals": true, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": false, + "yAxisData": [ + "count" + ], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 2, + "i": "fe0118a8-d043-4bb4-9907-10b1b29cd486", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\r\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\r\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitor": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Malware & Antivirus Detected", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": {} + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 2, + "i": "cf2d60f6-b7cf-4602-bd3c-70f1ef215514", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\r\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\r\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitor": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Persistence & Privilege Escalation", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 2, + "i": "cf1f3273-caa3-4b96-9e1f-b70c8a207214", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\r\n| where ActionType startswith \"AppControl\"\r\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitor": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Application Control", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 2, + "i": "21756e83-fc0c-47a8-98f7-7e96e765662b", + "z": 0, + "config": { + "timeframe": "last24hours", + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\r\n| where ActionType in (\"ExploitGuardNetworkProtectionBlocked\",\"ExploitGuardNonMicrosoftSignedBlocked\")\r\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitor": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "__group_by_none__", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Exploits", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 2, + "x": 0, + "y": 4, + "i": "5c32f4c0-9729-42dd-b3c4-c057f9547092", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "secureScoreHistory", + "id": "{{dataStreams.secureScoreHistory}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Secure Score History", + "visualisation": { + "type": "data-stream-line-graph", + "config": { + "data-stream-line-graph": { + "yAxisLabel": "Secure Score", + "xAxisColumn": "createdDateTime", + "seriesColumn": "none", + "xAxisLabel": "Date", + "dataPoints": false, + "showTrendLine": true, + "yAxisRangeMode": "auto", + "yAxisColumn": [ + "currentScore" + ] + } + } + } + } + } + ], + "version": 49, + "columns": 4 + } +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/manifest.json b/plugins/MicrosoftDefender/v1/defaultContent/manifest.json new file mode 100644 index 00000000..571fefef --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/manifest.json @@ -0,0 +1,20 @@ +{ + "items": [ + { + "name": "cockpit", + "type": "dashboard" + }, + { + "name": "recommendations", + "type": "dashboard" + }, + { + "name": "vulnerabilities", + "type": "dashboard" + }, + { + "name": "Devices", + "type": "folder" + } + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json new file mode 100644 index 00000000..0d813fa2 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json @@ -0,0 +1,291 @@ +{ + "name": "Recommendations", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "x": 0, + "h": 2, + "y": 0, + "i": "777d4030-bbb1-4d20-a362-eef301140a35", + "z": 0, + "config": { + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "pluginConfigId": "{{configId}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "IsCompliant", + "operation": "equals", + "value": "0" + }, + { + "column": "IsApplicable", + "operation": "equals", + "value": "1" + } + ] + }, + "id": "{{dataStreams.recommendations}}" + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Active", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "x": 1, + "h": 2, + "y": 0, + "i": "30f6f706-cd44-4396-be7c-e0ca3c7999a7", + "z": 0, + "config": { + "dataStream": { + "pluginConfigId": "{{configId}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "IsCompliant", + "operation": "equals", + "value": "0" + }, + { + "column": "IsApplicable", + "operation": "equals", + "value": "1" + } + ] + }, + "id": "{{dataStreams.recommendations}}", + "group": { + "by": [ + [ + "ConfigurationCategory", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + } + }, + "scope": { + "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"Defender Device\")).limit(500)", + "bindings": {}, + "queryDetail": {} + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Category", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "count", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table", + "labelColumn": "ConfigurationCategory_uniqueValues" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "x": 2, + "h": 2, + "y": 0, + "i": "d2e6be29-4c2d-4cb6-8954-ce4d87c94f10", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "name": "recommendations", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "IsApplicable", + "operation": "equals", + "value": "1" + }, + { + "column": "IsCompliant", + "operation": "equals", + "value": "0" + } + ] + }, + "id": "{{dataStreams.recommendations}}", + "group": { + "by": [ + [ + "ConfigurationImpact", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + } + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "description": "On active recommendations", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Configuration Impact (Severity Score)", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "ConfigurationImpact_uniqueValues", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": false, + "yAxisData": [], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 3, + "moved": false, + "x": 0, + "h": 4, + "y": 2, + "i": "a501edac-6ed8-4835-a64c-a7579937f16a", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "name": "recommendations", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "IsApplicable", + "operation": "equals", + "value": "1" + }, + { + "column": "IsCompliant", + "operation": "equals", + "value": "0" + } + ] + }, + "id": "{{dataStreams.recommendations}}" + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "List", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "DeviceId", + "DeviceName", + "Timestamp", + "ConfigurationId", + "ConfigurationName", + "ConfigurationCategory", + "ConfigurationSubcategory", + "RiskDescription", + "RemediationOptions", + "IsApplicable@odata.type", + "IsApplicable", + "IsCompliant@odata.type", + "IsCompliant" + ], + "hiddenColumns": [] + } + } + } + } + } + ], + "version": 42, + "columns": 3 + }, + "variables": [ + "{{variables.[All Object]}}" + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/scopes.json b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json new file mode 100644 index 00000000..7e8fa0bb --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json @@ -0,0 +1,29 @@ +[ + { + "name": "All Objects", + "matches": "all", + "variable": { + "name": "All Object", + "type": "object", + "default": "all", + "allowMultipleSelection": false + } + }, + { + "name": "Defender Devices", + "matches": { + "sourceType": { + "type": "oneOf", + "values": [ + "Defender Device" + ] + } + }, + "variable": { + "name": "Defender Device", + "type": "object", + "default": "none", + "allowMultipleSelection": false + } + } +] \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json new file mode 100644 index 00000000..6fdee491 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json @@ -0,0 +1,394 @@ +{ + "name": "Vulnerabilities", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 0, + "y": 0, + "i": "7c498c96-9efb-46fd-8b06-9d0970b51b45", + "z": 0, + "config": { + "timeframe": "last24hours", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "pluginConfigId": "{{configId}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "VulnerabilitySeverityLevel", + "operation": "equals", + "value": "Critical" + } + ] + }, + "id": "{{dataStreams.Vulnerabilities}}" + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "description": "", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "DeviceName", + "frequency": 15 + }, + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Critical", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 1, + "y": 0, + "i": "7a35db77-a19d-4b51-9712-f45e6cfe0004", + "z": 0, + "config": { + "timeframe": "last24hours", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "pluginConfigId": "{{configId}}", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "VulnerabilitySeverityLevel", + "operation": "equals", + "value": "High" + } + ] + }, + "id": "{{dataStreams.Vulnerabilities}}" + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "DeviceName", + "frequency": 15 + }, + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "High", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 2, + "y": 0, + "i": "ecca69a0-eb1c-4433-8ba7-e90cad89d561", + "z": 0, + "config": { + "timeframe": "last24hours", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "pluginConfigId": "{{configId}}", + "filter": { + "multiOperation": "and", + "filters": [] + }, + "id": "{{dataStreams.Vulnerabilities}}" + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "DeviceName", + "frequency": 15 + }, + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Software", + "visualisation": { + "type": "data-stream-donut-chart", + "config": { + "data-stream-donut-chart": { + "valueColumn": "builtin_count_by_label", + "hideCenterValue": false, + "showValuesAsPercentage": false, + "legendPosition": "right", + "legendMode": "table", + "labelColumn": "SoftwareName" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 3, + "y": 0, + "i": "b0385f1f-3367-4721-83cd-b3dc44a0734f", + "z": 0, + "config": { + "timeframe": "last24hours", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "pluginConfigId": "{{configId}}", + "filter": { + "multiOperation": "and", + "filters": [] + }, + "id": "{{dataStreams.Vulnerabilities}}", + "group": { + "by": [ + [ + "VulnerabilitySeverityLevel", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + } + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "monitorOld": { + "tileRollsUp": true, + "monitorType": "threshold", + "condition": { + "columns": [], + "logic": { + "if": [ + { + ">": [ + { + "var": "count" + }, + 0 + ] + }, + "error" + ] + } + }, + "_type": "simple", + "aggregation": "count", + "groupBy": "DeviceName", + "frequency": 15 + }, + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Severity", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "VulnerabilitySeverityLevel_uniqueValues", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": false, + "yAxisData": [ + "count" + ], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 4, + "moved": false, + "h": 3, + "x": 0, + "y": 3, + "i": "eb36c383-0ca3-4d60-8e0d-c09c0ec2e6d8", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[All Object]}}" + ], + "dataStream": { + "name": "Vulnerabilities", + "id": "{{dataStreams.Vulnerabilities}}" + }, + "scope": { + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "List", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "CveId", + "VulnerabilitySeverityLevel", + "DeviceId", + "SoftwareVendor", + "SoftwareName", + "SoftwareVersion", + "RecommendedSecurityUpdateId" + ], + "hiddenColumns": [ + "DeviceName", + "OSPlatform", + "OSVersion", + "OSArchitecture", + "AadDeviceId", + "RecommendedSecurityUpdate", + "CveTags@odata.type", + "CveMitigationStatus" + ] + } + } + } + } + } + ], + "version": 42, + "columns": 4 + }, + "variables": [ + "{{variables.[All Object]}}" + ] +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/icon.png b/plugins/MicrosoftDefender/v1/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a34e4d4285d6a0653f947dbba6c6bc2d8a9988c5 GIT binary patch literal 67410 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 Date: Mon, 1 Jun 2026 07:57:42 +0100 Subject: [PATCH 06/49] chore: delete old plugin --- .../v1/configValidation.json | 13 - .../v1/dataStreams/advancedHuntingQuery.json | 52 -- .../v1/dataStreams/alerts.json | 161 ------ .../v1/dataStreams/deviceSecureStore.json | 24 - .../v1/dataStreams/devicesNew.json | 84 --- .../v1/dataStreams/exposureScore.json | 24 - .../v1/dataStreams/listDevices.json | 42 -- .../v1/dataStreams/listRecommendations.json | 25 - .../v1/dataStreams/listVulnerabilities.json | 26 - .../v1/dataStreams/validation.json | 32 -- .../Devices/deviceStatus.dash.json | 378 -------------- .../v1/defaultContent/Devices/manifest.json | 12 - .../defaultContent/Devices/overview.dash.json | 197 ------- .../v1/defaultContent/cockpit.dash.json | 494 ------------------ .../v1/defaultContent/manifest.json | 20 - .../defaultContent/recommendations.dash.json | 442 ---------------- .../v1/defaultContent/scopes.json | 19 - .../defaultContent/vulnerabilities.dash.json | 231 -------- .../Microsoft Defender (Preview)/v1/icon.png | Bin 67410 -> 0 bytes .../v1/indexDefinitions/default.json | 31 -- .../v1/metadata.json | 46 -- .../Microsoft Defender (Preview)/v1/ui.json | 29 - 22 files changed, 2382 deletions(-) delete mode 100644 plugins/Microsoft Defender (Preview)/v1/configValidation.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/icon.png delete mode 100644 plugins/Microsoft Defender (Preview)/v1/indexDefinitions/default.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/metadata.json delete mode 100644 plugins/Microsoft Defender (Preview)/v1/ui.json diff --git a/plugins/Microsoft Defender (Preview)/v1/configValidation.json b/plugins/Microsoft Defender (Preview)/v1/configValidation.json deleted file mode 100644 index d9c93aad..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/configValidation.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "steps": [ - { - "displayName": "API Access Test", - "dataStream": { - "name": "validation" - }, - "success": "Successfully connected to Endpoint", - "error": "Cannot access the Endpoint API - check your client ID & secret. Do you have the correct permissions set?", - "required": true - } - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json deleted file mode 100644 index df4d4788..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/advancedHuntingQuery.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "advancedHuntingQuery", - "displayName": "Advanced Hunting Query", - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "post", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "pathToData": "Results", - "endpointPath": "/api/advancedqueries/run", - "postBody": { - "Query": "{{query}}" - }, - "getArgs": [], - "headers": [] - }, - "matches": "none", - "timeframes": [ - "last1hour", - "last12hours", - "last24hours", - "last7days", - "last30days", - "thisMonth", - "thisQuarter", - "thisYear", - "lastMonth", - "lastQuarter", - "lastYear" - ], - "providesPluginDiagnostics": true, - "tags": [ - "KQL", - "Advanced Hunting" - ], - "ui": [ - { - "name": "query", - "language": "kusto", - "label": "Query", - "type": "code", - "validation": { - "required": true - } - } - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json deleted file mode 100644 index 7363160e..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/alerts.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "name": "alerts", - "displayName": "Alerts", - "supportsNoneTimeframe": true, - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "offset", - "pageSize": { - "realm": { - "value": "queryArg", - "label": "Query parameter" - }, - "path": "$top", - "value": "100" - }, - "offset": { - "rowCountIn": { - "realm": { - "value": "payloadArraySize", - "label": "Body array size" - }, - "path": "value" - }, - "mode": "row", - "base": "0" - }, - "out": { - "realm": { - "value": "queryArg", - "label": "queryArg" - }, - "path": "$skip" - } - }, - "expandInnerObjects": true, - "endpointPath": "api/alerts", - "getArgs": [ - { - "key": "$filter", - "value": "{{ status && status.length > 0 ? \"(status eq \" + status.map((m) => { return `'${m}'` }).join(\" or status eq \") + \") and \" : \"\" }}{{ severity && severity.length > 0 ? \"(severity eq \" + severity.map((m) => { return `'${m}'` }).join(\" or severity eq \") + \") and \" : \"\" }}{{ category ? \"(category eq \" + category.split(\",\").map(c => {return `'${c.trim()}'`}).join(\" or category eq \") + \") and \" : \"\"}}{{timeframe.enum !== \"none\" ? timeframeCol + \" ge \" + timeframe.start + \" and \" + timeframeCol + \" le \" + timeframe.end : \"1 eq 1\"}}" - } - ], - "pathToData": "value", - "headers": [] - }, - "providesPluginDiagnostics": true, - "manualConfigApply": true, - "rowPath": [], - "matches": "none", - "timeframes": [ - "last1hour", - "last12hours", - "last24hours", - "last7days", - "last30days", - "thisMonth", - "thisQuarter", - "thisYear", - "lastMonth", - "lastQuarter", - "lastYear" - ], - "tags": ["Alerts"], - "ui": [ - { - "name": "category", - "label": "Category", - "placeholder": "Category1, Category2", - "type": "text" - }, - { - "name": "status", - "label": "Status", - "type": "autocomplete", - "data": { - "source": "fixed", - "values": [ - { - "value": "Unknown", - "label": "Unknown" - }, - { - "value": "New", - "label": "New" - }, - { - "value": "InProgress", - "label": "InProgress" - }, - { - "value": "Resolved", - "label": "Resolved" - } - ] - }, - "isClearable": true - }, - { - "name": "severity", - "label": "Severity", - "type": "autocomplete", - "data": { - "source": "fixed", - "values": [ - { - "value": "UnSpecified", - "label": "Unspecified" - }, - { - "value": "Informational", - "label": "Informational" - }, - { - "value": "Low", - "label": "Low" - }, - { - "value": "Medium", - "label": "Medium" - }, - { - "value": "High", - "label": "High" - } - ] - }, - "isClearable": true - }, - { - "isMulti": false, - "help": "Select the column to apply the timeframe", - "data": { - "source": "fixed", - "values": [ - { - "value": "alertCreationTime", - "label": "Creation Time" - }, - { - "value": "lastUpdateTime", - "label": "Last Update Time" - }, - { - "value": "lastEventTime", - "label": "Last Event Time" - } - ] - }, - "defaultValue": "alertCreationTime", - "name": "timeframeCol", - "label": "Timeframe Column", - "type": "autocomplete", - "isClearable": false - } - ] -} diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json deleted file mode 100644 index d6d809bb..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/deviceSecureStore.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "deviceSecureStore", - "displayName": "Device Secure Score", - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "endpointPath": "/api/configurationScore", - "getArgs": [], - "headers": [] - }, - "matches": "none", - "timeframes": false, - "providesPluginDiagnostics": true, - "tags": [ - "Device" - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json deleted file mode 100644 index a9822366..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/devicesNew.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "devicesNew", - "displayName": "Devices", - "baseDataSourceName": "httpRequestScopedSingle", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "endpointPath": "api/machines/{{object.deviceid}}", - "getArgs": [], - "headers": [] - }, - "metadata": [ - { - "sourceId": "id", - "name": "computerDnsName", - "shape": "string", - "role": "label", - "sourceType": "defender-device" - }, - { - "shape": [ - "state", - { - "map": { - "unmonitored": [], - "unknown": [ - "Unknown", - "Inactive" - ], - "error": [ - "ImpairedCommunication", - "NoSensorDataImpairedCommunication", - "NoSensorData" - ], - "warning": [], - "success": [ - "Active" - ] - } - } - ], - "name": "healthStatus" - }, - { - "shape": [ - "state", - { - "map": { - "unmonitored": [], - "unknown": [], - "error": [ - "High" - ], - "warning": [ - "Medium" - ], - "success": [ - "Low" - ] - } - } - ], - "name": "exposureLevel" - }, - { - "pattern": ".*" - } - ], - "matches": { - "sourceType": { - "type": "equals", - "value": "defender-device" - } - }, - "timeframes": false, - "providesPluginDiagnostics": true, - "tags": [] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json deleted file mode 100644 index 0605c999..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/exposureScore.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "exposureScore", - "displayName": "Device Exposure Score", - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "endpointPath": "api/exposurescore", - "getArgs": [], - "headers": [] - }, - "matches": "none", - "timeframes": false, - "providesPluginDiagnostics": true, - "tags": [ - "Device" - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json deleted file mode 100644 index 00a2a450..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listDevices.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "listDevices", - "displayName": "List Devices", - "description": "", - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "endpointPath": "api/machines", - "pathToData": "value", - "getArgs": [], - "headers": [] - }, - "matches": [ - { - "sourceType": { - "type": "equals", - "value": "squaredup/data-source" - }, - "pluginId": { - "type": "equals", - "value": "plugin-bi89KMBtdXqKNJIwcn2N" - }, - "sourceId": { - "type": "equals", - "value": "config-TPvNIMMPMu4LhSro2Rk7" - } - } - ], - "providesPluginDiagnostics": true, - "timeframes": false, - "tags": [], - "visibility": { - "type": "hidden" - } -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json deleted file mode 100644 index c18f891a..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listRecommendations.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "listRecommendations", - "displayName": "Recommendations", - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "endpointPath": "api/recommendations", - "pathToData": "value", - "getArgs": [], - "headers": [] - }, - "matches": "none", - "timeframes": false, - "providesPluginDiagnostics": true, - "tags": [ - "Recommendations" - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json deleted file mode 100644 index 0d9750da..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/listVulnerabilities.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "listVulnerabilities", - "displayName": "Vulnerabilities", - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "endpointPath": "api/vulnerabilities/machinesVulnerabilities", - "pathToData": "value", - "getArgs": [], - "headers": [] - }, - "matches": "none", - "timeframes": false, - "providesPluginDiagnostics": true, - "tags": [ - "Machines", - "Vulnerabilities" - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json b/plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json deleted file mode 100644 index 54ca99f1..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/dataStreams/validation.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "validation", - "displayName": "Validation", - "baseDataSourceName": "httpRequestUnscoped", - "config": { - "httpMethod": "get", - "errorHandling": { - "type": "default" - }, - "paging": { - "mode": "none" - }, - "expandInnerObjects": true, - "endpointPath": "api/alerts", - "pathToData": "value", - "getArgs": [ - { - "key": "$top", - "value": "1", - "needsEncryption": false - } - ], - "headers": [] - }, - "matches": "none", - "timeframes": false, - "providesPluginDiagnostics": true, - "visibility": { - "type": "hidden" - }, - "options": { "noMatch": true } -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json deleted file mode 100644 index 7133c368..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/deviceStatus.dash.json +++ /dev/null @@ -1,378 +0,0 @@ -{ - "name": "Device Status", - "schemaVersion": "1.5", - "dashboard": { - "_type": "layout/grid", - "contents": [ - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 0, - "y": 0, - "i": "6038c7ef-4b3b-484d-bfda-94d509b4517d", - "z": 0, - "config": { - "variables": [ - "{{variables.[Defender Device]}}" - ], - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}" - }, - "scope": { - "variable": "{{variables.[Defender Device]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Exposure Level", - "visualisation": { - "type": "data-stream-blocks", - "config": { - "data-stream-blocks": { - "stateColumn": "exposureLevel", - "linkColumn": "none", - "labelColumn": "exposureLevel[Expanded].rawState" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 1, - "y": 0, - "i": "c5c507d9-02c0-44f1-adfb-d39aaac0ba22", - "z": 0, - "config": { - "variables": [ - "{{variables.[Defender Device]}}" - ], - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}" - }, - "scope": { - "variable": "{{variables.[Defender Device]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Health Status (Sensor)", - "visualisation": { - "type": "data-stream-blocks", - "config": { - "data-stream-blocks": { - "stateColumn": "healthStatus", - "linkColumn": "none", - "labelColumn": "healthStatus[Expanded].rawState" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 2, - "y": 0, - "i": "5c51849e-01ae-4319-8505-f89854815182", - "z": 0, - "config": { - "variables": [ - "{{variables.[Defender Device]}}" - ], - "dataStream": { - "name": "devicesNew", - "metadata": [ - { - "shape": [ - "state", - { - "map": { - "warning": [], - "unmonitored": [], - "error": [ - "Down" - ], - "success": [ - "Up" - ], - "unknown": [] - } - } - ], - "name": "ipAddresses.0.operationalStatus" - } - ], - "id": "{{dataStreams.devicesNew}}" - }, - "scope": { - "variable": "{{variables.[Defender Device]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Network Operational Status", - "visualisation": { - "type": "data-stream-blocks", - "config": { - "data-stream-blocks": { - "stateColumn": "ipAddresses.0.operationalStatus", - "linkColumn": "none", - "labelColumn": "ipAddresses.0.operationalStatus[Expanded].rawState" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 3, - "y": 0, - "i": "76485e06-c17a-4239-bf23-561ae12ceaa4", - "z": 0, - "config": { - "variables": [ - "{{variables.[Defender Device]}}" - ], - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}" - }, - "scope": { - "variable": "{{variables.[Defender Device]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Risk Score", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": "riskScore", - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 2, - "moved": false, - "h": 4, - "x": 0, - "y": 3, - "i": "0c276a67-d530-42a2-86a9-8aeb613372ac", - "z": 0, - "config": { - "variables": [ - "{{variables.[Defender Device]}}" - ], - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}" - }, - "scope": { - "variable": "{{variables.[Defender Device]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Device Attributes", - "visualisation": { - "type": "data-stream-table", - "config": { - "data-stream-table": { - "columnOrder": [ - "mergedIntoMachineId", - "isPotentialDuplication", - "isExcluded", - "exclusionReason", - "firstSeen", - "lastSeen", - "agentVersion", - "deviceValue", - "rbacGroupId", - "rbacGroupName", - "isAadJoined", - "aadDeviceId", - "onboardingStatus", - "managedBy", - "managedByStatus" - ], - "hiddenColumns": [ - "@odata.context", - "computerDnsName", - "osPlatform", - "osProcessor", - "version", - "lastIpAddress", - "lastExternalIpAddress", - "osBuild", - "healthStatus", - "riskScore", - "exposureLevel", - "osArchitecture", - "ipAddresses.0.ipAddress", - "ipAddresses.0.macAddress", - "ipAddresses.0.type", - "ipAddresses.0.operationalStatus", - "ipAddresses.1.ipAddress", - "ipAddresses.1.macAddress", - "ipAddresses.1.type", - "ipAddresses.1.operationalStatus", - "ipAddresses.2.ipAddress", - "ipAddresses.2.macAddress", - "ipAddresses.2.type", - "ipAddresses.2.operationalStatus", - "ipAddresses.3.ipAddress", - "ipAddresses.3.macAddress", - "ipAddresses.3.type", - "ipAddresses.3.operationalStatus", - "healthStatus[Expanded].rawState", - "exposureLevel[Expanded].rawState", - "id", - "vmMetadata.vmId", - "vmMetadata.cloudProvider", - "vmMetadata.resourceId", - "vmMetadata.subscriptionId" - ], - "transpose": true - } - } - } - } - }, - { - "static": false, - "w": 2, - "moved": false, - "h": 4, - "x": 2, - "y": 3, - "i": "d815528c-6c58-4e27-b390-d95f070fa1a4", - "z": 0, - "config": { - "variables": [ - "{{variables.[Defender Device]}}" - ], - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}" - }, - "scope": { - "variable": "{{variables.[Defender Device]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Devices Properties", - "visualisation": { - "type": "data-stream-table", - "config": { - "data-stream-table": { - "columnOrder": [ - "osPlatform", - "osProcessor", - "version", - "lastIpAddress", - "lastExternalIpAddress", - "agentVersion", - "osBuild", - "osArchitecture", - "vmMetadata.cloudProvider", - "vmMetadata.resourceId", - "vmMetadata.subscriptionId", - "id", - "vmMetadata.vmId" - ], - "hiddenColumns": [ - "@odata.context", - "mergedIntoMachineId", - "isPotentialDuplication", - "isExcluded", - "exclusionReason", - "firstSeen", - "lastSeen", - "healthStatus", - "deviceValue", - "rbacGroupId", - "rbacGroupName", - "riskScore", - "exposureLevel", - "isAadJoined", - "aadDeviceId", - "onboardingStatus", - "managedBy", - "managedByStatus", - "ipAddresses.0.ipAddress", - "ipAddresses.0.macAddress", - "ipAddresses.0.type", - "ipAddresses.0.operationalStatus", - "ipAddresses.1.ipAddress", - "ipAddresses.1.macAddress", - "ipAddresses.1.type", - "ipAddresses.1.operationalStatus", - "ipAddresses.2.ipAddress", - "ipAddresses.2.macAddress", - "ipAddresses.2.type", - "ipAddresses.2.operationalStatus", - "ipAddresses.3.ipAddress", - "ipAddresses.3.macAddress", - "ipAddresses.3.type", - "ipAddresses.3.operationalStatus", - "healthStatus[Expanded].rawState", - "computerDnsName", - "exposureLevel[Expanded].rawState" - ], - "transpose": true - } - } - } - } - } - ], - "version": 124, - "columns": 4 - }, - "variables": [ - "{{variables.[Defender Device]}}" - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json deleted file mode 100644 index 4b56ba1b..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/manifest.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "items": [ - { - "name": "overview", - "type": "dashboard" - }, - { - "name": "deviceStatus", - "type": "dashboard" - } - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json deleted file mode 100644 index 7cae0d3e..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/Devices/overview.dash.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "name": "Overview", - "schemaVersion": "1.5", - "dashboard": { - "_type": "layout/grid", - "contents": [ - { - "static": false, - "w": 2, - "moved": false, - "h": 3, - "x": 0, - "y": 0, - "i": "29387eac-2ed1-4862-bbb1-c7a23079733e", - "z": 0, - "config": { - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}", - "sort": { - "by": [ - [ - "exposureLevel", - "desc" - ] - ] - } - }, - "scope": { - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Exposure Level", - "visualisation": { - "type": "data-stream-blocks", - "config": { - "data-stream-blocks": { - "stateColumn": "exposureLevel", - "linkColumn": "computerDnsName", - "sublabel": "exposureLevel[Expanded].rawState", - "columns": 1, - "labelColumn": "computerDnsName" - } - } - } - } - }, - { - "static": false, - "w": 2, - "moved": false, - "h": 3, - "x": 2, - "y": 0, - "i": "395663f6-9e18-4837-89ec-6013d3e85493", - "z": 0, - "config": { - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}", - "sort": { - "by": [ - [ - "healthStatus", - "desc" - ] - ] - } - }, - "scope": { - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Health Status (Sensor)", - "visualisation": { - "type": "data-stream-blocks", - "config": { - "data-stream-blocks": { - "stateColumn": "healthStatus", - "linkColumn": "computerDnsName", - "sublabel": "healthStatus[Expanded].rawState", - "columns": 1, - "labelColumn": "computerDnsName" - } - } - } - } - }, - { - "static": false, - "w": 4, - "moved": false, - "h": 4, - "x": 0, - "y": 3, - "i": "1a8ad0a9-dbf6-4b42-91d8-d0c0ef62a9b3", - "z": 0, - "config": { - "dataStream": { - "name": "devicesNew", - "id": "{{dataStreams.devicesNew}}", - "sort": { - "by": [ - [ - "computerDnsName", - "asc" - ] - ] - } - }, - "scope": { - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Properties", - "visualisation": { - "type": "data-stream-table", - "config": { - "data-stream-table": { - "columnOrder": [ - "computerDnsName", - "exposureLevel", - "healthStatus", - "riskScore", - "onboardingStatus", - "lastSeen", - "agentVersion", - "osPlatform", - "osBuild", - "osProcessor", - "version", - "id", - "mergedIntoMachineId", - "isPotentialDuplication", - "isExcluded", - "exclusionReason", - "firstSeen", - "lastIpAddress", - "lastExternalIpAddress", - "deviceValue", - "rbacGroupId", - "rbacGroupName", - "isAadJoined", - "aadDeviceId", - "osArchitecture", - "managedBy", - "managedByStatus", - "ipAddresses.0.ipAddress", - "ipAddresses.0.macAddress", - "ipAddresses.0.type", - "ipAddresses.0.operationalStatus", - "ipAddresses.1.ipAddress", - "ipAddresses.1.macAddress", - "ipAddresses.1.type", - "ipAddresses.1.operationalStatus", - "ipAddresses.2.ipAddress", - "ipAddresses.2.macAddress", - "ipAddresses.2.type", - "ipAddresses.2.operationalStatus", - "ipAddresses.3.ipAddress", - "ipAddresses.3.macAddress", - "ipAddresses.3.type", - "ipAddresses.3.operationalStatus", - "vmMetadata.vmId", - "vmMetadata.cloudProvider", - "vmMetadata.resourceId", - "vmMetadata.subscriptionId", - "@odata.context", - "healthStatus[Expanded].rawState", - "exposureLevel[Expanded].rawState" - ], - "hiddenColumns": [] - } - } - } - } - } - ], - "version": 59, - "columns": 4 - } -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json deleted file mode 100644 index d7a6297b..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/cockpit.dash.json +++ /dev/null @@ -1,494 +0,0 @@ -{ - "name": "Cockpit", - "schemaVersion": "1.5", - "dashboard": { - "_type": "layout/grid", - "contents": [ - { - "static": false, - "w": 2, - "moved": false, - "h": 2, - "x": 0, - "y": 0, - "i": "c10e229a-9e67-41f0-ba01-83ee1e33e7b2", - "z": 0, - "config": { - "dataStream": { - "name": "deviceSecureStore", - "id": "{{dataStreams.deviceSecureStore}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Device Secure Score", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": "score_percentage", - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 2, - "moved": false, - "h": 2, - "x": 2, - "y": 0, - "i": "ef878c08-56ff-4b33-b499-8809b0bbc73a", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "exposureScore", - "id": "{{dataStreams.exposureScore}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "monitorOld": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [ - "score" - ], - "logic": { - "if": [ - { - ">": [ - { - "var": "top" - }, - 70 - ] - }, - "error", - { - ">": [ - { - "var": "top" - }, - 30 - ] - }, - "warning" - ] - } - }, - "_type": "simple", - "column": "score", - "aggregation": "top", - "groupBy": "__group_by_none__", - "frequency": 15 - }, - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Device Exposure Score", - "visualisation": { - "type": "data-stream-gauge", - "config": { - "data-stream-gauge": { - "value": { - "type": "mean", - "columns": [ - "score" - ] - } - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 0, - "y": 2, - "i": "1740a4de-4864-498e-a3e0-747a5d8ffa11", - "z": 0, - "config": { - "dataStream": { - "name": "advancedHuntingQuery", - "filter": { - "multiOperation": "or", - "filters": [ - { - "column": "ActionType", - "operation": "equals", - "value": "AntivirusDetection" - }, - { - "column": "ActionType", - "operation": "equals", - "value": "AntivirusDetectionCancelled" - }, - { - "column": "ActionType", - "operation": "equals", - "value": "AntivirusMalwareActionFailed" - } - ] - }, - "dataSourceConfig": { - "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" - }, - "id": "{{dataStreams.advancedHuntingQuery}}", - "group": { - "by": [], - "aggregate": [] - }, - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "monitorOld": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 - }, - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Malware & Antivirus Detected", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 1, - "y": 2, - "i": "f5de789a-8f5e-4a36-82b6-f6a2fc2e0ba9", - "z": 0, - "config": { - "dataStream": { - "name": "advancedHuntingQuery", - "filter": { - "multiOperation": "or", - "filters": [ - { - "column": "ActionType", - "operation": "equals", - "value": "UserAccountCreated" - }, - { - "column": "ActionType", - "operation": "equals", - "value": "ScheduledTaskCreated" - }, - { - "column": "ActionType", - "operation": "equals", - "value": "ScheduledTaskDeleted" - }, - { - "column": "ActionType", - "operation": "equals", - "value": "UserAccountModified" - }, - { - "column": "ActionType", - "operation": "equals", - "value": "UserAccountAddedToLocalGroup" - } - ] - }, - "dataSourceConfig": { - "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" - }, - "id": "{{dataStreams.advancedHuntingQuery}}", - "group": { - "by": [], - "aggregate": [] - }, - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "monitorOld": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 - }, - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Persistence & Privilege Escalation", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 2, - "y": 2, - "i": "76f4a20b-d428-479f-93ae-7899f2274b99", - "z": 0, - "config": { - "dataStream": { - "name": "advancedHuntingQuery", - "filter": { - "multiOperation": "or", - "filters": [ - { - "column": "ActionType", - "operation": "contains", - "value": "AppControl*" - } - ] - }, - "dataSourceConfig": { - "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" - }, - "id": "{{dataStreams.advancedHuntingQuery}}", - "group": { - "by": [], - "aggregate": [] - }, - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "monitorOld": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 - }, - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Application Control", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 3, - "y": 2, - "i": "b63f2258-84f3-4f2e-9ee5-701a7953eea3", - "z": 0, - "config": { - "dataStream": { - "name": "advancedHuntingQuery", - "filter": { - "multiOperation": "or", - "filters": [ - { - "column": "ActionType", - "operation": "equals", - "value": "ExploitGuardNetworkProtectionBlocked" - }, - { - "column": "ActionType", - "operation": "equals", - "value": "ExploitGuardNonMicrosoftSignedBlocked" - } - ] - }, - "dataSourceConfig": { - "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" - }, - "id": "{{dataStreams.advancedHuntingQuery}}", - "group": { - "by": [], - "aggregate": [] - }, - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "monitorOld": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 - }, - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Exploits", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 4, - "moved": false, - "h": 2, - "x": 0, - "y": 5, - "i": "956930e3-37fa-49da-a015-7630a5d2d754", - "z": 0, - "config": { - "dataStream": { - "name": "advancedHuntingQuery", - "dataSourceConfig": { - "query": "DeviceEvents\n| project Timestamp, DeviceName, ActionType\n| where Timestamp >= datetime({{{{raw}}}}{{timeframe.start}}) and Timestamp <= datetime({{timeframe.end}}{{{{/raw}}}})" - }, - "id": "{{dataStreams.advancedHuntingQuery}}", - "group": { - "by": [], - "aggregate": [] - }, - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Events Timeline", - "visualisation": { - "type": "data-stream-line-graph", - "config": { - "data-stream-line-graph": { - "seriesColumn": "none", - "cumulative": false, - "xAxisColumn": "Timestamp", - "yAxisColumn": [ - "builtin_count_by_label" - ] - } - } - } - } - } - ], - "version": 99, - "columns": 4 - } -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json deleted file mode 100644 index 34a749f1..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { - "name": "cockpit", - "type": "dashboard" - }, - { - "name": "Devices", - "type": "folder" - }, - { - "name": "recommendations", - "type": "dashboard" - }, - { - "name": "vulnerabilities", - "type": "dashboard" - } - ] -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json deleted file mode 100644 index 22bcbbcc..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/recommendations.dash.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "name": "Recommendations", - "schemaVersion": "1.5", - "dashboard": { - "_type": "layout/grid", - "contents": [ - { - "static": false, - "w": 1, - "moved": false, - "h": 2, - "x": 0, - "y": 0, - "i": "530fbd65-3d58-407a-951e-7569b1222ab5", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listRecommendations", - "filter": { - "multiOperation": "and", - "filters": [ - { - "column": "status", - "operation": "equals", - "value": "Active" - } - ] - }, - "id": "{{dataStreams.listRecommendations}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Active", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 2, - "x": 1, - "y": 0, - "i": "2b047798-81f8-4a32-8b5d-e350bb41aaf8", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listRecommendations", - "filter": { - "multiOperation": "and", - "filters": [ - { - "column": "status", - "operation": "equals", - "value": "Active" - } - ] - }, - "id": "{{dataStreams.listRecommendations}}", - "group": { - "by": [ - [ - "remediationType", - "uniqueValues" - ] - ], - "aggregate": [ - { - "type": "count" - } - ] - }, - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Remediation Type", - "visualisation": { - "type": "data-stream-donut-chart", - "config": { - "data-stream-donut-chart": { - "valueColumn": "count", - "hideCenterValue": false, - "showValuesAsPercentage": false, - "legendPosition": "right", - "legendMode": "table", - "labelColumn": "remediationType_uniqueValues" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 2, - "x": 2, - "y": 0, - "i": "5e08dc7b-d981-4abc-8051-6f389b745b8e", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listRecommendations", - "filter": { - "multiOperation": "and", - "filters": [ - { - "column": "status", - "operation": "equals", - "value": "Active" - } - ] - }, - "id": "{{dataStreams.listRecommendations}}", - "group": { - "by": [ - [ - "recommendationCategory", - "uniqueValues" - ] - ], - "aggregate": [ - { - "type": "count" - } - ] - }, - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Category", - "visualisation": { - "type": "data-stream-donut-chart", - "config": { - "data-stream-donut-chart": { - "valueColumn": "count", - "hideCenterValue": false, - "showValuesAsPercentage": false, - "legendPosition": "right", - "legendMode": "table", - "labelColumn": "recommendationCategory_uniqueValues" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 2, - "x": 3, - "y": 0, - "i": "2ba85224-a580-4164-bafa-b727fc931fe8", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "dataSourceConfig": { - "version": "2.0", - "tables": [ - { - "config": { - "timeframe": "none", - "activePluginConfigIds": [ - "{{configId}}" - ], - "dataStream": { - "name": "listRecommendations", - "filter": { - "multiOperation": "and", - "filters": [ - { - "column": "status", - "operation": "equals", - "value": "Active" - } - ] - }, - "metadata": [ - { - "shape": [ - "number", - { - "decimalPlaces": 0 - } - ], - "name": "severityScore_uniqueValues" - }, - { - "pattern": ".*" - } - ], - "id": "{{dataStreams.listRecommendations}}", - "group": { - "by": [ - [ - "severityScore", - "uniqueValues" - ] - ], - "aggregate": [ - { - "type": "count" - } - ] - }, - "pluginConfigId": "{{configId}}" - } - }, - "tableName": "dataset1" - } - ], - "sql": "WITH \"scores\" AS (\n SELECT 0 AS \"severityScore_uniqueValues\"\n UNION ALL SELECT 1\n UNION ALL SELECT 2\n UNION ALL SELECT 3\n UNION ALL SELECT 4\n UNION ALL SELECT 5\n UNION ALL SELECT 6\n UNION ALL SELECT 7\n UNION ALL SELECT 8\n UNION ALL SELECT 9\n)\nSELECT\n \"scores\".\"severityScore_uniqueValues\",\n COALESCE(\"dataset1\".\"count\", 0) AS \"count\"\nFROM \"scores\"\nLEFT JOIN \"dataset1\" ON \"scores\".\"severityScore_uniqueValues\" = \"dataset1\".\"severityScore_uniqueValues\"" - }, - "id": "datastream-sql" - }, - "scope": { - "query": "g.V().has('id', within(ids_OhlTXsVd3W6ErLLqvWW8))", - "bindings": { - "ids_OhlTXsVd3W6ErLLqvWW8": [ - "node-1dwkxV4HX7rWIiV3UddbjAZxFztYmHV1NQ8t1-TPvNIMMPMu4LhSro2Rk7" - ] - }, - "queryDetail": { - "ids": [ - "node-1dwkxV4HX7rWIiV3UddbjAZxFztYmHV1NQ8t1-TPvNIMMPMu4LhSro2Rk7" - ] - } - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Severity Score", - "visualisation": { - "type": "data-stream-bar-chart", - "config": { - "data-stream-bar-chart": { - "xAxisGroup": "none", - "showLegend": false, - "range": { - "type": "auto" - }, - "showGrid": true, - "grouping": false, - "displayMode": "actual", - "xAxisData": "severityScore_uniqueValues", - "showTotals": false, - "yAxisLabel": "", - "horizontalLayout": "vertical", - "showValue": false, - "yAxisData": [ - "count" - ], - "showYAxisLabel": true, - "xAxisLabel": "", - "legendPosition": "bottom", - "showXAxisLabel": true - } - } - } - } - }, - { - "static": false, - "w": 4, - "moved": false, - "h": 4, - "x": 0, - "y": 2, - "i": "193720b0-9e92-4782-b1ff-70280e2bade0", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listRecommendations", - "id": "{{dataStreams.listRecommendations}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "List", - "visualisation": { - "type": "data-stream-table", - "config": { - "data-stream-table": { - "columnOrder": [ - "recommendationName", - "id", - "productName", - "weaknesses", - "vendor", - "recommendedVersion", - "recommendedVendor", - "recommendedProgram", - "recommendationCategory", - "subCategory", - "severityScore", - "publicExploit", - "activeAlert", - "remediationType", - "status", - "associatedThreats.85", - "associatedThreats.86", - "configScoreImpact", - "exposureImpact", - "totalMachineCount", - "exposedMachinesCount", - "nonProductivityImpactedAssets", - "relatedComponent", - "hasUnpatchableCve", - "tags.0", - "exposedCriticalDevices", - "tags.1" - ], - "hiddenColumns": [ - "associatedThreats.0", - "associatedThreats.1", - "associatedThreats.2", - "associatedThreats.3", - "associatedThreats.4", - "associatedThreats.5", - "associatedThreats.6", - "associatedThreats.7", - "associatedThreats.8", - "associatedThreats.9", - "associatedThreats.10", - "associatedThreats.11", - "associatedThreats.12", - "associatedThreats.13", - "associatedThreats.14", - "associatedThreats.15", - "associatedThreats.16", - "associatedThreats.17", - "associatedThreats.18", - "associatedThreats.19", - "associatedThreats.20", - "associatedThreats.21", - "associatedThreats.22", - "associatedThreats.23", - "associatedThreats.24", - "associatedThreats.25", - "associatedThreats.26", - "associatedThreats.27", - "associatedThreats.28", - "associatedThreats.29", - "associatedThreats.30", - "associatedThreats.31", - "associatedThreats.32", - "associatedThreats.33", - "associatedThreats.34", - "associatedThreats.35", - "associatedThreats.36", - "associatedThreats.37", - "associatedThreats.38", - "associatedThreats.39", - "associatedThreats.40", - "associatedThreats.41", - "associatedThreats.42", - "associatedThreats.43", - "associatedThreats.44", - "associatedThreats.45", - "associatedThreats.46", - "associatedThreats.47", - "associatedThreats.48", - "associatedThreats.49", - "associatedThreats.50", - "associatedThreats.51", - "associatedThreats.52", - "associatedThreats.53", - "associatedThreats.54", - "associatedThreats.55", - "associatedThreats.56", - "associatedThreats.57", - "associatedThreats.58", - "associatedThreats.59", - "associatedThreats.60", - "associatedThreats.61", - "associatedThreats.62", - "associatedThreats.63", - "associatedThreats.64", - "associatedThreats.65", - "associatedThreats.66", - "associatedThreats.67", - "associatedThreats.68", - "associatedThreats.69", - "associatedThreats.70", - "associatedThreats.71", - "associatedThreats.72", - "associatedThreats.73", - "associatedThreats.74", - "associatedThreats.75", - "associatedThreats.76", - "associatedThreats.77", - "associatedThreats.78", - "associatedThreats.79", - "associatedThreats.80", - "associatedThreats.81", - "associatedThreats.82", - "associatedThreats.83", - "associatedThreats.84" - ] - } - } - } - } - } - ], - "version": 44, - "columns": 4 - } -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json deleted file mode 100644 index 0232f0f4..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/scopes.json +++ /dev/null @@ -1,19 +0,0 @@ -[ - { - "name": "Defender Devices", - "matches": { - "sourceType": { - "type": "oneOf", - "values": [ - "defender-device" - ] - } - }, - "variable": { - "name": "Defender Device", - "type": "object", - "default": "none", - "allowMultipleSelection": false - } - } -] \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json b/plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json deleted file mode 100644 index 557dcacd..00000000 --- a/plugins/Microsoft Defender (Preview)/v1/defaultContent/vulnerabilities.dash.json +++ /dev/null @@ -1,231 +0,0 @@ -{ - "name": "Vulnerabilities", - "schemaVersion": "1.5", - "dashboard": { - "_type": "layout/grid", - "contents": [ - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 2, - "y": 0, - "i": "0c28021b-1047-423b-915f-ac975bf61c71", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listVulnerabilities", - "id": "{{dataStreams.listVulnerabilities}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Product", - "visualisation": { - "type": "data-stream-donut-chart", - "config": { - "data-stream-donut-chart": { - "valueColumn": "builtin_count_by_label", - "hideCenterValue": false, - "showValuesAsPercentage": false, - "legendPosition": "right", - "legendMode": "table", - "labelColumn": "productName" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 0, - "y": 0, - "i": "a66e092f-73d9-4fb2-9344-91ff1b072dcb", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listVulnerabilities", - "filter": { - "multiOperation": "and", - "filters": [ - { - "column": "severity", - "operation": "equals", - "value": "Critical" - } - ] - }, - "id": "{{dataStreams.listVulnerabilities}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Critical", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 1, - "y": 0, - "i": "776252a0-8be0-4082-b239-ea5b4d9f789e", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listVulnerabilities", - "filter": { - "multiOperation": "and", - "filters": [ - { - "column": "severity", - "operation": "equals", - "value": "High" - } - ] - }, - "id": "{{dataStreams.listVulnerabilities}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "High", - "visualisation": { - "type": "data-stream-scalar", - "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" - } - } - } - } - }, - { - "static": false, - "w": 1, - "moved": false, - "h": 3, - "x": 3, - "y": 0, - "i": "07a49165-983f-465c-b1ae-d8990f1a6772", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listVulnerabilities", - "id": "{{dataStreams.listVulnerabilities}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Severity", - "visualisation": { - "type": "data-stream-bar-chart", - "config": { - "data-stream-bar-chart": { - "xAxisGroup": "none", - "showLegend": false, - "range": { - "type": "auto" - }, - "showGrid": true, - "grouping": false, - "displayMode": "actual", - "xAxisData": "severity", - "showTotals": false, - "yAxisLabel": "", - "horizontalLayout": "vertical", - "showValue": false, - "yAxisData": [ - "builtin_count_by_label" - ], - "showYAxisLabel": true, - "xAxisLabel": "", - "legendPosition": "bottom", - "showXAxisLabel": true - } - } - } - } - }, - { - "static": false, - "w": 4, - "moved": false, - "h": 3, - "x": 0, - "y": 3, - "i": "3e302230-6ee0-46a0-9415-0a79381dda06", - "z": 0, - "config": { - "timeframe": "none", - "dataStream": { - "name": "listVulnerabilities", - "id": "{{dataStreams.listVulnerabilities}}", - "pluginConfigId": "{{configId}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "List", - "visualisation": { - "type": "data-stream-table", - "config": { - "data-stream-table": { - "columnOrder": [ - "cveId", - "severity", - "machineId", - "productName", - "productVendor", - "productVersion", - "fixingKbId", - "id" - ], - "hiddenColumns": [] - } - } - } - } - } - ], - "version": 44, - "columns": 4 - } -} \ No newline at end of file diff --git a/plugins/Microsoft Defender (Preview)/v1/icon.png b/plugins/Microsoft Defender (Preview)/v1/icon.png deleted file mode 100644 index a34e4d4285d6a0653f947dbba6c6bc2d8a9988c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67410 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 Date: Mon, 1 Jun 2026 08:30:03 +0100 Subject: [PATCH 07/49] chore: add manual config apply to hunting query --- .../MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json b/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json index e2053f53..65ef6437 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json @@ -35,6 +35,7 @@ ], "supportsNoneTimeframe": true, "providesPluginDiagnostics": true, + "manualConfigApply": true, "tags": [], "ui": [ { From 1063f37d69d92b5bc3a9f5c37a1d5fbbce9bca75 Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 2 Jun 2026 07:58:02 +0100 Subject: [PATCH 08/49] chore: manual config apply for alerts and incidents --- plugins/MicrosoftDefender/v1/dataStreams/alerts.json | 1 + plugins/MicrosoftDefender/v1/dataStreams/incidents.json | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index 993a4d62..eb0015a8 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -48,6 +48,7 @@ "lastYear" ], "supportsNoneTimeframe": true, + "manualConfigApply": true, "providesPluginDiagnostics": true, "tags": [], "ui": [ diff --git a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json index d95529ea..cc76b96b 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json @@ -49,6 +49,7 @@ ], "supportsNoneTimeframe": true, "providesPluginDiagnostics": true, + "manualConfigApply": true, "tags": [], "ui": [ { From 284da4c8d93a41457211ef7d9c929ae4061a2dae Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 2 Jun 2026 08:01:47 +0100 Subject: [PATCH 09/49] chore: rename Defender Device source type to device --- .../MicrosoftDefender/v1/custom_types.json | 4 +-- .../v1/dataStreams/Vulnerabilities.json | 4 +-- .../v1/dataStreams/devices.json | 4 +-- .../v1/dataStreams/recommendations.json | 2 +- .../Devices/deviceStatus.dash.json | 26 +++++++++---------- .../v1/defaultContent/cockpit.dash.json | 2 +- .../defaultContent/recommendations.dash.json | 2 +- .../v1/defaultContent/scopes.json | 6 ++--- .../v1/indexDefinitions/default.json | 2 +- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/custom_types.json b/plugins/MicrosoftDefender/v1/custom_types.json index 23ac01b6..e7aa71f7 100644 --- a/plugins/MicrosoftDefender/v1/custom_types.json +++ b/plugins/MicrosoftDefender/v1/custom_types.json @@ -1,7 +1,7 @@ [ { - "name": "Defender Device", - "sourceType": "Defender Device", + "name": "device", + "sourceType": "device", "icon": "server", "singular": "Device", "plural": "Devices" diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json index 4e2a8a1d..218c04ed 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -26,7 +26,7 @@ "name": "DeviceName", "shape": "string", "role": "label", - "sourceType": "Defender Device" + "sourceType": "device" }, { "pattern": ".*" @@ -35,7 +35,7 @@ "matches": { "sourceType": { "type": "equals", - "value": "Defender Device" + "value": "device" } }, "timeframes": false, diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index c1afcae8..13ced7c2 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -25,7 +25,7 @@ "name": "DeviceName", "shape": "string", "role": "label", - "sourceType": "Defender Device" + "sourceType": "device" }, { "shape": [ @@ -55,7 +55,7 @@ "matches": { "sourceType": { "type": "equals", - "value": "Defender Device" + "value": "device" } }, "timeframes": false, diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index e4953fd7..cd1d7ec3 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -23,7 +23,7 @@ "matches": { "sourceType": { "type": "equals", - "value": "Defender Device" + "value": "device" } }, "timeframes": false, diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json index 82b0a2ab..85801655 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json @@ -16,16 +16,16 @@ "config": { "timeframe": "none", "variables": [ - "{{variables.[Defender Device]}}" + "{{variables.[device]}}" ], "dataStream": { "name": "devices", "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[Defender Device]}}", + "variable": "{{variables.[device]}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" + "scope": "{{scopes.[devices]}}" }, "_type": "tile/data-stream", "description": "", @@ -57,7 +57,7 @@ "config": { "timeframe": "none", "variables": [ - "{{variables.[Defender Device]}}" + "{{variables.[device]}}" ], "dataStream": { "name": "devices", @@ -91,9 +91,9 @@ "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[Defender Device]}}", + "variable": "{{variables.[device]}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" + "scope": "{{scopes.[devices]}}" }, "_type": "tile/data-stream", "description": "", @@ -125,16 +125,16 @@ "config": { "timeframe": "none", "variables": [ - "{{variables.[Defender Device]}}" + "{{variables.[device]}}" ], "dataStream": { "name": "devices", "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[Defender Device]}}", + "variable": "{{variables.[device]}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" + "scope": "{{scopes.[devices]}}" }, "_type": "tile/data-stream", "description": "", @@ -260,16 +260,16 @@ "config": { "timeframe": "none", "variables": [ - "{{variables.[Defender Device]}}" + "{{variables.[device]}}" ], "dataStream": { "name": "devices", "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[Defender Device]}}", + "variable": "{{variables.[device]}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[Defender Devices]}}" + "scope": "{{scopes.[devices]}}" }, "_type": "tile/data-stream", "description": "", @@ -388,6 +388,6 @@ "columns": 4 }, "variables": [ - "{{variables.[Defender Device]}}" + "{{variables.[device]}}" ] } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json index 5346e993..6cf57002 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json @@ -76,7 +76,7 @@ } }, "scope": { - "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"Defender Device\")).limit(500)", + "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"device\")).limit(500)", "bindings": {}, "queryDetail": {} }, diff --git a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json index 0d813fa2..213e15e7 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json @@ -103,7 +103,7 @@ } }, "scope": { - "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"Defender Device\")).limit(500)", + "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"device\")).limit(500)", "bindings": {}, "queryDetail": {} }, diff --git a/plugins/MicrosoftDefender/v1/defaultContent/scopes.json b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json index 7e8fa0bb..9b79bd0f 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/scopes.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json @@ -10,17 +10,17 @@ } }, { - "name": "Defender Devices", + "name": "devices", "matches": { "sourceType": { "type": "oneOf", "values": [ - "Defender Device" + "device" ] } }, "variable": { - "name": "Defender Device", + "name": "device", "type": "object", "default": "none", "allowMultipleSelection": false diff --git a/plugins/MicrosoftDefender/v1/indexDefinitions/default.json b/plugins/MicrosoftDefender/v1/indexDefinitions/default.json index 6e469956..b84def46 100644 --- a/plugins/MicrosoftDefender/v1/indexDefinitions/default.json +++ b/plugins/MicrosoftDefender/v1/indexDefinitions/default.json @@ -10,7 +10,7 @@ "id": "DeviceId", "name": "DeviceName", "type": { - "value": "Defender Device" + "value": "device" }, "properties": [ "OSPlatform", From 6b97fb02ec2e8fc91b0d40bea918b6e99b1f6547 Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 2 Jun 2026 10:41:04 +0100 Subject: [PATCH 10/49] feat: update device status OOB dash --- .../Devices/deviceStatus.dash.json | 172 +++++++++++------- 1 file changed, 108 insertions(+), 64 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json index 85801655..7d788bcd 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json @@ -100,7 +100,7 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Sensor Health State", + "title": "Health State (Sensor)", "visualisation": { "type": "data-stream-blocks", "config": { @@ -113,6 +113,86 @@ } } }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 2, + "y": 0, + "i": "86c6198e-d8a3-456e-a014-fb14a079f058", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[device]}}" + ], + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}" + }, + "scope": { + "variable": "{{variables.[device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Asset Value", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "AssetValue", + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 3, + "y": 0, + "i": "951c5d29-1b5c-4509-a83c-70e183ddc881", + "z": 0, + "config": { + "timeframe": "none", + "variables": [ + "{{variables.[device]}}" + ], + "dataStream": { + "name": "devices", + "id": "{{dataStreams.devices}}" + }, + "scope": { + "variable": "{{variables.[device]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[devices]}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Last Seen", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "Timestamp", + "comparisonColumn": "none" + } + } + } + } + }, { "static": false, "w": 2, @@ -281,77 +361,28 @@ "type": "data-stream-table", "config": { "data-stream-table": { - "columnOrder": [ - "DeviceId", - "PublicIP", - "ConnectivityType", - "OSPlatform", - "OSBuild", - "OSArchitecture", - "OSVersion", - "OSDistribution", - "OSVersionInfo", - "OsBuildRevision", - "ClientVersion", - "HardwareUuid" - ], "hiddenColumns": [ - "@odata.context", - "mergedIntoMachineId", - "isPotentialDuplication", - "isExcluded", - "exclusionReason", - "firstSeen", - "lastSeen", - "healthStatus", - "deviceValue", - "rbacGroupId", - "rbacGroupName", - "riskScore", - "exposureLevel", - "isAadJoined", - "aadDeviceId", - "onboardingStatus", - "managedBy", - "managedByStatus", - "ipAddresses.0.ipAddress", - "ipAddresses.0.macAddress", - "ipAddresses.0.type", - "ipAddresses.0.operationalStatus", - "ipAddresses.1.ipAddress", - "ipAddresses.1.macAddress", - "ipAddresses.1.type", - "ipAddresses.1.operationalStatus", - "ipAddresses.2.ipAddress", - "ipAddresses.2.macAddress", - "ipAddresses.2.type", - "ipAddresses.2.operationalStatus", - "ipAddresses.3.ipAddress", - "ipAddresses.3.macAddress", - "ipAddresses.3.type", - "ipAddresses.3.operationalStatus", - "healthStatus[Expanded].rawState", - "computerDnsName", - "exposureLevel[Expanded].rawState", + "DeviceId", "Timestamp", "DeviceName", + "ClientVersion", + "PublicIP", + "OSArchitecture", "OSBuild@odata.type", + "OSBuild", "IsAzureADJoined@odata.type", "IsAzureADJoined", - "JoinType", "AadDeviceId", "LoggedOnUsers", "RegistryDeviceTag", - "MachineGroup", "ReportId@odata.type", "ReportId", - "OnboardingStatus", "AdditionalFields", - "DeviceCategory", - "DeviceType", "DeviceSubtype", "Model", "Vendor", + "OSDistribution", + "OSVersionInfo", "MergedDeviceIds", "MergedToDeviceId", "SensorHealthState", @@ -359,9 +390,9 @@ "IsExcluded", "ExclusionReason", "ExposureLevel", - "AssetValue", "DeviceManualTags", "DeviceDynamicTags", + "HardwareUuid", "CloudPlatforms", "AzureVmId", "AzureResourceId", @@ -370,21 +401,34 @@ "AwsResourceName", "IsTransient@odata.type", "IsTransient", + "OsBuildRevision", "HostDeviceId", - "MitigationStatus", - "FirmwareVersions", + "ConnectivityType", "DiscoverySources", - "DlpInfo", - "ExposureLevel[Expanded].rawState" + "FirmwareVersions", + "ExposureLevel[Expanded].rawState", + "OSPlatform", + "OSVersion", + "DlpInfo" ], - "transpose": true + "transpose": true, + "columnOrder": [ + "DeviceCategory", + "DeviceType", + "AssetValue", + "JoinType", + "MachineGroup", + "OnboardingStatus", + "MitigationStatus" + ], + "columnDisplayNames": {} } } } } } ], - "version": 28, + "version": 42, "columns": 4 }, "variables": [ From 9b0ff1bd68c36ee6f510dac35955293396a8b05b Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 09:06:43 +0100 Subject: [PATCH 11/49] chore: update metadata --- plugins/MicrosoftDefender/v1/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/metadata.json b/plugins/MicrosoftDefender/v1/metadata.json index 7ea33e58..1a201570 100644 --- a/plugins/MicrosoftDefender/v1/metadata.json +++ b/plugins/MicrosoftDefender/v1/metadata.json @@ -1,13 +1,13 @@ { "name": "microsoft-defender", - "displayName": "Microsoft Defender for Endpoint", + "displayName": "Microsoft Defender", "version": "1.0.0", "author": { "name": "SquaredUp Labs", - "type": "community" + "type": "labs" }, "description": "Visualize Defender insights including advanced hunting, exposure, devices, and vulnerabilities.", - "category": "User Defined", + "category": "Monitoring", "type": "hybrid", "schemaVersion": "2.0", "base": { From ab26377062a321037542194eeaab0a6413799467 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 09:16:22 +0100 Subject: [PATCH 12/49] fix: update 'New' Status val --- plugins/MicrosoftDefender/v1/dataStreams/alerts.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index eb0015a8..0f9bc174 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -95,7 +95,7 @@ "source": "fixed", "values": [ { - "value": "new", + "value": "newAlert", "label": "New" }, { From 936311cf5e0a2ace9b7537e807e918bbdffa8f56 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 10:19:59 +0100 Subject: [PATCH 13/49] chore: update alerts metadata --- .../v1/dataStreams/alerts.json | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index 0f9bc174..4bba22e6 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -24,7 +24,7 @@ } }, "expandInnerObjects": true, - "endpointPath": "alerts", + "endpointPath": "alerts_v2", "pathToData": "value", "getArgs": [ { @@ -34,6 +34,78 @@ ], "headers": [] }, + "metadata": [ + { + "name": "title", + "displayName": "Title", + "shape": "string", + "role": "label" + }, + { + "name": "systemTags", + "displayName": "System Tags", + "shape": "string", + "role": "label" + }, + { + "name": "severity", + "displayName": "Severity", + "shape": "string", + "role": "label" + }, + { + "name": "status", + "displayName": "Status", + "shape": "string", + "role": "label" + }, + { + "name": "category", + "displayName": "Category", + "shape": "string", + "role": "label" + }, + { + "name": "detectionSource", + "displayName": "Detection Source", + "shape": "string", + "role": "label" + }, + { + "name": "firstActivityDateTime", + "displayName": "First Activity", + "shape": "date", + "role": "label" + }, + { + "name": "lastActivityDateTime", + "displayName": "Last Activity", + "shape": "date", + "role": "label" + }, + { + "name": "classification", + "displayName": "Classification", + "shape": "string", + "role": "label" + }, + { + "name": "determination", + "displayName": "Determination", + "shape": "string", + "role": "label" + }, + { + "name": "assignedTo", + "displayName": "Assigned To", + "shape": "string", + "role": "label" + }, + { + "pattern": ".*", + "visible": false + } + ], "timeframes": [ "last1hour", "last12hours", From 23c954a8c2f71265ced7031a15368d2dcbdf846c Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 10:26:26 +0100 Subject: [PATCH 14/49] chore: update devices metadata --- .../v1/dataStreams/devices.json | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index 13ced7c2..d220d44a 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -23,10 +23,95 @@ { "sourceId": "DeviceId", "name": "DeviceName", + "displayName": "Device Name", "shape": "string", "role": "label", "sourceType": "device" }, + { + "name": "PublicIP", + "displayName": "IP", + "shape": "string", + "role": "label" + }, + { + "name": "AssetValue", + "displayName": "Criticality", + "shape": "string", + "role": "label" + }, + { + "name": "DeviceCategory", + "displayName": "Device Category", + "shape": "string", + "role": "label" + }, + { + "name": "DeviceType", + "displayName": "Device Type", + "shape": "string", + "role": "label" + }, + { + "name": "DnsDomain", + "displayName": "Domain", + "shape": "string", + "role": "label" + }, + { + "name": "AadDeviceId", + "displayName": "Device AAD Id", + "shape": "string", + "role": "label" + }, + { + "name": "ExposureLevel", + "displayName": "Exposure Level", + "shape": "string", + "role": "label" + }, + { + "name": "OSPlatform", + "displayName": "OS Platform", + "shape": "string", + "role": "label" + }, + { + "name": "OSVersion", + "displayName": "OS Version", + "shape": "string", + "role": "label" + }, + { + "name": "SensorHealthState", + "displayName": "Sensor Health State", + "shape": "string", + "role": "label" + }, + { + "name": "OnboardingStatus", + "displayName": "Onboarding Status", + "shape": "string", + "role": "label" + }, + { + "name": "Timestamp", + "displayName": "Last Device Update", + "shape": "string", + "role": "label" + }, + { + "name": "DeviceManualTags", + "displayName": "Device Manual Tags", + "shape": "string", + "role": "label" + }, + { + "name": "DeviceDynamicTags", + "displayName": "Device Dynamic Tags", + "shape": "string", + "role": "label" + }, { "shape": [ "state", From 9da3a2bbe54a89d348e6b65b5f2d1bab9a810bc4 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 10:26:43 +0100 Subject: [PATCH 15/49] fix: hide undefined columns in meta devices --- plugins/MicrosoftDefender/v1/dataStreams/devices.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index d220d44a..e96487f6 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -134,7 +134,8 @@ "name": "ExposureLevel" }, { - "pattern": ".*" + "pattern": ".*", + "visible": false } ], "matches": { From b86e2df2fa15eee338bf94a6c6320550cde5eaf6 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 11:36:01 +0100 Subject: [PATCH 16/49] chore: update timeframe options for incidents and alerts --- .../v1/dataStreams/alerts.json | 12 ++++ .../v1/dataStreams/incidents.json | 71 +++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index 4bba22e6..92e5dcff 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -200,9 +200,21 @@ "value": "createdDateTime", "label": "Creation Time" }, + { + "value": "firstActivityDateTime", + "label": "First Activity Time" + }, + { + "value": "lastActivityDateTime", + "label": "Last Activity Time" + }, { "value": "lastUpdateDateTime", "label": "Last Update Time" + }, + { + "value": "resolvedDateTime", + "label": "Resolved Time" } ] }, diff --git a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json index cc76b96b..33274b2c 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json @@ -34,6 +34,77 @@ ], "headers": [] }, + "metadata": [ + { + "name": "displayName", + "displayName": "Incident name", + "shape": "string", + "role": "label" + }, + { + "name": "id", + "displayName": "Incident id", + "shape": "string", + "role": "label" + }, + { + "name": "priorityScore", + "displayName": "Priority score", + "shape": "number" + }, + { + "name": "customTags", + "displayName": "Tags", + "shape": "string", + "role": "label" + }, + { + "name": "severity", + "displayName": "Severity", + "shape": "string", + "role": "label" + }, + { + "name": "lastUpdateDateTime", + "displayName": "Last update time", + "shape": "date", + "role": "label" + }, + { + "name": "status", + "displayName": "Status", + "shape": "string", + "role": "label" + }, + { + "name": "assignedTo", + "displayName": "Assigned to", + "shape": "string", + "role": "label" + }, + { + "name": "classification", + "displayName": "Classification", + "shape": "string", + "role": "label" + }, + { + "name": "determination", + "displayName": "Determination", + "shape": "string", + "role": "label" + }, + { + "name": "createdDateTime", + "displayName": "Creation time", + "shape": "date", + "role": "label" + }, + { + "pattern": ".*", + "visible": false + } + ], "timeframes": [ "last1hour", "last12hours", From e2581506fbafdb8cf39e2cf45b3eb2dfa69a6a0b Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 11:36:16 +0100 Subject: [PATCH 17/49] fix: remove bad options --- plugins/MicrosoftDefender/v1/dataStreams/alerts.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index 92e5dcff..18130393 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -200,10 +200,6 @@ "value": "createdDateTime", "label": "Creation Time" }, - { - "value": "firstActivityDateTime", - "label": "First Activity Time" - }, { "value": "lastActivityDateTime", "label": "Last Activity Time" @@ -211,10 +207,6 @@ { "value": "lastUpdateDateTime", "label": "Last Update Time" - }, - { - "value": "resolvedDateTime", - "label": "Resolved Time" } ] }, From c3a730d44da8a8fb8053be78d89a0c764b6c9883 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 11:43:06 +0100 Subject: [PATCH 18/49] chore: move timeframe fields to timeframe tab --- plugins/MicrosoftDefender/v1/dataStreams/alerts.json | 1 + plugins/MicrosoftDefender/v1/dataStreams/incidents.json | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index 18130393..c9c8fa6b 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -191,6 +191,7 @@ "isClearable": true }, { + "tileEditorStep": ["Timeframe"], "isMulti": false, "help": "Select the column to apply the timeframe", "data": { diff --git a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json index 33274b2c..5d4b6189 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json @@ -198,6 +198,7 @@ "isClearable": true }, { + "tileEditorStep": ["Timeframe"], "isMulti": false, "help": "Select the column to apply the timeframe", "data": { From 655b37a8c212b3890caf57a7e53f5dc25ba40704 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 11:43:27 +0100 Subject: [PATCH 19/49] chore: add recommendations metadata --- .../v1/dataStreams/recommendations.json | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index cd1d7ec3..a9d1d07e 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -20,6 +20,71 @@ "getArgs": [], "headers": [] }, + "metadata": [ + { + "name": "RiskDescription", + "displayName": "Risk description", + "shape": "string", + "role": "label" + }, + { + "sourceId": "DeviceId", + "name": "DeviceName", + "displayName": "Device Name", + "shape": "string", + "role": "label", + "sourceType": "device" + }, + { + "name": "Timestamp", + "displayName": "Timestamp", + "shape": "date", + "role": "label" + }, + { + "name": "ConfigurationName", + "displayName": "Configuration Name", + "shape": "string", + "role": "label" + }, + { + "name": "ConfigurationCategory", + "displayName": "Configuration Category", + "shape": "string", + "role": "label" + }, + { + "name": "ConfigurationSubcategory", + "displayName": "Configuration Subcategory", + "shape": "string", + "role": "label" + }, + { + "name": "ConfigurationImpact", + "displayName": "Configuration Impact", + "shape": "number" + }, + { + "name": "RemediationOptions", + "displayName": "Remediation Options", + "shape": "string", + "role": "label" + }, + { + "name": "IsApplicable", + "displayName": "Is Applicable", + "shape": "number" + }, + { + "name": "IsCompliant", + "displayName": "Is Compliant", + "shape": "number" + }, + { + "pattern": ".*", + "visible": false + } + ], "matches": { "sourceType": { "type": "equals", From c7cbf84d5e903344a5e64415e4c7eb877bbfee7b Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 3 Jun 2026 11:43:35 +0100 Subject: [PATCH 20/49] chore: add SSH metadata --- .../v1/dataStreams/secureScoreHistory.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json b/plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json index 07b03b15..653ed537 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/secureScoreHistory.json @@ -37,12 +37,28 @@ "path": "$skip" } }, - "expandInnerObjects": true, + "expandInnerObjects": false, "endpointPath": "secureScores", "pathToData": "value", "getArgs": [], "headers": [] }, + "metadata": [ + { + "name": "createdDateTime", + "displayName": "Created Date Time", + "shape": "date", + "role": "label" + }, + { + "name": "currentScore", + "displayName": "Current Score", + "shape": "number" + }, + { + "pattern": ".*" + } + ], "providesPluginDiagnostics": true, "timeframes": false, "tags": [] From 92bcf5e9387c9afc69439e60783c9d25a496abef Mon Sep 17 00:00:00 2001 From: James Davenport Date: Wed, 3 Jun 2026 12:16:27 +0100 Subject: [PATCH 21/49] Update plugins/MicrosoftDefender/v1/configValidation.json Co-authored-by: Dave Clarke --- plugins/MicrosoftDefender/v1/configValidation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/configValidation.json b/plugins/MicrosoftDefender/v1/configValidation.json index d9c93aad..08c937e5 100644 --- a/plugins/MicrosoftDefender/v1/configValidation.json +++ b/plugins/MicrosoftDefender/v1/configValidation.json @@ -6,7 +6,7 @@ "name": "validation" }, "success": "Successfully connected to Endpoint", - "error": "Cannot access the Endpoint API - check your client ID & secret. Do you have the correct permissions set?", + "error": "Cannot access the Endpoint API - check your client ID, secret and permissions.", "required": true } ] From cb761ec55b76527f4c8a908bba30145c5e80f8be Mon Sep 17 00:00:00 2001 From: James Davenport Date: Wed, 3 Jun 2026 12:16:41 +0100 Subject: [PATCH 22/49] Update plugins/MicrosoftDefender/v1/configValidation.json Co-authored-by: Dave Clarke --- plugins/MicrosoftDefender/v1/configValidation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/configValidation.json b/plugins/MicrosoftDefender/v1/configValidation.json index 08c937e5..45cb26a1 100644 --- a/plugins/MicrosoftDefender/v1/configValidation.json +++ b/plugins/MicrosoftDefender/v1/configValidation.json @@ -1,7 +1,7 @@ { "steps": [ { - "displayName": "API Access Test", + "displayName": "API Access", "dataStream": { "name": "validation" }, From abb6586576791638210a0bc3bd3b3fe1a9acb61a Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 4 Jun 2026 08:50:48 +0100 Subject: [PATCH 23/49] chore: remove redundant config --- plugins/MicrosoftDefender/v1/dataStreams/validation.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/validation.json b/plugins/MicrosoftDefender/v1/dataStreams/validation.json index bc279031..de9e8204 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/validation.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/validation.json @@ -27,6 +27,5 @@ "providesPluginDiagnostics": true, "visibility": { "type": "hidden" - }, - "options": { "noMatch": true } + } } \ No newline at end of file From cb4d97e76537ad3f79a9d9a0eaedebb8b4288f16 Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 4 Jun 2026 08:51:36 +0100 Subject: [PATCH 24/49] fix: remove custom col for ExposureLevel --- plugins/MicrosoftDefender/v1/dataStreams/devices.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index e96487f6..79e2bb5e 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -64,12 +64,6 @@ "shape": "string", "role": "label" }, - { - "name": "ExposureLevel", - "displayName": "Exposure Level", - "shape": "string", - "role": "label" - }, { "name": "OSPlatform", "displayName": "OS Platform", From 56f8d4a86f890560df9368ac522754baab6e405d Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 4 Jun 2026 10:51:46 +0100 Subject: [PATCH 25/49] fix: fixes for recommendations --- .../v1/dataStreams/recommendations.json | 29 ++++++++++++++----- .../defaultContent/recommendations.dash.json | 17 +++++++---- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index a9d1d07e..068d750a 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -47,6 +47,24 @@ "shape": "string", "role": "label" }, + { + "name": "ConfigurationImpact", + "displayName": "Configuration Impact", + "shape": "number", + "role": "value" + }, + { + "name": "ConfigurationImpact_uniqueValues", + "displayName": "Configuration Impact (Unique Values)", + "shape": "number", + "role": "value" + }, + { + "name": "count", + "displayName": "Count", + "shape": "number", + "role": "value" + }, { "name": "ConfigurationCategory", "displayName": "Configuration Category", @@ -59,11 +77,6 @@ "shape": "string", "role": "label" }, - { - "name": "ConfigurationImpact", - "displayName": "Configuration Impact", - "shape": "number" - }, { "name": "RemediationOptions", "displayName": "Remediation Options", @@ -73,12 +86,14 @@ { "name": "IsApplicable", "displayName": "Is Applicable", - "shape": "number" + "shape": "number", + "role": "label" }, { "name": "IsCompliant", "displayName": "Is Compliant", - "shape": "number" + "shape": "number", + "role": "label" }, { "pattern": ".*", diff --git a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json index 213e15e7..157dc831 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json @@ -14,6 +14,7 @@ "i": "777d4030-bbb1-4d20-a362-eef301140a35", "z": 0, "config": { + "timeframe": "none", "variables": [ "{{variables.[All Object]}}" ], @@ -70,6 +71,10 @@ "i": "30f6f706-cd44-4396-be7c-e0ca3c7999a7", "z": 0, "config": { + "timeframe": "none", + "variables": [ + "{{variables.[All Object]}}" + ], "dataStream": { "pluginConfigId": "{{configId}}", "filter": { @@ -103,9 +108,9 @@ } }, "scope": { - "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"device\")).limit(500)", - "bindings": {}, - "queryDetail": {} + "variable": "{{variables.[All Object]}}", + "workspace": "{{workspaceId}}", + "scope": "{{scopes.[All Objects]}}" }, "_type": "tile/data-stream", "description": "", @@ -199,12 +204,12 @@ "displayMode": "actual", "xAxisData": "ConfigurationImpact_uniqueValues", "showTotals": false, - "yAxisLabel": "", + "yAxisLabel": "Count", "horizontalLayout": "vertical", "showValue": false, - "yAxisData": [], + "yAxisData": "count", "showYAxisLabel": true, - "xAxisLabel": "", + "xAxisLabel": "Configuration Impact", "legendPosition": "bottom", "showXAxisLabel": true } From 4ac539e1e54cad583391e6314d75907821fba709 Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 4 Jun 2026 13:26:56 +0100 Subject: [PATCH 26/49] chore: re-enable timeframes for recommendations --- .../v1/dataStreams/recommendations.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index 068d750a..f0000539 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -106,7 +106,19 @@ "value": "device" } }, - "timeframes": false, + "timeframes": [ + "last1hour", + "last12hours", + "last24hours", + "last7days", + "last30days", + "thisMonth", + "thisQuarter", + "thisYear", + "lastMonth", + "lastQuarter", + "lastYear" + ], "providesPluginDiagnostics": true, "tags": [] } \ No newline at end of file From dc135517324969b64d5548ab16a914f4595f7227 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 5 Jun 2026 08:42:57 +0100 Subject: [PATCH 27/49] fix: some things for vulns, recomms --- .../v1/dataStreams/Vulnerabilities.json | 41 ++++++++++++++++++- .../v1/dataStreams/recommendations.json | 1 + .../defaultContent/recommendations.dash.json | 7 +--- .../defaultContent/vulnerabilities.dash.json | 9 ++-- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json index 218c04ed..d197ca8b 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -21,15 +21,54 @@ "headers": [] }, "metadata": [ + { + "name": "CveGuide", + "displayName": "Cve Id", + "valueExpression": "{{ $['CveId'] ? `https://msrc.microsoft.com/update-guide/vulnerability/${$['CveId']}` : '' }}", + "shape": [ + "url", + { + "label": "{{column.CveId}}" + } + ], + "computed": true + }, + { + "name": "CveId", + "displayName": "CVE Id", + "shape": "string", + "visible": false, + "role": "label" + }, + { + "name": "VulnerabilitySeverityLevel", + "displayName": "Severity", + "shape": "string", + "role": "label" + }, + { + "name": "SoftwareName", + "displayName": "Affected Software", + "shape": "string", + "role": "label" + }, + { + "name": "CveTags", + "displayName": "Tags", + "shape": "string", + "role": "label" + }, { "sourceId": "DeviceId", "name": "DeviceName", "shape": "string", + "visible": false, "role": "label", "sourceType": "device" }, { - "pattern": ".*" + "pattern": ".*", + "visible": false } ], "matches": { diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index f0000539..9e9ef4df 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -119,6 +119,7 @@ "lastQuarter", "lastYear" ], + "supportsNoneTimeframe": true, "providesPluginDiagnostics": true, "tags": [] } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json index 157dc831..b5dddc3d 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json @@ -14,7 +14,6 @@ "i": "777d4030-bbb1-4d20-a362-eef301140a35", "z": 0, "config": { - "timeframe": "none", "variables": [ "{{variables.[All Object]}}" ], @@ -71,7 +70,6 @@ "i": "30f6f706-cd44-4396-be7c-e0ca3c7999a7", "z": 0, "config": { - "timeframe": "none", "variables": [ "{{variables.[All Object]}}" ], @@ -143,7 +141,6 @@ "i": "d2e6be29-4c2d-4cb6-8954-ce4d87c94f10", "z": 0, "config": { - "timeframe": "none", "variables": [ "{{variables.[All Object]}}" ], @@ -227,7 +224,6 @@ "i": "a501edac-6ed8-4835-a64c-a7579937f16a", "z": 0, "config": { - "timeframe": "none", "variables": [ "{{variables.[All Object]}}" ], @@ -292,5 +288,6 @@ }, "variables": [ "{{variables.[All Object]}}" - ] + ], + "timeframe": "last24hours" } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json index 6fdee491..47987659 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json @@ -39,7 +39,7 @@ }, "_type": "tile/data-stream", "description": "", - "monitorOld": { + "monitor": { "tileRollsUp": true, "monitorType": "threshold", "condition": { @@ -114,7 +114,7 @@ "scope": "{{scopes.[All Objects]}}" }, "_type": "tile/data-stream", - "monitorOld": { + "monitor": { "tileRollsUp": true, "monitorType": "threshold", "condition": { @@ -184,7 +184,7 @@ "scope": "{{scopes.[All Objects]}}" }, "_type": "tile/data-stream", - "monitorOld": { + "monitor": { "tileRollsUp": true, "monitorType": "threshold", "condition": { @@ -269,7 +269,7 @@ "scope": "{{scopes.[All Objects]}}" }, "_type": "tile/data-stream", - "monitorOld": { + "monitor": { "tileRollsUp": true, "monitorType": "threshold", "condition": { @@ -362,6 +362,7 @@ "data-stream-table": { "columnOrder": [ "CveId", + "CveGuide", "VulnerabilitySeverityLevel", "DeviceId", "SoftwareVendor", From 7773ca56fb9968984c1cb0134a255fec944964ed Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 9 Jun 2026 08:53:52 +0100 Subject: [PATCH 28/49] chore: rename title to Alert Name (alerts) --- plugins/MicrosoftDefender/v1/dataStreams/alerts.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index c9c8fa6b..9b6fd0c3 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -37,7 +37,7 @@ "metadata": [ { "name": "title", - "displayName": "Title", + "displayName": "Alert Name", "shape": "string", "role": "label" }, @@ -100,10 +100,6 @@ "displayName": "Assigned To", "shape": "string", "role": "label" - }, - { - "pattern": ".*", - "visible": false } ], "timeframes": [ From 2258fe936aca798c47068be1c6b8a0695e5c75c1 Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 9 Jun 2026 08:58:36 +0100 Subject: [PATCH 29/49] fix: remove hide-rest metadata --- .../v1/dataStreams/Vulnerabilities.json | 5 +---- plugins/MicrosoftDefender/v1/dataStreams/devices.json | 4 ---- .../MicrosoftDefender/v1/dataStreams/incidents.json | 4 ---- .../v1/dataStreams/recommendations.json | 11 +---------- 4 files changed, 2 insertions(+), 22 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json index d197ca8b..afd552e6 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -65,10 +65,6 @@ "visible": false, "role": "label", "sourceType": "device" - }, - { - "pattern": ".*", - "visible": false } ], "matches": { @@ -79,5 +75,6 @@ }, "timeframes": false, "providesPluginDiagnostics": true, + "objectLimit": 1, "tags": [] } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index 79e2bb5e..700b970f 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -126,10 +126,6 @@ } ], "name": "ExposureLevel" - }, - { - "pattern": ".*", - "visible": false } ], "matches": { diff --git a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json index 5d4b6189..a8526935 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json @@ -99,10 +99,6 @@ "displayName": "Creation time", "shape": "date", "role": "label" - }, - { - "pattern": ".*", - "visible": false } ], "timeframes": [ diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index 9e9ef4df..3d228057 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -53,12 +53,6 @@ "shape": "number", "role": "value" }, - { - "name": "ConfigurationImpact_uniqueValues", - "displayName": "Configuration Impact (Unique Values)", - "shape": "number", - "role": "value" - }, { "name": "count", "displayName": "Count", @@ -94,10 +88,6 @@ "displayName": "Is Compliant", "shape": "number", "role": "label" - }, - { - "pattern": ".*", - "visible": false } ], "matches": { @@ -121,5 +111,6 @@ ], "supportsNoneTimeframe": true, "providesPluginDiagnostics": true, + "objectLimit": 1, "tags": [] } \ No newline at end of file From 4fd3dab2d5344177d172ad8545febf0cce217055 Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 9 Jun 2026 11:13:21 +0100 Subject: [PATCH 30/49] feat: new OOB dashboards --- .../Devices/deviceStatus.dash.json | 276 +++----- .../v1/defaultContent/Devices/manifest.json | 8 +- .../defaultContent/Devices/overview.dash.json | 175 ----- .../{ => Devices}/recommendations.dash.json | 145 ++-- .../{ => Devices}/vulnerabilities.dash.json | 283 +++----- .../v1/defaultContent/cockpit.dash.json | 631 ++++++++++++++---- .../v1/defaultContent/devicesHealth.dash.json | 492 ++++++++++++++ .../v1/defaultContent/incidents.dash.json | 513 ++++++++++++++ .../v1/defaultContent/manifest.json | 4 +- .../v1/defaultContent/scopes.json | 14 +- 10 files changed, 1767 insertions(+), 774 deletions(-) delete mode 100644 plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json rename plugins/MicrosoftDefender/v1/defaultContent/{ => Devices}/recommendations.dash.json (71%) rename plugins/MicrosoftDefender/v1/defaultContent/{ => Devices}/vulnerabilities.dash.json (55%) create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/devicesHealth.dash.json create mode 100644 plugins/MicrosoftDefender/v1/defaultContent/incidents.dash.json diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json index 7d788bcd..c0ddd568 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json @@ -11,21 +11,21 @@ "h": 3, "x": 0, "y": 0, - "i": "a42fe41f-7cbd-42d0-b32e-6d68eb4f016f", + "i": "98f315c5-f78d-48e9-842e-836d7d63098a", "z": 0, "config": { "timeframe": "none", "variables": [ - "{{variables.[device]}}" + "{{variables.Device}}" ], "dataStream": { "name": "devices", "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[device]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[devices]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", @@ -52,12 +52,12 @@ "h": 3, "x": 1, "y": 0, - "i": "b606fb70-4a88-4fdf-9a19-dded55059092", + "i": "0f59ed31-bbb4-472a-9220-4236f5c95018", "z": 0, "config": { "timeframe": "none", "variables": [ - "{{variables.[device]}}" + "{{variables.Device}}" ], "dataStream": { "name": "devices", @@ -91,23 +91,23 @@ "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[device]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[devices]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Health State (Sensor)", + "title": "Sensor Health State", "visualisation": { "type": "data-stream-blocks", "config": { "data-stream-blocks": { "stateColumn": "SensorHealthState", "linkColumn": "DeviceName", - "labelColumn": "SensorHealthState[Expanded].rawState" + "labelColumn": "SensorHealthState" } } } @@ -120,33 +120,60 @@ "h": 3, "x": 2, "y": 0, - "i": "86c6198e-d8a3-456e-a014-fb14a079f058", + "i": "05a21c56-984c-453e-a8c0-e55c651e1921", "z": 0, "config": { "timeframe": "none", "variables": [ - "{{variables.[device]}}" + "{{variables.Device}}" ], "dataStream": { "name": "devices", + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [ + "Inactive" + ], + "unmonitored": [], + "error": [ + "ImpairedCommunication", + "NoSensorData", + "Misconfigured" + ], + "success": [ + "Active" + ], + "unknown": [ + "Unknown" + ] + } + } + ], + "name": "SensorHealthState" + } + ], "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[device]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[devices]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Asset Value", + "title": "Onboarding Status", "visualisation": { "type": "data-stream-scalar", "config": { "data-stream-scalar": { - "value": "AssetValue", + "value": "OnboardingStatus", "comparisonColumn": "none" } } @@ -160,21 +187,48 @@ "h": 3, "x": 3, "y": 0, - "i": "951c5d29-1b5c-4509-a83c-70e183ddc881", + "i": "e5bc7690-9906-4600-a679-7de954d1dab2", "z": 0, "config": { "timeframe": "none", "variables": [ - "{{variables.[device]}}" + "{{variables.Device}}" ], "dataStream": { "name": "devices", + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [ + "Inactive" + ], + "unmonitored": [], + "error": [ + "ImpairedCommunication", + "NoSensorData", + "Misconfigured" + ], + "success": [ + "Active" + ], + "unknown": [ + "Unknown" + ] + } + } + ], + "name": "SensorHealthState" + } + ], "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[device]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[devices]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", @@ -198,128 +252,51 @@ "w": 2, "moved": false, "h": 4, - "x": 2, + "x": 0, "y": 3, - "i": "384ae7b5-a86c-46eb-aa43-02057f67f2f3", + "i": "c6be8a43-3759-42bc-9a0e-4edcd654d044", "z": 0, "config": { "timeframe": "none", "variables": [ - "{{variables.[device]}}" + "{{variables.Device}}" ], "dataStream": { "name": "devices", "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[device]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[devices]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Device Properties", + "title": "Device Attributes", "visualisation": { "type": "data-stream-table", "config": { "data-stream-table": { "columnOrder": [ - "DeviceId", - "PublicIP", - "ConnectivityType", - "OSPlatform", - "OSBuild", - "OSArchitecture", - "OSVersion", - "OSDistribution", - "OSVersionInfo", - "OsBuildRevision", - "ClientVersion", - "HardwareUuid" + "DeviceCategory", + "DeviceType", + "AssetValue", + "OnboardingStatus" ], "hiddenColumns": [ - "@odata.context", - "mergedIntoMachineId", - "isPotentialDuplication", - "isExcluded", - "exclusionReason", - "firstSeen", - "lastSeen", - "healthStatus", - "deviceValue", - "rbacGroupId", - "rbacGroupName", - "riskScore", - "exposureLevel", - "isAadJoined", - "aadDeviceId", - "onboardingStatus", - "managedBy", - "managedByStatus", - "ipAddresses.0.ipAddress", - "ipAddresses.0.macAddress", - "ipAddresses.0.type", - "ipAddresses.0.operationalStatus", - "ipAddresses.1.ipAddress", - "ipAddresses.1.macAddress", - "ipAddresses.1.type", - "ipAddresses.1.operationalStatus", - "ipAddresses.2.ipAddress", - "ipAddresses.2.macAddress", - "ipAddresses.2.type", - "ipAddresses.2.operationalStatus", - "ipAddresses.3.ipAddress", - "ipAddresses.3.macAddress", - "ipAddresses.3.type", - "ipAddresses.3.operationalStatus", - "healthStatus[Expanded].rawState", - "computerDnsName", - "exposureLevel[Expanded].rawState", "Timestamp", "DeviceName", - "OSBuild@odata.type", - "IsAzureADJoined@odata.type", - "IsAzureADJoined", - "JoinType", + "PublicIP", + "OSPlatform", "AadDeviceId", - "LoggedOnUsers", - "RegistryDeviceTag", - "MachineGroup", - "ReportId@odata.type", - "ReportId", - "OnboardingStatus", - "AdditionalFields", - "DeviceCategory", - "DeviceType", - "DeviceSubtype", - "Model", - "Vendor", - "MergedDeviceIds", - "MergedToDeviceId", + "OSVersion", "SensorHealthState", - "IsExcluded@odata.type", - "IsExcluded", - "ExclusionReason", "ExposureLevel", - "AssetValue", "DeviceManualTags", "DeviceDynamicTags", - "CloudPlatforms", - "AzureVmId", - "AzureResourceId", - "AzureVmSubscriptionId", - "GcpFullResourceName", - "AwsResourceName", - "IsTransient@odata.type", - "IsTransient", - "HostDeviceId", - "MitigationStatus", - "FirmwareVersions", - "DiscoverySources", - "DlpInfo", "ExposureLevel[Expanded].rawState" ], "transpose": true @@ -333,105 +310,64 @@ "w": 2, "moved": false, "h": 4, - "x": 0, + "x": 2, "y": 3, - "i": "b0526c96-e0ea-4028-b44b-13c120e5ae83", + "i": "4907e9c9-db39-4c9c-bd84-d14ad43c753d", "z": 0, "config": { "timeframe": "none", "variables": [ - "{{variables.[device]}}" + "{{variables.Device}}" ], "dataStream": { "name": "devices", "id": "{{dataStreams.devices}}" }, "scope": { - "variable": "{{variables.[device]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[devices]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Device Attributes", + "title": "Device Properties", "visualisation": { "type": "data-stream-table", "config": { "data-stream-table": { + "columnOrder": [ + "PublicIP", + "OSPlatform", + "OSVersion" + ], "hiddenColumns": [ - "DeviceId", "Timestamp", "DeviceName", - "ClientVersion", - "PublicIP", - "OSArchitecture", - "OSBuild@odata.type", - "OSBuild", - "IsAzureADJoined@odata.type", - "IsAzureADJoined", "AadDeviceId", - "LoggedOnUsers", - "RegistryDeviceTag", - "ReportId@odata.type", - "ReportId", - "AdditionalFields", - "DeviceSubtype", - "Model", - "Vendor", - "OSDistribution", - "OSVersionInfo", - "MergedDeviceIds", - "MergedToDeviceId", + "OnboardingStatus", + "DeviceCategory", + "DeviceType", "SensorHealthState", - "IsExcluded@odata.type", - "IsExcluded", - "ExclusionReason", "ExposureLevel", + "AssetValue", "DeviceManualTags", "DeviceDynamicTags", - "HardwareUuid", - "CloudPlatforms", - "AzureVmId", - "AzureResourceId", - "AzureVmSubscriptionId", - "GcpFullResourceName", - "AwsResourceName", - "IsTransient@odata.type", - "IsTransient", - "OsBuildRevision", - "HostDeviceId", - "ConnectivityType", - "DiscoverySources", - "FirmwareVersions", - "ExposureLevel[Expanded].rawState", - "OSPlatform", - "OSVersion", - "DlpInfo" - ], - "transpose": true, - "columnOrder": [ - "DeviceCategory", - "DeviceType", - "AssetValue", - "JoinType", - "MachineGroup", - "OnboardingStatus", - "MitigationStatus" + "ExposureLevel[Expanded].rawState" ], - "columnDisplayNames": {} + "transpose": true } } } } } ], - "version": 42, + "version": 29, "columns": 4 }, "variables": [ - "{{variables.[device]}}" + "{{variables.Device}}" ] } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json index 4b56ba1b..f42d7f91 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/manifest.json @@ -1,11 +1,15 @@ { "items": [ { - "name": "overview", + "name": "deviceStatus", "type": "dashboard" }, { - "name": "deviceStatus", + "name": "vulnerabilities", + "type": "dashboard" + }, + { + "name": "recommendations", "type": "dashboard" } ] diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json deleted file mode 100644 index 0cba9bd7..00000000 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/overview.dash.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "name": "Overview", - "schemaVersion": "1.5", - "dashboard": { - "_type": "layout/grid", - "contents": [ - { - "static": false, - "w": 4, - "moved": false, - "h": 3, - "x": 0, - "y": 0, - "i": "a42fe41f-7cbd-42d0-b32e-6d68eb4f016f", - "z": 0, - "config": { - "timeframe": "none", - "variables": [ - "{{variables.[All Object]}}" - ], - "dataStream": { - "name": "devices", - "id": "{{dataStreams.devices}}", - "sort": { - "by": [ - [ - "ExposureLevel", - "desc" - ] - ] - } - }, - "scope": { - "variable": "{{variables.[All Object]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Exposure Level", - "visualisation": { - "type": "data-stream-blocks", - "config": { - "data-stream-blocks": { - "stateColumn": "ExposureLevel", - "linkColumn": "DeviceName", - "sublabel": "ExposureLevel[Expanded].rawState", - "columns": 3, - "labelColumn": "DeviceName" - } - } - } - } - }, - { - "static": false, - "w": 4, - "moved": false, - "h": 4, - "x": 0, - "y": 3, - "i": "e5ec8d5c-4184-46cb-8c61-94913be88729", - "z": 0, - "config": { - "timeframe": "none", - "variables": [ - "{{variables.[All Object]}}" - ], - "dataStream": { - "name": "devices", - "filter": { - "multiOperation": "and", - "filters": [] - }, - "id": "{{dataStreams.devices}}", - "sort": { - "by": [ - [ - "DeviceName", - "asc" - ] - ] - } - }, - "scope": { - "variable": "{{variables.[All Object]}}", - "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" - }, - "_type": "tile/data-stream", - "description": "", - "activePluginConfigIds": [ - "{{configId}}" - ], - "title": "Properties", - "visualisation": { - "type": "data-stream-table", - "config": { - "data-stream-table": { - "columnOrder": [ - "DeviceId", - "Timestamp", - "DeviceName", - "ClientVersion", - "PublicIP", - "OSArchitecture", - "OSPlatform", - "OSBuild@odata.type", - "OSBuild", - "IsAzureADJoined@odata.type", - "IsAzureADJoined", - "JoinType", - "AadDeviceId", - "LoggedOnUsers", - "RegistryDeviceTag", - "OSVersion", - "MachineGroup", - "ReportId@odata.type", - "ReportId", - "OnboardingStatus", - "AdditionalFields", - "DeviceCategory", - "DeviceType", - "DeviceSubtype", - "Model", - "Vendor", - "OSDistribution", - "OSVersionInfo", - "MergedDeviceIds", - "MergedToDeviceId", - "SensorHealthState", - "IsExcluded@odata.type", - "IsExcluded", - "ExclusionReason", - "ExposureLevel", - "AssetValue", - "DeviceManualTags", - "DeviceDynamicTags", - "HardwareUuid", - "CloudPlatforms", - "AzureVmId", - "AzureResourceId", - "AzureVmSubscriptionId", - "GcpFullResourceName", - "AwsResourceName", - "IsTransient@odata.type", - "IsTransient", - "OsBuildRevision", - "HostDeviceId", - "MitigationStatus", - "ConnectivityType", - "DiscoverySources", - "FirmwareVersions", - "DlpInfo", - "IsInternetFacing@odata.type", - "IsInternetFacing", - "ExposureLevel[Expanded].rawState" - ], - "hiddenColumns": [] - } - } - } - } - } - ], - "version": 22, - "columns": 4 - }, - "variables": [ - "{{variables.[All Object]}}" - ] -} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json similarity index 71% rename from plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json rename to plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json index b5dddc3d..478501b0 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/recommendations.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json @@ -8,38 +8,39 @@ "static": false, "w": 1, "moved": false, + "h": 3, "x": 0, - "h": 2, "y": 0, - "i": "777d4030-bbb1-4d20-a362-eef301140a35", + "i": "f753e7e8-812e-4524-8b28-e22c6f0b7a65", "z": 0, "config": { + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { - "pluginConfigId": "{{configId}}", + "name": "recommendations", "filter": { "multiOperation": "and", "filters": [ { - "column": "IsCompliant", + "column": "IsApplicable", "operation": "equals", - "value": "0" + "value": "1" }, { - "column": "IsApplicable", + "column": "IsCompliant", "operation": "equals", - "value": "1" + "value": "0" } ] }, "id": "{{dataStreams.recommendations}}" }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", @@ -64,68 +65,52 @@ "static": false, "w": 1, "moved": false, + "h": 3, "x": 1, - "h": 2, "y": 0, - "i": "30f6f706-cd44-4396-be7c-e0ca3c7999a7", + "i": "b373bee3-288a-484a-9513-f97a0da2358a", "z": 0, "config": { + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { - "pluginConfigId": "{{configId}}", + "name": "recommendations", "filter": { "multiOperation": "and", "filters": [ { - "column": "IsCompliant", + "column": "IsApplicable", "operation": "equals", - "value": "0" + "value": "1" }, { - "column": "IsApplicable", + "column": "IsCompliant", "operation": "equals", - "value": "1" + "value": "0" } ] }, - "id": "{{dataStreams.recommendations}}", - "group": { - "by": [ - [ - "ConfigurationCategory", - "uniqueValues" - ] - ], - "aggregate": [ - { - "type": "count" - } - ] - } + "id": "{{dataStreams.recommendations}}" }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", - "description": "", + "description": "Active Recommendations", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Category", + "title": "Configuration Category", "visualisation": { "type": "data-stream-donut-chart", "config": { "data-stream-donut-chart": { - "valueColumn": "count", - "hideCenterValue": false, - "showValuesAsPercentage": false, - "legendPosition": "right", - "legendMode": "table", - "labelColumn": "ConfigurationCategory_uniqueValues" + "valueColumn": "builtin_count_by_label", + "labelColumn": "ConfigurationCategory" } } } @@ -135,14 +120,15 @@ "static": false, "w": 1, "moved": false, + "h": 3, "x": 2, - "h": 2, "y": 0, - "i": "d2e6be29-4c2d-4cb6-8954-ce4d87c94f10", + "i": "2064c456-ed58-4cff-9b69-ab3b47d34726", "z": 0, "config": { + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { "name": "recommendations", @@ -162,6 +148,14 @@ ] }, "id": "{{dataStreams.recommendations}}", + "sort": { + "by": [ + [ + "ConfigurationImpact_uniqueValues", + "asc" + ] + ] + }, "group": { "by": [ [ @@ -177,20 +171,23 @@ } }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", - "description": "On active recommendations", + "description": "Active Recommendations", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Configuration Impact (Severity Score)", + "title": "Configuration Impact", "visualisation": { "type": "data-stream-bar-chart", "config": { "data-stream-bar-chart": { + "color": { + "type": "default" + }, "xAxisGroup": "none", "showLegend": false, "range": { @@ -201,14 +198,14 @@ "displayMode": "actual", "xAxisData": "ConfigurationImpact_uniqueValues", "showTotals": false, - "yAxisLabel": "Count", + "yAxisLabel": "", "horizontalLayout": "vertical", "showValue": false, - "yAxisData": "count", - "showYAxisLabel": true, - "xAxisLabel": "Configuration Impact", + "yAxisData": [], + "showYAxisLabel": false, + "xAxisLabel": "", "legendPosition": "bottom", - "showXAxisLabel": true + "showXAxisLabel": false } } } @@ -218,38 +215,24 @@ "static": false, "w": 3, "moved": false, + "h": 3, "x": 0, - "h": 4, - "y": 2, - "i": "a501edac-6ed8-4835-a64c-a7579937f16a", + "y": 3, + "i": "2a620d25-e329-46b7-8614-80f5dba3eb50", "z": 0, "config": { + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { "name": "recommendations", - "filter": { - "multiOperation": "and", - "filters": [ - { - "column": "IsApplicable", - "operation": "equals", - "value": "1" - }, - { - "column": "IsCompliant", - "operation": "equals", - "value": "0" - } - ] - }, "id": "{{dataStreams.recommendations}}" }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", @@ -262,18 +245,15 @@ "config": { "data-stream-table": { "columnOrder": [ - "DeviceId", "DeviceName", "Timestamp", - "ConfigurationId", "ConfigurationName", "ConfigurationCategory", "ConfigurationSubcategory", + "ConfigurationImpact", "RiskDescription", "RemediationOptions", - "IsApplicable@odata.type", "IsApplicable", - "IsCompliant@odata.type", "IsCompliant" ], "hiddenColumns": [] @@ -283,11 +263,10 @@ } } ], - "version": 42, + "version": 19, "columns": 3 }, "variables": [ - "{{variables.[All Object]}}" - ], - "timeframe": "last24hours" + "{{variables.Device}}" + ] } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/vulnerabilities.dash.json similarity index 55% rename from plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json rename to plugins/MicrosoftDefender/v1/defaultContent/Devices/vulnerabilities.dash.json index 47987659..ff7af60f 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/vulnerabilities.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/vulnerabilities.dash.json @@ -11,15 +11,15 @@ "h": 3, "x": 0, "y": 0, - "i": "7c498c96-9efb-46fd-8b06-9d0970b51b45", + "i": "ba3fec23-7b56-467a-968b-a3d7ac40131a", "z": 0, "config": { - "timeframe": "last24hours", + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { - "pluginConfigId": "{{configId}}", + "name": "Vulnerabilities", "filter": { "multiOperation": "and", "filters": [ @@ -33,36 +33,12 @@ "id": "{{dataStreams.Vulnerabilities}}" }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "DeviceName", - "frequency": 15 - }, "activePluginConfigIds": [ "{{configId}}" ], @@ -87,15 +63,15 @@ "h": 3, "x": 1, "y": 0, - "i": "7a35db77-a19d-4b51-9712-f45e6cfe0004", + "i": "616926fc-3f28-439e-9583-f0e457c52f25", "z": 0, "config": { - "timeframe": "last24hours", + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { - "pluginConfigId": "{{configId}}", + "name": "Vulnerabilities", "filter": { "multiOperation": "and", "filters": [ @@ -109,35 +85,11 @@ "id": "{{dataStreams.Vulnerabilities}}" }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "DeviceName", - "frequency": 15 - }, "description": "", "activePluginConfigIds": [ "{{configId}}" @@ -163,66 +115,88 @@ "h": 3, "x": 2, "y": 0, - "i": "ecca69a0-eb1c-4433-8ba7-e90cad89d561", + "i": "4176c082-3de9-45c9-be46-3cf088dfa591", "z": 0, "config": { - "timeframe": "last24hours", + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { - "pluginConfigId": "{{configId}}", + "name": "Vulnerabilities", "filter": { "multiOperation": "and", "filters": [] }, - "id": "{{dataStreams.Vulnerabilities}}" + "id": "{{dataStreams.Vulnerabilities}}", + "group": { + "by": [ + [ + "VulnerabilitySeverityLevel", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + } }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "DeviceName", - "frequency": 15 - }, "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Software", + "title": "Severity", "visualisation": { - "type": "data-stream-donut-chart", + "type": "data-stream-bar-chart", "config": { - "data-stream-donut-chart": { - "valueColumn": "builtin_count_by_label", - "hideCenterValue": false, - "showValuesAsPercentage": false, - "legendPosition": "right", - "legendMode": "table", - "labelColumn": "SoftwareName" + "data-stream-bar-chart": { + "color": { + "type": "custom", + "customColors": [ + { + "color": "#88898C", + "expression": "label == \"Low\"" + }, + { + "color": "#E18700", + "expression": "label == \"Medium\"\n" + }, + { + "color": "#DE0038", + "expression": "label == \"High\"" + }, + { + "color": "#000000", + "expression": "label == \"Critical\"" + } + ] + }, + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "VulnerabilitySeverityLevel_uniqueValues", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": true, + "yAxisData": [], + "showYAxisLabel": false, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": false } } } @@ -235,93 +209,42 @@ "h": 3, "x": 3, "y": 0, - "i": "b0385f1f-3367-4721-83cd-b3dc44a0734f", + "i": "5064ef8f-2179-4940-8bee-b5be1b3075f3", "z": 0, "config": { - "timeframe": "last24hours", + "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { - "pluginConfigId": "{{configId}}", + "name": "Vulnerabilities", "filter": { "multiOperation": "and", "filters": [] }, "id": "{{dataStreams.Vulnerabilities}}", "group": { - "by": [ - [ - "VulnerabilitySeverityLevel", - "uniqueValues" - ] - ], - "aggregate": [ - { - "type": "count" - } - ] + "by": [], + "aggregate": [] } }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "DeviceName", - "frequency": 15 - }, "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Severity", + "title": "Affected Software", "visualisation": { - "type": "data-stream-bar-chart", + "type": "data-stream-donut-chart", "config": { - "data-stream-bar-chart": { - "xAxisGroup": "none", - "showLegend": false, - "range": { - "type": "auto" - }, - "showGrid": true, - "grouping": false, - "displayMode": "actual", - "xAxisData": "VulnerabilitySeverityLevel_uniqueValues", - "showTotals": false, - "yAxisLabel": "", - "horizontalLayout": "vertical", - "showValue": false, - "yAxisData": [ - "count" - ], - "showYAxisLabel": true, - "xAxisLabel": "", - "legendPosition": "bottom", - "showXAxisLabel": true + "data-stream-donut-chart": { + "valueColumn": "builtin_count_by_label", + "labelColumn": "SoftwareName" } } } @@ -334,51 +257,41 @@ "h": 3, "x": 0, "y": 3, - "i": "eb36c383-0ca3-4d60-8e0d-c09c0ec2e6d8", + "i": "5f9a4a61-733d-4581-983b-21357aaab840", "z": 0, "config": { "timeframe": "none", "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ], "dataStream": { "name": "Vulnerabilities", "id": "{{dataStreams.Vulnerabilities}}" }, "scope": { - "variable": "{{variables.[All Object]}}", + "variable": "{{variables.Device}}", "workspace": "{{workspaceId}}", - "scope": "{{scopes.[All Objects]}}" + "scope": "{{scopes.Devices}}" }, "_type": "tile/data-stream", "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "List", + "title": "Vulnerabilities", "visualisation": { "type": "data-stream-table", "config": { "data-stream-table": { "columnOrder": [ - "CveId", - "CveGuide", - "VulnerabilitySeverityLevel", - "DeviceId", - "SoftwareVendor", "SoftwareName", - "SoftwareVersion", - "RecommendedSecurityUpdateId" + "VulnerabilitySeverityLevel", + "CveTags", + "CveGuide" ], "hiddenColumns": [ "DeviceName", - "OSPlatform", - "OSVersion", - "OSArchitecture", - "AadDeviceId", - "RecommendedSecurityUpdate", - "CveTags@odata.type", - "CveMitigationStatus" + "CveId" ] } } @@ -386,10 +299,10 @@ } } ], - "version": 42, + "version": 22, "columns": 4 }, "variables": [ - "{{variables.[All Object]}}" + "{{variables.Device}}" ] } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json index 6cf57002..e9438372 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json @@ -11,7 +11,7 @@ "h": 2, "x": 0, "y": 0, - "i": "7a6ca038-e744-488e-8f2f-ad3d86b4e42d", + "i": "fa1468d7-af16-4947-ba21-d6628350c862", "z": 0, "config": { "timeframe": "none", @@ -55,11 +55,55 @@ "h": 2, "x": 2, "y": 0, - "i": "bc314cab-b69a-4379-920a-872a3b005c66", + "i": "b32a8d16-cf6f-47d5-a93b-1169ef209f28", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "secureScoreHistory", + "filter": { + "multiOperation": "and", + "filters": [] + }, + "id": "{{dataStreams.secureScoreHistory}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Secure Score History", + "visualisation": { + "type": "data-stream-line-graph", + "config": { + "data-stream-line-graph": { + "showYAxisLabel": false, + "seriesColumn": "averageComparativeScores", + "showTrendLine": true, + "xAxisColumn": "createdDateTime", + "yAxisColumn": [ + "currentScore" + ], + "showXAxisLabel": false + } + } + } + } + }, + { + "static": false, + "w": 2, + "moved": false, + "h": 2, + "x": 0, + "y": 2, + "i": "635e0de1-af29-4660-aa68-ddc5dd58e0c4", "z": 0, "config": { "dataStream": { "pluginConfigId": "{{configId}}", + "name": "devices", "id": "{{dataStreams.devices}}", "group": { "by": [ @@ -90,6 +134,27 @@ "type": "data-stream-bar-chart", "config": { "data-stream-bar-chart": { + "color": { + "type": "custom", + "customColors": [ + { + "color": "#88898C", + "expression": "label == \"Unknown\"" + }, + { + "color": "#E18700", + "expression": "label == \"Warning\"" + }, + { + "color": "#DE0038", + "expression": "label == \"Error\"" + }, + { + "color": "#259A51", + "expression": "label == \"Success\"" + } + ] + }, "xAxisGroup": "none", "showLegend": false, "range": { @@ -99,17 +164,17 @@ "grouping": false, "displayMode": "actual", "xAxisData": "ExposureLevel_uniqueValues", - "showTotals": true, + "showTotals": false, "yAxisLabel": "", "horizontalLayout": "vertical", - "showValue": false, + "showValue": true, "yAxisData": [ "count" ], - "showYAxisLabel": true, + "showYAxisLabel": false, "xAxisLabel": "", "legendPosition": "bottom", - "showXAxisLabel": true + "showXAxisLabel": false } } } @@ -117,57 +182,150 @@ }, { "static": false, - "w": 1, + "w": 2, "moved": false, "h": 2, - "x": 0, + "x": 2, "y": 2, - "i": "fe0118a8-d043-4bb4-9907-10b1b29cd486", + "i": "4cf492d2-b288-43fb-a730-57875982e71a", "z": 0, "config": { - "timeframe": "last24hours", + "timeframe": "none", "dataStream": { - "name": "advancedHuntingQuery", + "name": "incidents", "dataSourceConfig": { - "query": "DeviceEvents\r\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\r\n| project Timestamp, DeviceName, ActionType" + "timeframeCol": "createdDateTime", + "status": [ + "active" + ] + }, + "id": "{{dataStreams.incidents}}", + "group": { + "by": [ + [ + "severity", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] }, - "id": "{{dataStreams.advancedHuntingQuery}}", "pluginConfigId": "{{configId}}" }, "_type": "tile/data-stream", "description": "", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Active Incidents", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "color": { + "type": "custom", + "customColors": [ + { + "color": "#88898C", + "expression": "label == \"informational\"" + }, + { + "color": "#0075FF", + "expression": "label == \"low\"" + }, + { + "color": "#E18700", + "expression": "label == \"medium\"" + }, + { + "color": "#DE0038", + "expression": "label == \"high\"" + } + ] + }, + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "severity_uniqueValues", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": true, + "yAxisData": [ + "count" + ], + "showYAxisLabel": false, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": false } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 4, + "i": "02439a74-6d88-49f7-abc5-3a4a19a32a72", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\n| where ActionType startswith \"AppControl\"\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" + ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 + "pluginConfigId": "{{configId}}" }, + "_type": "tile/data-stream", + "description": "", "activePluginConfigIds": [ "{{configId}}" ], - "title": "Malware & Antivirus Detected", + "title": "Application Control", "visualisation": { "type": "data-stream-scalar", "config": { - "data-stream-scalar": {} + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none", + "label": "devices" + } } } } @@ -177,46 +335,101 @@ "w": 1, "moved": false, "h": 2, - "x": 1, - "y": 2, - "i": "cf2d60f6-b7cf-4602-bd3c-70f1ef215514", + "x": 3, + "y": 4, + "i": "118cffa0-90d8-42cf-9d13-5776a1ae47ce", "z": 0, "config": { - "timeframe": "last24hours", "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\r\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\r\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"ExploitGuardNetworkProtectionBlocked\",\"ExploitGuardNonMicrosoftSignedBlocked\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" + ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, "pluginConfigId": "{{configId}}" }, "_type": "tile/data-stream", "description": "", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Exploits", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none", + "label": "devices" } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 4, + "i": "18116acd-6097-4b27-a0f3-9d8cee0c7611", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\n| project Timestamp, DeviceName, ActionType" }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" + ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, + "pluginConfigId": "{{configId}}" }, + "_type": "tile/data-stream", + "description": "", "activePluginConfigIds": [ "{{configId}}" ], @@ -228,7 +441,8 @@ "value": { "type": "count" }, - "comparisonColumn": "none" + "comparisonColumn": "none", + "label": "devices" } } } @@ -239,50 +453,46 @@ "w": 1, "moved": false, "h": 2, - "x": 2, - "y": 2, - "i": "cf1f3273-caa3-4b96-9e1f-b70c8a207214", + "x": 0, + "y": 4, + "i": "6aa1942a-8390-4023-9454-b5accc992f77", "z": 0, "config": { - "timeframe": "last24hours", "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\r\n| where ActionType startswith \"AppControl\"\r\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" + ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, "pluginConfigId": "{{configId}}" }, "_type": "tile/data-stream", "description": "", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" - ] - } - }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 - }, "activePluginConfigIds": [ "{{configId}}" ], - "title": "Application Control", + "title": "Malware & Antivirus Detected", "visualisation": { "type": "data-stream-scalar", "config": { @@ -290,7 +500,8 @@ "value": { "type": "count" }, - "comparisonColumn": "none" + "comparisonColumn": "none", + "label": "devices" } } } @@ -301,58 +512,173 @@ "w": 1, "moved": false, "h": 2, - "x": 3, - "y": 2, - "i": "21756e83-fc0c-47a8-98f7-7e96e765662b", + "x": 1, + "y": 6, + "i": "b94c9951-c17a-40b1-856f-f9a669d8ac44", "z": 0, "config": { - "timeframe": "last24hours", "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\r\n| where ActionType in (\"ExploitGuardNetworkProtectionBlocked\",\"ExploitGuardNonMicrosoftSignedBlocked\")\r\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" + ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, "pluginConfigId": "{{configId}}" }, "_type": "tile/data-stream", "description": "", - "monitor": { - "tileRollsUp": true, - "monitorType": "threshold", - "condition": { - "columns": [], - "logic": { - "if": [ - { - ">": [ - { - "var": "count" - }, - 0 - ] - }, - "error" + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Persistence & Privilege Escalation", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "DeviceName_uniqueValues", + "count" + ], + "hiddenColumns": [] + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 6, + "i": "82ea55ee-eb36-4426-9ffc-a3af01c97297", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\n| where ActionType startswith \"AppControl\"\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Application Control", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "DeviceName_uniqueValues", + "count" + ], + "hiddenColumns": [] } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 6, + "i": "78729826-2fb5-4879-b90d-6be92c3cca55", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\n| where ActionType in (\"ExploitGuardNetworkProtectionBlocked\",\"ExploitGuardNonMicrosoftSignedBlocked\")\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" + ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] }, - "_type": "simple", - "aggregation": "count", - "groupBy": "__group_by_none__", - "frequency": 15 + "pluginConfigId": "{{configId}}" }, + "_type": "tile/data-stream", + "description": "", "activePluginConfigIds": [ "{{configId}}" ], "title": "Exploits", "visualisation": { - "type": "data-stream-scalar", + "type": "data-stream-table", "config": { - "data-stream-scalar": { - "value": { - "type": "count" - }, - "comparisonColumn": "none" + "data-stream-table": { + "columnOrder": [ + "DeviceName_uniqueValues", + "count" + ], + "hiddenColumns": [] } } } @@ -360,18 +686,41 @@ }, { "static": false, - "w": 4, + "w": 1, "moved": false, "h": 2, "x": 0, - "y": 4, - "i": "5c32f4c0-9729-42dd-b3c4-c057f9547092", + "y": 6, + "i": "3b81144e-1593-4d20-a786-aa4341398f66", "z": 0, "config": { - "timeframe": "none", "dataStream": { - "name": "secureScoreHistory", - "id": "{{dataStreams.secureScoreHistory}}", + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceEvents\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\n| project Timestamp, DeviceName, ActionType" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "count", + "desc" + ] + ] + }, + "group": { + "by": [ + [ + "DeviceName", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, "pluginConfigId": "{{configId}}" }, "_type": "tile/data-stream", @@ -379,28 +728,20 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Secure Score History", + "title": "Malware & Antivirus Detected", "visualisation": { - "type": "data-stream-line-graph", + "type": "data-stream-table", "config": { - "data-stream-line-graph": { - "yAxisLabel": "Secure Score", - "xAxisColumn": "createdDateTime", - "seriesColumn": "none", - "xAxisLabel": "Date", - "dataPoints": false, - "showTrendLine": true, - "yAxisRangeMode": "auto", - "yAxisColumn": [ - "currentScore" - ] + "data-stream-table": { + "columnOrder": [], + "hiddenColumns": [] } } } } } ], - "version": 49, + "version": 68, "columns": 4 } } \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/devicesHealth.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/devicesHealth.dash.json new file mode 100644 index 00000000..e968dce3 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/devicesHealth.dash.json @@ -0,0 +1,492 @@ +{ + "name": "Devices Health", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "17f5c681-d30b-4dfe-ad32-0b8ebbfadc5a", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceInfo\n| summarize arg_max(Timestamp, *) by DeviceId\n| where ExposureLevel in (\"High\")" + }, + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [ + "Medium" + ], + "unmonitored": [], + "error": [ + "High" + ], + "success": [], + "unknown": [ + "Unknown", + "Low" + ] + } + } + ], + "name": "ExposureLevel" + }, + { + "pattern": ".*" + } + ], + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "High Exposure", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none", + "label": "devices" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 0, + "i": "6fd231eb-57c4-4dd5-b242-37169d481380", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceInfo\n| summarize arg_max(Timestamp, *) by DeviceId\n| where ExposureLevel in (\"Medium\")" + }, + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [ + "Medium" + ], + "unmonitored": [], + "error": [ + "High" + ], + "success": [], + "unknown": [ + "Unknown", + "Low" + ] + } + } + ], + "name": "ExposureLevel" + }, + { + "pattern": ".*" + } + ], + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Medium Exposure", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none", + "label": "devices" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 0, + "i": "dbfc745f-2a9e-4da0-a0a4-00b465d15382", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceTvmSoftwareVulnerabilities\n| where VulnerabilitySeverityLevel == \"Critical\"\n| summarize Count = count() by DeviceId, DeviceName, VulnerabilitySeverityLevel" + }, + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [], + "unmonitored": [], + "error": [ + "Critical" + ], + "success": [], + "unknown": [] + } + } + ], + "name": "VulnerabilitySeverityLevel" + }, + { + "pattern": ".*" + } + ], + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Critical Vulnerabilities", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none", + "label": "devices" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 3, + "y": 0, + "i": "dae977f8-62ec-494e-96fd-4c52a40ffdc1", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceTvmSecureConfigurationAssessment\n| where IsApplicable == 1 and IsCompliant == 0\n| join kind=leftouter (\n DeviceTvmSecureConfigurationAssessmentKB\n | project ConfigurationId, ConfigurationImpact\n) on ConfigurationId\n| summarize FailingChecks = count(), AvgImpact = round(avg(ConfigurationImpact), 1) by DeviceId, DeviceName\n| sort by AvgImpact desc" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Non-Compliant Devices", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": { + "type": "count" + }, + "comparisonColumn": "none", + "label": "devices" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 0, + "y": 2, + "i": "330e04e3-66e2-4fc0-b039-68e98a5cea54", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceInfo\n| summarize arg_max(Timestamp, *) by DeviceId\n| where ExposureLevel in (\"High\")" + }, + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [ + "Medium" + ], + "unmonitored": [], + "error": [ + "High" + ], + "success": [], + "unknown": [ + "Unknown", + "Low" + ] + } + } + ], + "name": "ExposureLevel" + }, + { + "pattern": ".*" + } + ], + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "DeviceName", + "asc" + ] + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "High Exposure", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "ExposureLevel", + "linkColumn": "none", + "columns": 1, + "labelColumn": "DeviceName" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 1, + "y": 2, + "i": "7e0232af-99a7-4aab-8cac-de8fb32f5bb2", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceInfo\n| summarize arg_max(Timestamp, *) by DeviceId\n| where ExposureLevel in (\"Medium\")" + }, + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [ + "Medium" + ], + "unmonitored": [], + "error": [ + "High" + ], + "success": [], + "unknown": [ + "Unknown", + "Low" + ] + } + } + ], + "name": "ExposureLevel" + }, + { + "pattern": ".*" + } + ], + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "DeviceName", + "asc" + ] + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Medium Exposure", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "ExposureLevel", + "linkColumn": "none", + "columns": 1, + "labelColumn": "DeviceName" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 2, + "y": 2, + "i": "9c474d31-5530-47d6-9b7e-2b4f6240dbac", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceTvmSoftwareVulnerabilities\n| where VulnerabilitySeverityLevel == \"Critical\"\n| summarize Count = count() by DeviceId, DeviceName, VulnerabilitySeverityLevel" + }, + "metadata": [ + { + "shape": [ + "state", + { + "map": { + "warning": [], + "unmonitored": [], + "error": [ + "Critical" + ], + "success": [], + "unknown": [] + } + } + ], + "name": "VulnerabilitySeverityLevel" + }, + { + "pattern": ".*" + } + ], + "id": "{{dataStreams.advancedHuntingQuery}}", + "sort": { + "by": [ + [ + "DeviceName", + "asc" + ] + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Critical Vulnerabilities", + "visualisation": { + "type": "data-stream-blocks", + "config": { + "data-stream-blocks": { + "stateColumn": "VulnerabilitySeverityLevel", + "linkColumn": "none", + "columns": 1, + "labelColumn": "DeviceId" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 3, + "y": 2, + "i": "2d5b3575-9c94-4578-9365-4b145bb0e505", + "z": 0, + "config": { + "dataStream": { + "name": "advancedHuntingQuery", + "dataSourceConfig": { + "query": "DeviceTvmSecureConfigurationAssessment\n| where IsApplicable == 1 and IsCompliant == 0\n| join kind=leftouter (\n DeviceTvmSecureConfigurationAssessmentKB\n | project ConfigurationId, ConfigurationImpact\n) on ConfigurationId\n| summarize FailingChecks = count(), AvgImpact = round(avg(ConfigurationImpact), 1) by DeviceId, DeviceName\n| sort by AvgImpact desc" + }, + "id": "{{dataStreams.advancedHuntingQuery}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Non-Compliant Devices", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "DeviceName", + "FailingChecks", + "AvgImpact" + ], + "hiddenColumns": [ + "DeviceId", + "FailingChecks@odata.type" + ] + } + } + } + } + } + ], + "version": 74, + "columns": 4 + } +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/incidents.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/incidents.dash.json new file mode 100644 index 00000000..66922d74 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/defaultContent/incidents.dash.json @@ -0,0 +1,513 @@ +{ + "name": "Incidents", + "schemaVersion": "1.5", + "dashboard": { + "_type": "layout/grid", + "contents": [ + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 0, + "y": 0, + "i": "e3f824fc-1347-4f89-804c-6a303dd9a0b6", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "incidents", + "dataSourceConfig": { + "timeframeCol": "createdDateTime", + "status": [ + "active" + ] + }, + "id": "{{dataStreams.incidents}}", + "group": { + "by": [ + [ + "severity", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Active Incidents", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "color": { + "type": "custom", + "customColors": [ + { + "color": "#88898C", + "expression": "label == \"informational\"" + }, + { + "color": "#0075FF", + "expression": "label == \"low\"" + }, + { + "color": "#E18700", + "expression": "label == \"medium\"" + }, + { + "color": "#DE0038", + "expression": "label == \"high\"" + } + ] + }, + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "severity_uniqueValues", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": true, + "yAxisData": [ + "count" + ], + "showYAxisLabel": false, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 1, + "y": 0, + "i": "16aaf8ad-3716-4ebe-a7f5-0266e6dc43e3", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "incidents", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "assignedTo", + "operation": "empty" + } + ] + }, + "dataSourceConfig": { + "timeframeCol": "createdDateTime", + "status": [ + "active" + ] + }, + "id": "{{dataStreams.incidents}}", + "group": { + "by": [ + [ + "assignedTo", + "uniqueValues" + ] + ], + "aggregate": [ + { + "type": "count" + } + ] + }, + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Unassigned Incidents", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "color": { + "type": "custom", + "customColors": [ + { + "color": "#88898C", + "expression": "label == \"informational\"" + }, + { + "color": "#0075FF", + "expression": "label == \"low\"" + }, + { + "color": "#E18700", + "expression": "label == \"medium\"" + }, + { + "color": "#DE0038", + "expression": "label == \"high\"" + } + ] + }, + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "severity_uniqueValues", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": true, + "yAxisData": [ + "count" + ], + "showYAxisLabel": false, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": false + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 3, + "x": 2, + "y": 0, + "i": "60e82d47-1bac-4f2e-9092-5f4d3fecda1b", + "z": 0, + "config": { + "timeframe": "last30days", + "dataStream": { + "dataSourceConfig": { + "version": "2.0", + "tables": [ + { + "config": { + "timeframe": "last30days", + "activePluginConfigIds": [ + "{{configId}}" + ], + "dataStream": { + "name": "incidents", + "dataSourceConfig": { + "timeframeCol": "createdDateTime", + "status": [ + "resolved" + ] + }, + "id": "{{dataStreams.incidents}}", + "pluginConfigId": "{{configId}}" + } + }, + "tableName": "dataset1" + } + ], + "sql": "WITH\n \"time_diffs\" AS (\n SELECT\n \"id\",\n DATE_DIFF(\n 'second',\n COALESCE(\"createdDateTime\", CURRENT_TIMESTAMP),\n COALESCE(\"lastUpdateDateTime\", CURRENT_TIMESTAMP)\n ) / 60 AS \"time_to_resolve_minutes\"\n FROM\n \"dataset1\"\n )\nSELECT\n AVG(\"time_to_resolve_minutes\") AS \"average_time_to_resolve_minutes\"\nFROM\n \"time_diffs\"" + }, + "metadata": [ + { + "shape": [ + "minutes", + { + "formatDuration": true, + "thousandsSeparator": true + } + ], + "name": "average_time_to_resolve_minutes" + }, + { + "pattern": ".*" + } + ], + "id": "datastream-sql" + }, + "scope": { + "query": "g.V().has('id', within(ids_eUAV7eEoSQHE0Wbi3Lh6))", + "bindings": { + "ids_eUAV7eEoSQHE0Wbi3Lh6": [ + "node-1dwkxV4HX7weIEfnX1SJ0yanRi4ZRTdjDSDUa-rb51OklLHaz1kod9h6nV" + ] + }, + "queryDetail": { + "ids": [ + "node-1dwkxV4HX7weIEfnX1SJ0yanRi4ZRTdjDSDUa-rb51OklLHaz1kod9h6nV" + ] + } + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Average Time To Resolve", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "average_time_to_resolve_minutes", + "comparisonColumn": "none" + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 3, + "i": "be10e34d-6f6c-4679-8588-b3f9f9a7ebac", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "incidents", + "id": "{{dataStreams.incidents}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "By Severity", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "color": { + "type": "custom", + "customColors": [ + { + "color": "#0075FF", + "expression": "label == \"informational\"" + }, + { + "color": "#88898C", + "expression": "label == \"low\"" + }, + { + "color": "#E18700", + "expression": "label == \"medium\"" + }, + { + "color": "#DE0038", + "expression": "label == \"high\"" + } + ] + }, + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "severity", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": true, + "yAxisData": [], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 1, + "y": 3, + "i": "0a957b15-b43c-4bb6-81d8-88a5db59ba7e", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "incidents", + "id": "{{dataStreams.incidents}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "By Status", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "color": { + "type": "default" + }, + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "status", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": true, + "yAxisData": [], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 2, + "y": 3, + "i": "366eab62-bcdd-45cb-945e-6d247fb27bbc", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "incidents", + "id": "{{dataStreams.incidents}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "By Priority Score", + "visualisation": { + "type": "data-stream-bar-chart", + "config": { + "data-stream-bar-chart": { + "color": { + "type": "default" + }, + "xAxisGroup": "none", + "showLegend": false, + "range": { + "type": "auto" + }, + "showGrid": true, + "grouping": false, + "displayMode": "actual", + "xAxisData": "priorityScore", + "showTotals": false, + "yAxisLabel": "", + "horizontalLayout": "vertical", + "showValue": false, + "yAxisData": [], + "showYAxisLabel": true, + "xAxisLabel": "", + "legendPosition": "bottom", + "showXAxisLabel": true + } + } + } + } + }, + { + "static": false, + "w": 3, + "moved": false, + "h": 3, + "x": 0, + "y": 5, + "i": "1ee38916-e315-4cca-969d-ce93e9bbb228", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "name": "incidents", + "id": "{{dataStreams.incidents}}", + "pluginConfigId": "{{configId}}" + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "List", + "visualisation": { + "type": "data-stream-table", + "config": { + "data-stream-table": { + "columnOrder": [ + "id", + "tenantId", + "status", + "incidentWebUrl", + "redirectIncidentId", + "displayName", + "createdDateTime", + "lastUpdateDateTime", + "assignedTo", + "classification", + "determination", + "severity", + "description", + "lastModifiedBy", + "resolvingComment", + "summary", + "priorityScore", + "systemTags.0" + ], + "hiddenColumns": [] + } + } + } + } + } + ], + "version": 39, + "columns": 3 + } +} \ No newline at end of file diff --git a/plugins/MicrosoftDefender/v1/defaultContent/manifest.json b/plugins/MicrosoftDefender/v1/defaultContent/manifest.json index 571fefef..04215092 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/manifest.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/manifest.json @@ -5,11 +5,11 @@ "type": "dashboard" }, { - "name": "recommendations", + "name": "devicesHealth", "type": "dashboard" }, { - "name": "vulnerabilities", + "name": "incidents", "type": "dashboard" }, { diff --git a/plugins/MicrosoftDefender/v1/defaultContent/scopes.json b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json index 9b79bd0f..f275fb40 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/scopes.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json @@ -1,16 +1,6 @@ [ { - "name": "All Objects", - "matches": "all", - "variable": { - "name": "All Object", - "type": "object", - "default": "all", - "allowMultipleSelection": false - } - }, - { - "name": "devices", + "name": "Devices", "matches": { "sourceType": { "type": "oneOf", @@ -20,7 +10,7 @@ } }, "variable": { - "name": "device", + "name": "Device", "type": "object", "default": "none", "allowMultipleSelection": false From f86db32d2af3fbdfb8864258b357767bf26533da Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 9 Jun 2026 11:42:13 +0100 Subject: [PATCH 31/49] fix: add folder paths to Devices OOBs --- .../v1/defaultContent/Devices/deviceStatus.dash.json | 1 + .../v1/defaultContent/Devices/recommendations.dash.json | 1 + .../v1/defaultContent/Devices/vulnerabilities.dash.json | 1 + 3 files changed, 3 insertions(+) diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json index c0ddd568..f9097eb9 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/deviceStatus.dash.json @@ -367,6 +367,7 @@ "version": 29, "columns": 4 }, + "folderPath": ["Devices"], "variables": [ "{{variables.Device}}" ] diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json index 478501b0..27282c39 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json @@ -266,6 +266,7 @@ "version": 19, "columns": 3 }, + "folderPath": ["Devices"], "variables": [ "{{variables.Device}}" ] diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/vulnerabilities.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/vulnerabilities.dash.json index ff7af60f..5f9e04fd 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/vulnerabilities.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/vulnerabilities.dash.json @@ -302,6 +302,7 @@ "version": 22, "columns": 4 }, + "folderPath": ["Devices"], "variables": [ "{{variables.Device}}" ] From 77cbc012584b488e33ad835e20285d20499bc7b9 Mon Sep 17 00:00:00 2001 From: jame2O Date: Tue, 9 Jun 2026 12:25:28 +0100 Subject: [PATCH 32/49] fix: show CVE ID label --- .../MicrosoftDefender/v1/dataStreams/Vulnerabilities.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json index afd552e6..dbef7fea 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -25,12 +25,8 @@ "name": "CveGuide", "displayName": "Cve Id", "valueExpression": "{{ $['CveId'] ? `https://msrc.microsoft.com/update-guide/vulnerability/${$['CveId']}` : '' }}", - "shape": [ - "url", - { - "label": "{{column.CveId}}" - } - ], + "formatExpression": "{{ $['CveId'] }}", + "shape": "url", "computed": true }, { From 79eb36a9a05f7d4ee6e6f4a4af50a30254fdecc0 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 10 Jun 2026 11:47:20 +0100 Subject: [PATCH 33/49] feat: README v1 --- plugins/MicrosoftDefender/v1/docs/README.md | 63 +++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 plugins/MicrosoftDefender/v1/docs/README.md diff --git a/plugins/MicrosoftDefender/v1/docs/README.md b/plugins/MicrosoftDefender/v1/docs/README.md new file mode 100644 index 00000000..c2a2fd21 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/docs/README.md @@ -0,0 +1,63 @@ +## Configuring the data source + +1. Display name: +Enter a name for your data source. This helps you to identify this data source in the list of your data sources. + +2. Authentication: +M365 client credentials are required to configure this plugin. Follow the steps in [Configuring App Registration for the Microsoft 365 Plugin](https://docs.squaredup.com/data-sources/microsoft-365-plugin/configuring-app-registration-for-the-microsoft-365-plugin). Ensure to add the following permissions below to configure your app for Defender: + +- **SecurityAlert.Read.All** +- **SecurityIncident.Read.All** +- **ThreatHunting.Read.All** +- **SecurityEvents.Read.All** + +Once this is completed, fill in the details below: + +- _Directory (Tenant) ID_ +- _Application (Client) ID_ +- _Client Secret_ + +3. Click Test and add to validate the data source configuration. SquaredUp will now attempt to connect using the provided authentication details. + +## Testing and troubleshooting + +If you encounter an error refer to the guidance or contact our support team in-app or via [SquaredUp Support](https://docs.squaredup.com/submit-ticket) + +For errors on dashboard tiles see [Troubleshooting tiles](https://docs.squaredup.com/troubleshooting/troubleshooting-tiles). + +## Next Steps + +Once you have successfully connected to data source, you can start exploring your imported objects and using your data streams to create data tiles on your dashboards. Take a look at the pre-installed dashboards to see examples of how you can visualize your data. + +### Dashboards + +The following pre-built dashboards are available with this plugin: + +- **Cockpit** — Tenant-wide security overview, showing your current and historical Secure Score, device exposure state, active incidents, and a breakdown of detections by category (application control, exploits, persistence & privilege escalation, and malware & antivirus). +- **Devices Health** — Device fleet health, with counts of high- and medium-exposure devices, devices with critical vulnerabilities, and non-compliant devices. +- **Incidents** — Incident operations view, showing active and unassigned incidents, average time to resolve, and incidents broken down by severity, status, and priority score. +- **Devices** — Tiles will appear when you drill into a **Device** object: + - **Device Status** — Exposure level, sensor health state, onboarding status, last seen time, and device attributes and properties for the selected device. + - **Vulnerabilities** — Critical and high vulnerability counts, a severity breakdown, affected software, and the full list of vulnerabilities for the selected device. + - **Recommendations** — Active security configuration recommendations for the selected device, grouped by configuration category and impact. + +### Graph imported objects +The following objects are imported: + +| Object | Description | +| ------ | ------ | +| Devices | Contains data about each of the devices managed by the connected Defender instance. + +### Data streams +The following data streams are installed with this plugin. +| Data Stream | Description | Parameters +| ------ | ------ | ------ | +| Advanced Hunting Query | Queries a specified set of data supported by Defender to proactively look for specific threats in your environment. | Query: The KQL query to run. +| Secure Score History | Retrieves the current tenant's Secure Score data from the past 90 days | N/A +| Recommendations | Returns recommendations data for the specified device. | N/A +| Vulnerabilities | Returns vulnerabilities data for the specified device. | N/A +| Devices | Returns detailed attributes and properties for the specified device. | N/A +| Alerts | Returns a list of alert resources created to track suspicious activities in an organization. | Filters available: **Severity, Status** +| Incidents | Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. | Filters available: **Severity, Status** + + From 43b88ed3d0d04d29d51c81c66ccce7fd102bcf8d Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 10 Jun 2026 11:47:32 +0100 Subject: [PATCH 34/49] feat: new config test steps --- .../v1/configValidation.json | 33 +++++++++++++++---- ...{validation.json => validationAlerts.json} | 14 ++++---- .../v1/dataStreams/validationHunting.json | 28 ++++++++++++++++ .../v1/dataStreams/validationIncidents.json | 31 +++++++++++++++++ .../v1/dataStreams/validationSecureScore.json | 31 +++++++++++++++++ 5 files changed, 123 insertions(+), 14 deletions(-) rename plugins/MicrosoftDefender/v1/dataStreams/{validation.json => validationAlerts.json} (70%) create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/validationHunting.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/validationIncidents.json create mode 100644 plugins/MicrosoftDefender/v1/dataStreams/validationSecureScore.json diff --git a/plugins/MicrosoftDefender/v1/configValidation.json b/plugins/MicrosoftDefender/v1/configValidation.json index 45cb26a1..4a91430a 100644 --- a/plugins/MicrosoftDefender/v1/configValidation.json +++ b/plugins/MicrosoftDefender/v1/configValidation.json @@ -1,13 +1,32 @@ { "steps": [ { - "displayName": "API Access", - "dataStream": { - "name": "validation" - }, - "success": "Successfully connected to Endpoint", - "error": "Cannot access the Endpoint API - check your client ID, secret and permissions.", + "displayName": "Alerts access", + "dataStream": { "name": "validationAlerts" }, + "success": "Successfully read alerts.", + "error": "Cannot read alerts. Grant the app the 'SecurityAlert.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", + "required": true + }, + { + "displayName": "Incidents access", + "dataStream": { "name": "validationIncidents" }, + "success": "Successfully read incidents.", + "error": "Cannot read incidents. Grant the app the 'SecurityIncident.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", + "required": true + }, + { + "displayName": "Advanced hunting access", + "dataStream": { "name": "validationHunting" }, + "success": "Successfully ran an advanced hunting query.", + "error": "Cannot run advanced hunting queries. Grant the app the 'ThreatHunting.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", + "required": true + }, + { + "displayName": "Secure score access", + "dataStream": { "name": "validationSecureScore" }, + "success": "Successfully read secure scores.", + "error": "Cannot read secure scores. Grant the app the 'SecurityEvents.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", "required": true } ] -} \ No newline at end of file +} diff --git a/plugins/MicrosoftDefender/v1/dataStreams/validation.json b/plugins/MicrosoftDefender/v1/dataStreams/validationAlerts.json similarity index 70% rename from plugins/MicrosoftDefender/v1/dataStreams/validation.json rename to plugins/MicrosoftDefender/v1/dataStreams/validationAlerts.json index de9e8204..1ee79aa2 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/validation.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/validationAlerts.json @@ -1,6 +1,6 @@ { - "name": "validation", - "displayName": "Validation", + "name": "validationAlerts", + "displayName": "Validation - Alerts", "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", @@ -11,13 +11,13 @@ "mode": "none" }, "expandInnerObjects": true, - "endpointPath": "alerts", + "endpointPath": "alerts_v2", "pathToData": "value", "getArgs": [ { - "key": "$top", - "value": "1", - "needsEncryption": false + "key": "$top", + "value": "1", + "needsEncryption": false } ], "headers": [] @@ -28,4 +28,4 @@ "visibility": { "type": "hidden" } -} \ No newline at end of file +} diff --git a/plugins/MicrosoftDefender/v1/dataStreams/validationHunting.json b/plugins/MicrosoftDefender/v1/dataStreams/validationHunting.json new file mode 100644 index 00000000..12ec5994 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/validationHunting.json @@ -0,0 +1,28 @@ +{ + "name": "validationHunting", + "displayName": "Validation - Advanced Hunting", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "post", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "runHuntingQuery", + "postBody": { + "Query": "DeviceInfo | take 1" + }, + "pathToData": "results", + "getArgs": [], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "visibility": { + "type": "hidden" + } +} diff --git a/plugins/MicrosoftDefender/v1/dataStreams/validationIncidents.json b/plugins/MicrosoftDefender/v1/dataStreams/validationIncidents.json new file mode 100644 index 00000000..1c5353e1 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/validationIncidents.json @@ -0,0 +1,31 @@ +{ + "name": "validationIncidents", + "displayName": "Validation - Incidents", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": true, + "endpointPath": "incidents", + "pathToData": "value", + "getArgs": [ + { + "key": "$top", + "value": "1", + "needsEncryption": false + } + ], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "visibility": { + "type": "hidden" + } +} diff --git a/plugins/MicrosoftDefender/v1/dataStreams/validationSecureScore.json b/plugins/MicrosoftDefender/v1/dataStreams/validationSecureScore.json new file mode 100644 index 00000000..8f83bae5 --- /dev/null +++ b/plugins/MicrosoftDefender/v1/dataStreams/validationSecureScore.json @@ -0,0 +1,31 @@ +{ + "name": "validationSecureScore", + "displayName": "Validation - Secure Score", + "baseDataSourceName": "httpRequestUnscoped", + "config": { + "httpMethod": "get", + "errorHandling": { + "type": "default" + }, + "paging": { + "mode": "none" + }, + "expandInnerObjects": false, + "endpointPath": "secureScores", + "pathToData": "value", + "getArgs": [ + { + "key": "$top", + "value": "1", + "needsEncryption": false + } + ], + "headers": [] + }, + "matches": "none", + "timeframes": false, + "providesPluginDiagnostics": true, + "visibility": { + "type": "hidden" + } +} From 4cdf819473a21dd9b3ae568f40fc4e80e3c9b6ad Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 10 Jun 2026 12:31:12 +0100 Subject: [PATCH 35/49] chore: update README --- plugins/MicrosoftDefender/v1/docs/README.md | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/docs/README.md b/plugins/MicrosoftDefender/v1/docs/README.md index c2a2fd21..c2c8f018 100644 --- a/plugins/MicrosoftDefender/v1/docs/README.md +++ b/plugins/MicrosoftDefender/v1/docs/README.md @@ -44,20 +44,20 @@ The following pre-built dashboards are available with this plugin: ### Graph imported objects The following objects are imported: -| Object | Description | -| ------ | ------ | -| Devices | Contains data about each of the devices managed by the connected Defender instance. +- **Devices** — Contains data about each of the devices managed by the connected Defender instance. ### Data streams -The following data streams are installed with this plugin. -| Data Stream | Description | Parameters -| ------ | ------ | ------ | -| Advanced Hunting Query | Queries a specified set of data supported by Defender to proactively look for specific threats in your environment. | Query: The KQL query to run. -| Secure Score History | Retrieves the current tenant's Secure Score data from the past 90 days | N/A -| Recommendations | Returns recommendations data for the specified device. | N/A -| Vulnerabilities | Returns vulnerabilities data for the specified device. | N/A -| Devices | Returns detailed attributes and properties for the specified device. | N/A -| Alerts | Returns a list of alert resources created to track suspicious activities in an organization. | Filters available: **Severity, Status** -| Incidents | Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. | Filters available: **Severity, Status** +The following data streams are installed with this plugin: + +- **Advanced Hunting Query** — Queries a specified set of data supported by Defender to proactively look for specific threats in your environment. Parameters: + - Query: the KQL query to run. +- **Secure Score History** — Retrieves the current tenant's Secure Score data from the past 90 days. +- **Recommendations** — Returns recommendations data for the specified device. +- **Vulnerabilities** — Returns vulnerabilities data for the specified device. +- **Devices** — Returns detailed attributes and properties for the specified device. +- **Alerts** — Returns a list of alert resources created to track suspicious activities in an organization. Parameters: + - Filters available: **Severity, Status** +- **Incidents** — Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. Parameters: + - Filters available: **Severity, Status** From 3f8757ce0f9881db59a4821867dc033d9231bf36 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 10 Jun 2026 12:33:28 +0100 Subject: [PATCH 36/49] chore: README v3 --- plugins/MicrosoftDefender/v1/docs/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/docs/README.md b/plugins/MicrosoftDefender/v1/docs/README.md index c2c8f018..6729ee7e 100644 --- a/plugins/MicrosoftDefender/v1/docs/README.md +++ b/plugins/MicrosoftDefender/v1/docs/README.md @@ -1,4 +1,4 @@ -## Configuring the data source +# Configuring the data source 1. Display name: Enter a name for your data source. This helps you to identify this data source in the list of your data sources. @@ -19,17 +19,17 @@ Once this is completed, fill in the details below: 3. Click Test and add to validate the data source configuration. SquaredUp will now attempt to connect using the provided authentication details. -## Testing and troubleshooting +# Testing and troubleshooting If you encounter an error refer to the guidance or contact our support team in-app or via [SquaredUp Support](https://docs.squaredup.com/submit-ticket) For errors on dashboard tiles see [Troubleshooting tiles](https://docs.squaredup.com/troubleshooting/troubleshooting-tiles). -## Next Steps +# Next Steps Once you have successfully connected to data source, you can start exploring your imported objects and using your data streams to create data tiles on your dashboards. Take a look at the pre-installed dashboards to see examples of how you can visualize your data. -### Dashboards +## Dashboards The following pre-built dashboards are available with this plugin: @@ -41,23 +41,23 @@ The following pre-built dashboards are available with this plugin: - **Vulnerabilities** — Critical and high vulnerability counts, a severity breakdown, affected software, and the full list of vulnerabilities for the selected device. - **Recommendations** — Active security configuration recommendations for the selected device, grouped by configuration category and impact. -### Graph imported objects +## Graph imported objects The following objects are imported: - **Devices** — Contains data about each of the devices managed by the connected Defender instance. -### Data streams +## Data streams The following data streams are installed with this plugin: -- **Advanced Hunting Query** — Queries a specified set of data supported by Defender to proactively look for specific threats in your environment. Parameters: - - Query: the KQL query to run. +- **Advanced Hunting Query** — Queries a specified set of data supported by Defender to proactively look for specific threats in your environment. **Parameters:** + - **Query**: the KQL query to run. - **Secure Score History** — Retrieves the current tenant's Secure Score data from the past 90 days. - **Recommendations** — Returns recommendations data for the specified device. - **Vulnerabilities** — Returns vulnerabilities data for the specified device. - **Devices** — Returns detailed attributes and properties for the specified device. -- **Alerts** — Returns a list of alert resources created to track suspicious activities in an organization. Parameters: +- **Alerts** — Returns a list of alert resources created to track suspicious activities in an organization. **Parameters:** - Filters available: **Severity, Status** -- **Incidents** — Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. Parameters: +- **Incidents** — Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. **Parameters:** - Filters available: **Severity, Status** From fbb6b8765b768382c2df369bb53bb059dccb8df1 Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 10 Jun 2026 13:55:29 +0100 Subject: [PATCH 37/49] chore: README v4 --- plugins/MicrosoftDefender/v1/docs/README.md | 28 +++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/docs/README.md b/plugins/MicrosoftDefender/v1/docs/README.md index 6729ee7e..91076f6c 100644 --- a/plugins/MicrosoftDefender/v1/docs/README.md +++ b/plugins/MicrosoftDefender/v1/docs/README.md @@ -1,15 +1,17 @@ # Configuring the data source -1. Display name: +**Display name:** + Enter a name for your data source. This helps you to identify this data source in the list of your data sources. -2. Authentication: +**Authentication:** + M365 client credentials are required to configure this plugin. Follow the steps in [Configuring App Registration for the Microsoft 365 Plugin](https://docs.squaredup.com/data-sources/microsoft-365-plugin/configuring-app-registration-for-the-microsoft-365-plugin). Ensure to add the following permissions below to configure your app for Defender: -- **SecurityAlert.Read.All** -- **SecurityIncident.Read.All** -- **ThreatHunting.Read.All** -- **SecurityEvents.Read.All** +- _SecurityAlert.Read.All_ +- _SecurityIncident.Read.All_ +- _ThreatHunting.Read.All_ +- _SecurityEvents.Read.All_ Once this is completed, fill in the details below: @@ -17,7 +19,7 @@ Once this is completed, fill in the details below: - _Application (Client) ID_ - _Client Secret_ -3. Click Test and add to validate the data source configuration. SquaredUp will now attempt to connect using the provided authentication details. +Click Test and add to validate the data source configuration. SquaredUp will now attempt to connect using the provided authentication details. # Testing and troubleshooting @@ -49,15 +51,15 @@ The following objects are imported: ## Data streams The following data streams are installed with this plugin: -- **Advanced Hunting Query** — Queries a specified set of data supported by Defender to proactively look for specific threats in your environment. **Parameters:** - - **Query**: the KQL query to run. +- **Advanced Hunting Query** — Queries a specified set of data supported by Defender to proactively look for specific threats in your environment. *Parameters:* + - *Query*: the KQL query to run. - **Secure Score History** — Retrieves the current tenant's Secure Score data from the past 90 days. - **Recommendations** — Returns recommendations data for the specified device. - **Vulnerabilities** — Returns vulnerabilities data for the specified device. - **Devices** — Returns detailed attributes and properties for the specified device. -- **Alerts** — Returns a list of alert resources created to track suspicious activities in an organization. **Parameters:** - - Filters available: **Severity, Status** -- **Incidents** — Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. **Parameters:** - - Filters available: **Severity, Status** +- **Alerts** — Returns a list of alert resources created to track suspicious activities in an organization. *Parameters:* + - Filters available: *Severity, Status* +- **Incidents** — Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. *Parameters:* + - Filters available: *Severity, Status* From 917a3316dae49381b3e31cb7fd03b7f94806d17e Mon Sep 17 00:00:00 2001 From: jame2O Date: Wed, 10 Jun 2026 13:58:31 +0100 Subject: [PATCH 38/49] chore: add links to metadata --- plugins/MicrosoftDefender/v1/metadata.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/metadata.json b/plugins/MicrosoftDefender/v1/metadata.json index 1a201570..54b9e78c 100644 --- a/plugins/MicrosoftDefender/v1/metadata.json +++ b/plugins/MicrosoftDefender/v1/metadata.json @@ -39,5 +39,17 @@ "oauth2ClientId": "{{clientId}}", "oauth2Scope": "https://graph.microsoft.com/.default" } - } + }, + "links": [ + { + "category": "documentation", + "url": "https://github.com/squaredup/plugins/blob/main/plugins/MicrosoftDefender/v1/docs/README.md", + "label": "Help adding this plugin" + }, + { + "category": "source", + "url": "https://github.com/squaredup/plugins/tree/main/plugins/MicrosoftDefender/v1", + "label": "Repository" + } + ] } \ No newline at end of file From 4de0cbcb95f44046c8ccc1e617af87242c20cd55 Mon Sep 17 00:00:00 2001 From: vinbab Date: Wed, 10 Jun 2026 16:30:16 +0100 Subject: [PATCH 39/49] Revise README for Microsoft Defender plugin Updated README.md for Microsoft Defender plugin to clarify authentication requirements, error handling, and dashboard descriptions. --- plugins/MicrosoftDefender/v1/docs/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/docs/README.md b/plugins/MicrosoftDefender/v1/docs/README.md index 91076f6c..09cb2738 100644 --- a/plugins/MicrosoftDefender/v1/docs/README.md +++ b/plugins/MicrosoftDefender/v1/docs/README.md @@ -6,7 +6,7 @@ Enter a name for your data source. This helps you to identify this data source i **Authentication:** -M365 client credentials are required to configure this plugin. Follow the steps in [Configuring App Registration for the Microsoft 365 Plugin](https://docs.squaredup.com/data-sources/microsoft-365-plugin/configuring-app-registration-for-the-microsoft-365-plugin). Ensure to add the following permissions below to configure your app for Defender: +Client credentials are required to configure this plugin. Follow the same steps explained in the Microsoft 365 article [Configuring App Registration for the Microsoft 365 Plugin](https://docs.squaredup.com/data-sources/microsoft-365-plugin/configuring-app-registration-for-the-microsoft-365-plugin). Ensure to add the following permissions below to configure your app for Defender: - _SecurityAlert.Read.All_ - _SecurityIncident.Read.All_ @@ -23,7 +23,7 @@ Click Test and add to validate the data source configuration. SquaredUp will now # Testing and troubleshooting -If you encounter an error refer to the guidance or contact our support team in-app or via [SquaredUp Support](https://docs.squaredup.com/submit-ticket) +If you encounter an error refer to the errors and warnings reported during on the data source configuration screen. For errors on dashboard tiles see [Troubleshooting tiles](https://docs.squaredup.com/troubleshooting/troubleshooting-tiles). @@ -35,7 +35,7 @@ Once you have successfully connected to data source, you can start exploring you The following pre-built dashboards are available with this plugin: -- **Cockpit** — Tenant-wide security overview, showing your current and historical Secure Score, device exposure state, active incidents, and a breakdown of detections by category (application control, exploits, persistence & privilege escalation, and malware & antivirus). +- **Cockpit** — Tenant-wide security overview, showing your current and historical Secure Score, device exposure state, active incidents, and some example detections by category (application control, exploits, persistence & privilege escalation, and malware & antivirus). - **Devices Health** — Device fleet health, with counts of high- and medium-exposure devices, devices with critical vulnerabilities, and non-compliant devices. - **Incidents** — Incident operations view, showing active and unassigned incidents, average time to resolve, and incidents broken down by severity, status, and priority score. - **Devices** — Tiles will appear when you drill into a **Device** object: @@ -46,7 +46,7 @@ The following pre-built dashboards are available with this plugin: ## Graph imported objects The following objects are imported: -- **Devices** — Contains data about each of the devices managed by the connected Defender instance. +- **Devices** — Contains property data about each of the devices managed by the connected Defender instance. ## Data streams The following data streams are installed with this plugin: @@ -59,7 +59,7 @@ The following data streams are installed with this plugin: - **Devices** — Returns detailed attributes and properties for the specified device. - **Alerts** — Returns a list of alert resources created to track suspicious activities in an organization. *Parameters:* - Filters available: *Severity, Status* -- **Incidents** — Returns a list of incident objects that Microsoft 365 Defender created to track attacks in an organization. *Parameters:* +- **Incidents** — Returns a list of incident objects that Microsoft Defender created to track attacks in an organization. *Parameters:* - Filters available: *Severity, Status* From 545f1625d561c2cfafff27ea4f92bc231419880b Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 11 Jun 2026 09:38:08 +0100 Subject: [PATCH 40/49] chore: update config validation error messages, change some to warning level --- plugins/MicrosoftDefender/v1/configValidation.json | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/configValidation.json b/plugins/MicrosoftDefender/v1/configValidation.json index 4a91430a..cdc645c2 100644 --- a/plugins/MicrosoftDefender/v1/configValidation.json +++ b/plugins/MicrosoftDefender/v1/configValidation.json @@ -4,29 +4,27 @@ "displayName": "Alerts access", "dataStream": { "name": "validationAlerts" }, "success": "Successfully read alerts.", - "error": "Cannot read alerts. Grant the app the 'SecurityAlert.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", + "error": "Cannot read alerts. Grant the 'SecurityAlert.Read.All' application permission in Microsoft Entra ID, or check your client ID and secret.", "required": true }, { "displayName": "Incidents access", "dataStream": { "name": "validationIncidents" }, "success": "Successfully read incidents.", - "error": "Cannot read incidents. Grant the app the 'SecurityIncident.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", - "required": true + "error": "Cannot read incidents. Grant the 'SecurityIncident.Read.All' application permission in Microsoft Entra ID, or check your client ID and secret." }, { "displayName": "Advanced hunting access", "dataStream": { "name": "validationHunting" }, "success": "Successfully ran an advanced hunting query.", - "error": "Cannot run advanced hunting queries. Grant the app the 'ThreatHunting.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", + "error": "Cannot run advanced hunting queries. Grant the 'ThreatHunting.Read.All' application permission in Microsoft Entra ID, or check your client ID and secret.", "required": true }, { "displayName": "Secure score access", "dataStream": { "name": "validationSecureScore" }, "success": "Successfully read secure scores.", - "error": "Cannot read secure scores. Grant the app the 'SecurityEvents.Read.All' application permission in Microsoft Entra ID. Check your client ID and secret.", - "required": true + "error": "Cannot read secure scores. Grant the 'SecurityEvents.Read.All' application permission in Microsoft Entra ID, or check your client ID and secret." } ] } From 1294971816fd7f6a70ba32d2ea540758136fc58d Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 11 Jun 2026 11:52:31 +0100 Subject: [PATCH 41/49] fix: minor mistakes in README --- plugins/MicrosoftDefender/v1/docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/docs/README.md b/plugins/MicrosoftDefender/v1/docs/README.md index 09cb2738..6fdd11d7 100644 --- a/plugins/MicrosoftDefender/v1/docs/README.md +++ b/plugins/MicrosoftDefender/v1/docs/README.md @@ -23,13 +23,13 @@ Click Test and add to validate the data source configuration. SquaredUp will now # Testing and troubleshooting -If you encounter an error refer to the errors and warnings reported during on the data source configuration screen. +If you encounter an error refer to the errors and warnings reported on the data source configuration screen. For errors on dashboard tiles see [Troubleshooting tiles](https://docs.squaredup.com/troubleshooting/troubleshooting-tiles). # Next Steps -Once you have successfully connected to data source, you can start exploring your imported objects and using your data streams to create data tiles on your dashboards. Take a look at the pre-installed dashboards to see examples of how you can visualize your data. +Once you have successfully connected to the data source, you can start exploring your imported objects and using your data streams to create data tiles on your dashboards. Take a look at the pre-installed dashboards to see examples of how you can visualize your data. ## Dashboards From 13f410c446ecdf7c29b1952aba1d28cf84783ee9 Mon Sep 17 00:00:00 2001 From: jame2O Date: Thu, 11 Jun 2026 14:03:36 +0100 Subject: [PATCH 42/49] feat: name change --- plugins/MicrosoftDefender/v1/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/metadata.json b/plugins/MicrosoftDefender/v1/metadata.json index 54b9e78c..24e52298 100644 --- a/plugins/MicrosoftDefender/v1/metadata.json +++ b/plugins/MicrosoftDefender/v1/metadata.json @@ -1,6 +1,6 @@ { "name": "microsoft-defender", - "displayName": "Microsoft Defender", + "displayName": "Microsoft Defender (Beta)", "version": "1.0.0", "author": { "name": "SquaredUp Labs", From 4e15abacbff6b3b4d002152e279bc7114f5f1751 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 12 Jun 2026 09:42:06 +0100 Subject: [PATCH 43/49] chore: remove beta label from name --- plugins/MicrosoftDefender/v1/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/metadata.json b/plugins/MicrosoftDefender/v1/metadata.json index 24e52298..54b9e78c 100644 --- a/plugins/MicrosoftDefender/v1/metadata.json +++ b/plugins/MicrosoftDefender/v1/metadata.json @@ -1,6 +1,6 @@ { "name": "microsoft-defender", - "displayName": "Microsoft Defender (Beta)", + "displayName": "Microsoft Defender", "version": "1.0.0", "author": { "name": "SquaredUp Labs", From 80ff42f420bfc07b25867bf6cc905a9f7026dbd3 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 12 Jun 2026 09:42:17 +0100 Subject: [PATCH 44/49] chore: capitalize object names --- plugins/MicrosoftDefender/v1/custom_types.json | 6 +++--- .../MicrosoftDefender/v1/dataStreams/Vulnerabilities.json | 4 ++-- plugins/MicrosoftDefender/v1/dataStreams/devices.json | 4 ++-- .../MicrosoftDefender/v1/dataStreams/recommendations.json | 4 ++-- .../MicrosoftDefender/v1/defaultContent/cockpit.dash.json | 2 +- plugins/MicrosoftDefender/v1/defaultContent/scopes.json | 2 +- plugins/MicrosoftDefender/v1/indexDefinitions/default.json | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/custom_types.json b/plugins/MicrosoftDefender/v1/custom_types.json index e7aa71f7..d5645abc 100644 --- a/plugins/MicrosoftDefender/v1/custom_types.json +++ b/plugins/MicrosoftDefender/v1/custom_types.json @@ -1,8 +1,8 @@ [ { - "name": "device", - "sourceType": "device", - "icon": "server", + "name": "Device", + "sourceType": "Device", + "icon": "desktop", "singular": "Device", "plural": "Devices" } diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json index dbef7fea..db0a500d 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -60,13 +60,13 @@ "shape": "string", "visible": false, "role": "label", - "sourceType": "device" + "sourceType": "Device" } ], "matches": { "sourceType": { "type": "equals", - "value": "device" + "value": "Device" } }, "timeframes": false, diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index 700b970f..b1a582c7 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -26,7 +26,7 @@ "displayName": "Device Name", "shape": "string", "role": "label", - "sourceType": "device" + "sourceType": "Device" }, { "name": "PublicIP", @@ -131,7 +131,7 @@ "matches": { "sourceType": { "type": "equals", - "value": "device" + "value": "Device" } }, "timeframes": false, diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index 3d228057..c138bc62 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -33,7 +33,7 @@ "displayName": "Device Name", "shape": "string", "role": "label", - "sourceType": "device" + "sourceType": "Device" }, { "name": "Timestamp", @@ -93,7 +93,7 @@ "matches": { "sourceType": { "type": "equals", - "value": "device" + "value": "Device" } }, "timeframes": [ diff --git a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json index e9438372..a5ba8bb2 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json @@ -120,7 +120,7 @@ } }, "scope": { - "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"device\")).limit(500)", + "query": "g.V().order().by('__name').hasNot('__canonicalType').or(__.has(\"sourceType\", \"Device\")).limit(500)", "bindings": {}, "queryDetail": {} }, diff --git a/plugins/MicrosoftDefender/v1/defaultContent/scopes.json b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json index f275fb40..fca6dd31 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/scopes.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/scopes.json @@ -5,7 +5,7 @@ "sourceType": { "type": "oneOf", "values": [ - "device" + "Device" ] } }, diff --git a/plugins/MicrosoftDefender/v1/indexDefinitions/default.json b/plugins/MicrosoftDefender/v1/indexDefinitions/default.json index b84def46..d3e2a598 100644 --- a/plugins/MicrosoftDefender/v1/indexDefinitions/default.json +++ b/plugins/MicrosoftDefender/v1/indexDefinitions/default.json @@ -10,7 +10,7 @@ "id": "DeviceId", "name": "DeviceName", "type": { - "value": "device" + "value": "Device" }, "properties": [ "OSPlatform", From 4c324fadff81e0770a1a946c5abaa2980579f338 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 12 Jun 2026 09:57:09 +0100 Subject: [PATCH 45/49] feat: add "Current Score %" tile to Cockpit OOB --- .../v1/defaultContent/cockpit.dash.json | 154 ++++++++++++++---- 1 file changed, 122 insertions(+), 32 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json index a5ba8bb2..bbd188c5 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/cockpit.dash.json @@ -6,10 +6,10 @@ "contents": [ { "static": false, - "w": 2, + "w": 1, "moved": false, "h": 2, - "x": 0, + "x": 1, "y": 0, "i": "fa1468d7-af16-4947-ba21-d6628350c862", "z": 0, @@ -91,6 +91,96 @@ } } }, + { + "static": false, + "w": 1, + "moved": false, + "h": 2, + "x": 0, + "y": 0, + "i": "ace1ef46-a2d5-41ee-a868-b214742392b7", + "z": 0, + "config": { + "timeframe": "none", + "dataStream": { + "dataSourceConfig": { + "version": "2.0", + "tables": [ + { + "config": { + "timeframe": "none", + "activePluginConfigIds": [ + "{{configId}}" + ], + "dataStream": { + "name": "secureScoreHistory", + "filter": { + "multiOperation": "and", + "filters": [ + { + "column": "createdDateTime", + "unit": "days", + "operation": "datewithinlast", + "value": "1" + } + ] + }, + "id": "{{dataStreams.secureScoreHistory}}", + "pluginConfigId": "{{configId}}" + } + }, + "tableName": "dataset1" + } + ], + "sql": "SELECT\n \"id\",\n \"currentScore\" / COALESCE(\"maxScore\", 1) AS \"score_ratio\"\nFROM\n \"dataset1\"" + }, + "metadata": [ + { + "shape": [ + "percent", + { + "thousandsSeparator": true, + "asZeroToOne": true + } + ], + "name": "score_ratio" + }, + { + "pattern": ".*" + } + ], + "id": "datastream-sql" + }, + "scope": { + "query": "g.V().has('id', within(ids_101Q6gd64IVkeoOip3rP))", + "bindings": { + "ids_101Q6gd64IVkeoOip3rP": [ + "node-1dwkxV4HX7weIEfnX1SJ0yanRi4ZRTdjDSDUa-rb51OklLHaz1kod9h6nV" + ] + }, + "queryDetail": { + "ids": [ + "node-1dwkxV4HX7weIEfnX1SJ0yanRi4ZRTdjDSDUa-rb51OklLHaz1kod9h6nV" + ] + } + }, + "_type": "tile/data-stream", + "description": "", + "activePluginConfigIds": [ + "{{configId}}" + ], + "title": "Current Score %", + "visualisation": { + "type": "data-stream-scalar", + "config": { + "data-stream-scalar": { + "value": "currentScore", + "comparisonColumn": "none" + } + } + } + } + }, { "static": false, "w": 2, @@ -394,15 +484,15 @@ "w": 1, "moved": false, "h": 2, - "x": 1, + "x": 0, "y": 4, - "i": "18116acd-6097-4b27-a0f3-9d8cee0c7611", + "i": "6aa1942a-8390-4023-9454-b5accc992f77", "z": 0, "config": { "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", "sort": { @@ -433,7 +523,7 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Persistence & Privilege Escalation", + "title": "Malware & Antivirus Detected", "visualisation": { "type": "data-stream-scalar", "config": { @@ -453,15 +543,15 @@ "w": 1, "moved": false, "h": 2, - "x": 0, + "x": 1, "y": 4, - "i": "6aa1942a-8390-4023-9454-b5accc992f77", + "i": "18116acd-6097-4b27-a0f3-9d8cee0c7611", "z": 0, "config": { "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", "sort": { @@ -492,7 +582,7 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Malware & Antivirus Detected", + "title": "Persistence & Privilege Escalation", "visualisation": { "type": "data-stream-scalar", "config": { @@ -512,15 +602,15 @@ "w": 1, "moved": false, "h": 2, - "x": 1, + "x": 2, "y": 6, - "i": "b94c9951-c17a-40b1-856f-f9a669d8ac44", + "i": "82ea55ee-eb36-4426-9ffc-a3af01c97297", "z": 0, "config": { "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType startswith \"AppControl\"\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", "sort": { @@ -551,7 +641,7 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Persistence & Privilege Escalation", + "title": "Application Control", "visualisation": { "type": "data-stream-table", "config": { @@ -571,15 +661,15 @@ "w": 1, "moved": false, "h": 2, - "x": 2, + "x": 3, "y": 6, - "i": "82ea55ee-eb36-4426-9ffc-a3af01c97297", + "i": "78729826-2fb5-4879-b90d-6be92c3cca55", "z": 0, "config": { "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\n| where ActionType startswith \"AppControl\"\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"ExploitGuardNetworkProtectionBlocked\",\"ExploitGuardNonMicrosoftSignedBlocked\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", "sort": { @@ -610,7 +700,7 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Application Control", + "title": "Exploits", "visualisation": { "type": "data-stream-table", "config": { @@ -630,15 +720,15 @@ "w": 1, "moved": false, "h": 2, - "x": 3, + "x": 0, "y": 6, - "i": "78729826-2fb5-4879-b90d-6be92c3cca55", + "i": "3b81144e-1593-4d20-a786-aa4341398f66", "z": 0, "config": { "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\n| where ActionType in (\"ExploitGuardNetworkProtectionBlocked\",\"ExploitGuardNonMicrosoftSignedBlocked\")\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", "sort": { @@ -669,15 +759,12 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Exploits", + "title": "Malware & Antivirus Detected", "visualisation": { "type": "data-stream-table", "config": { "data-stream-table": { - "columnOrder": [ - "DeviceName_uniqueValues", - "count" - ], + "columnOrder": [], "hiddenColumns": [] } } @@ -689,15 +776,15 @@ "w": 1, "moved": false, "h": 2, - "x": 0, + "x": 1, "y": 6, - "i": "3b81144e-1593-4d20-a786-aa4341398f66", + "i": "b94c9951-c17a-40b1-856f-f9a669d8ac44", "z": 0, "config": { "dataStream": { "name": "advancedHuntingQuery", "dataSourceConfig": { - "query": "DeviceEvents\n| where ActionType in (\"AntivirusDetection\",\"AntivirusDetectionCancelled\",\"AntivirusMalwareActionFailed\")\n| project Timestamp, DeviceName, ActionType" + "query": "DeviceEvents\n| where ActionType in (\"UserAccountCreated\",\"ScheduledTaskCreated\",\"ScheduledTaskDeleted\",\"UserAccountModified\",\"UserAccountAddedToLocalGroup\")\n| project Timestamp, DeviceName, ActionType" }, "id": "{{dataStreams.advancedHuntingQuery}}", "sort": { @@ -728,12 +815,15 @@ "activePluginConfigIds": [ "{{configId}}" ], - "title": "Malware & Antivirus Detected", + "title": "Persistence & Privilege Escalation", "visualisation": { "type": "data-stream-table", "config": { "data-stream-table": { - "columnOrder": [], + "columnOrder": [ + "DeviceName_uniqueValues", + "count" + ], "hiddenColumns": [] } } @@ -741,7 +831,7 @@ } } ], - "version": 68, + "version": 77, "columns": 4 } } \ No newline at end of file From ce3dac3bde067e6778ff49ccb1514dc00c6a7732 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 12 Jun 2026 11:05:18 +0100 Subject: [PATCH 46/49] fix: change references to deviceid to rawId --- .../MicrosoftDefender/v1/dataStreams/Vulnerabilities.json | 2 +- plugins/MicrosoftDefender/v1/dataStreams/devices.json | 2 +- .../MicrosoftDefender/v1/dataStreams/recommendations.json | 2 +- plugins/MicrosoftDefender/v1/indexDefinitions/default.json | 5 +---- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json index db0a500d..7ed7dd7f 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -13,7 +13,7 @@ "expandInnerObjects": true, "endpointPath": "runHuntingQuery", "postBody": { - "Query": "DeviceTvmSoftwareVulnerabilities | where DeviceId in ({{objects.map(o => {return `\"${o.deviceid}\"`}).join(\",\")}})", + "Query": "DeviceTvmSoftwareVulnerabilities | where DeviceId in ({{objects.map(o => {return `\"${o.rawId}\"`}).join(\",\")}})", "Timespan": "{{timeframe.enum != \"none\" ? `${timeframe.start}/${timeframe.end}` : \"\" }}" }, "pathToData": "results", diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index b1a582c7..1b1ad3bd 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -13,7 +13,7 @@ "expandInnerObjects": true, "endpointPath": "runHuntingQuery", "postBody": { - "Query": "DeviceInfo | where DeviceId in ({{objects.map(o => {return `\"${o.deviceid}\"`}).join(\",\")}}) | summarize arg_max(Timestamp, *) by DeviceId" + "Query": "DeviceInfo | where DeviceId in ({{objects.map(o => {return `\"${o.rawId}\"`}).join(\",\")}}) | summarize arg_max(Timestamp, *) by DeviceId" }, "pathToData": "results", "getArgs": [], diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index c138bc62..0775168e 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -13,7 +13,7 @@ "expandInnerObjects": true, "endpointPath": "runHuntingQuery", "postBody": { - "Query": "DeviceTvmSecureConfigurationAssessment | where DeviceId in ({{objects.map(o => {return `\"${o.deviceid}\"`}).join(\",\")}}) | join kind=leftouter (DeviceTvmSecureConfigurationAssessmentKB) on ConfigurationId | project DeviceId, DeviceName, Timestamp, ConfigurationId, ConfigurationName, ConfigurationCategory, ConfigurationSubcategory, ConfigurationImpact, RiskDescription, RemediationOptions, IsApplicable, IsCompliant, Tags", + "Query": "DeviceTvmSecureConfigurationAssessment | where DeviceId in ({{objects.map(o => {return `\"${o.rawId}\"`}).join(\",\")}}) | join kind=leftouter (DeviceTvmSecureConfigurationAssessmentKB) on ConfigurationId | project DeviceId, DeviceName, Timestamp, ConfigurationId, ConfigurationName, ConfigurationCategory, ConfigurationSubcategory, ConfigurationImpact, RiskDescription, RemediationOptions, IsApplicable, IsCompliant, Tags", "Timespan": "{{timeframe.enum != \"none\" ? `${timeframe.start}/${timeframe.end}` : \"\" }}" }, "pathToData": "results", diff --git a/plugins/MicrosoftDefender/v1/indexDefinitions/default.json b/plugins/MicrosoftDefender/v1/indexDefinitions/default.json index d3e2a598..bc040f79 100644 --- a/plugins/MicrosoftDefender/v1/indexDefinitions/default.json +++ b/plugins/MicrosoftDefender/v1/indexDefinitions/default.json @@ -18,10 +18,7 @@ "OSVersion", "PublicIP", "OSBuild", - "OSArchitecture", - { - "deviceid": "DeviceId" - } + "OSArchitecture" ] } } From 0beee10cce2464b7b60c56a3ab833f25806826ce Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 12 Jun 2026 11:25:29 +0100 Subject: [PATCH 47/49] Fix: do not import devices without a DeviceName --- plugins/MicrosoftDefender/v1/dataStreams/listDevices.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/listDevices.json b/plugins/MicrosoftDefender/v1/dataStreams/listDevices.json index 4cb0ffc5..614dfd08 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/listDevices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/listDevices.json @@ -13,7 +13,7 @@ "expandInnerObjects": true, "endpointPath": "runHuntingQuery", "postBody": { - "Query": "DeviceInfo | summarize arg_max(Timestamp, *) by DeviceId" + "Query": "DeviceInfo | summarize arg_max(Timestamp, *) by DeviceId | where DeviceName != \"\"" }, "pathToData": "results", "getArgs": [], From e65d8f7e05bfa5fa31fad34890bb2b72a94ad9f1 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 12 Jun 2026 11:30:53 +0100 Subject: [PATCH 48/49] style: add all data stream descriptions --- plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json | 1 + .../MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json | 1 + plugins/MicrosoftDefender/v1/dataStreams/alerts.json | 1 + plugins/MicrosoftDefender/v1/dataStreams/devices.json | 1 + plugins/MicrosoftDefender/v1/dataStreams/incidents.json | 1 + plugins/MicrosoftDefender/v1/dataStreams/recommendations.json | 1 + 6 files changed, 6 insertions(+) diff --git a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json index 7ed7dd7f..e07a68a6 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/Vulnerabilities.json @@ -1,6 +1,7 @@ { "name": "Vulnerabilities", "displayName": "Vulnerabilities", + "description": "Returns vulnerabilities data for the specified device", "baseDataSourceName": "httpRequestScoped", "config": { "httpMethod": "post", diff --git a/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json b/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json index 65ef6437..8fba6424 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/advancedHuntingQuery.json @@ -1,6 +1,7 @@ { "name": "advancedHuntingQuery", "displayName": "Advanced Hunting Query", + "description": "Queries a specified set of data supported by Defender to proactively look for specific threats in your environment", "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "post", diff --git a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json index 9b6fd0c3..a662110b 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/alerts.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/alerts.json @@ -1,6 +1,7 @@ { "name": "alerts", "displayName": "Alerts", + "description": "Returns a list of alert resources created to track suspicious activities in an organization", "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", diff --git a/plugins/MicrosoftDefender/v1/dataStreams/devices.json b/plugins/MicrosoftDefender/v1/dataStreams/devices.json index 1b1ad3bd..0c628bf2 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/devices.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/devices.json @@ -1,6 +1,7 @@ { "name": "devices", "displayName": "Devices", + "description": "Returns detailed attributes and properties for the specified device", "baseDataSourceName": "httpRequestScoped", "config": { "httpMethod": "post", diff --git a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json index a8526935..4f978ecd 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/incidents.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/incidents.json @@ -1,6 +1,7 @@ { "name": "incidents", "displayName": "Incidents", + "description": "Returns a list of incident objects that Microsoft Defender created to track attacks in an organization", "baseDataSourceName": "httpRequestUnscoped", "config": { "httpMethod": "get", diff --git a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json index 0775168e..7dc64717 100644 --- a/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json +++ b/plugins/MicrosoftDefender/v1/dataStreams/recommendations.json @@ -1,6 +1,7 @@ { "name": "recommendations", "displayName": "Recommendations", + "description": "Returns recommendations data for the specified device", "baseDataSourceName": "httpRequestScoped", "config": { "httpMethod": "post", From 4400a1d97c45b76ccb793b704b77106c25621bf2 Mon Sep 17 00:00:00 2001 From: jame2O Date: Fri, 12 Jun 2026 11:33:27 +0100 Subject: [PATCH 49/49] fix: add count col to Configuration Impact tile --- .../v1/defaultContent/Devices/recommendations.dash.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json b/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json index 27282c39..0349239b 100644 --- a/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json +++ b/plugins/MicrosoftDefender/v1/defaultContent/Devices/recommendations.dash.json @@ -201,7 +201,9 @@ "yAxisLabel": "", "horizontalLayout": "vertical", "showValue": false, - "yAxisData": [], + "yAxisData": [ + "count" + ], "showYAxisLabel": false, "xAxisLabel": "", "legendPosition": "bottom",