Skip to content

Spur Context API Custom Connector#14148

Merged
v-dvedak merged 3 commits intoAzure:masterfrom
RamboV:master
Apr 29, 2026
Merged

Spur Context API Custom Connector#14148
v-dvedak merged 3 commits intoAzure:masterfrom
RamboV:master

Conversation

@RamboV
Copy link
Copy Markdown
Contributor

@RamboV RamboV commented Apr 28, 2026

Spur Context API provides access to the highest-fidelity IP intelligence available on-demand, delivering the right IP enriched data in real-time to protect digital assets from the risk of obscured VPN, residential proxy, and bot automation traffic. This solution includes playbooks for IP enrichment on incidents and alerts, with context data added to incident comments and optionally saved in Log Analytics custom tables.

@RamboV RamboV requested review from a team as code owners April 28, 2026 10:02
@v-maheshbh v-maheshbh self-assigned this Apr 28, 2026
@v-maheshbh v-maheshbh added the New Solution For new Solutions which are new to Microsoft Sentinel label Apr 28, 2026
@v-maheshbh v-maheshbh requested a review from Copilot April 28, 2026 11:26
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds the Spur Context API Solution to Microsoft Sentinel, providing a custom connector plus incident/alert-triggered playbooks for IP enrichment and optional Log Analytics ingestion.

Changes:

  • Added solution metadata + solution data manifest for the Spur solution.
  • Added two playbooks (Incident + Alert triggers) and a Spur Context API custom connector ARM template + docs.
  • Added initial release notes and solution README documentation.

Reviewed changes

Copilot reviewed 12 out of 23 changed files in this pull request and generated 14 comments.

Show a summary per file
File Description
Solutions/Spur/readme.md Adds solution-level documentation (overview, enrichment use case, app registration, deploy order).
Solutions/Spur/SolutionMetadata.json Defines marketplace/solution metadata (publisher/offer, categories, support).
Solutions/Spur/ReleaseNotes.md Adds initial version entry for the solution.
Solutions/Spur/Playbooks/Spur-Get-IP-Context-Data-Incident-Trigger/readme.md Documents the incident-trigger IP enrichment playbook and deployment steps.
Solutions/Spur/Playbooks/Spur-Get-IP-Context-Data-Incident-Trigger/azuredeploy.json ARM template for incident-trigger playbook + connections + optional custom log ingestion.
Solutions/Spur/Playbooks/Spur-Get-IP-Context-Data-Alert-Trigger/readme.md Documents the alert-trigger IP enrichment playbook and deployment steps.
Solutions/Spur/Playbooks/Spur-Get-IP-Context-Data-Alert-Trigger/azuredeploy.json ARM template for alert-trigger playbook + connections + optional custom log ingestion.
Solutions/Spur/Playbooks/Custom Connector/readme.md Documents the Spur custom connector and required permissions/DCR+DCE setup.
Solutions/Spur/Playbooks/Custom Connector/azuredeploy.json ARM template for custom connector plus Log Analytics table + DCE + DCR provisioning.
Solutions/Spur/Package/testParameters.json Ignored from review (Solutions//Package/ excluded).
Solutions/Spur/Package/createUiDefinition.json Ignored from review (Solutions//Package/ excluded).
Solutions/Spur/Data/Solution_Spur.json Defines the solution content manifest (playbooks list, versioning, metadata linkage).

Comment thread Solutions/Spur/ReleaseNotes.md Outdated
Comment on lines +1 to +3
| **Version** | **Date Modified (DD-MM-YYYY)** | **Change History** |
|-------------|--------------------------------|---------------------------------------------|
| 3.0.0 | 25-04-2026 | Initial Solution Release |
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The release notes table rows include an extra leading | which makes the table formatting invalid (and can be interpreted as extra empty columns). Update the table to have exactly 3 columns with a single leading/trailing | per row as required.

Copilot uses AI. Check for mistakes.
Comment thread Solutions/Spur/SolutionMetadata.json Outdated
@@ -0,0 +1,15 @@
{
"publisherId": "spur1680448518850",
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

publisherId must match an approved publisher identifier (or a pre-approved custom one). "spur1680448518850" is not one of the approved values (azuresentinel, microsoftsentinelcommunity), so this will fail solution-metadata validation unless it has been pre-approved—please update to an approved/pre-approved publisherId.

Suggested change
"publisherId": "spur1680448518850",
"publisherId": "microsoftsentinelcommunity",

Copilot uses AI. Check for mistakes.
Comment thread Solutions/Spur/Data/Solution_Spur.json Outdated
@@ -0,0 +1,17 @@
{
"Name": "Spur",
"Author": "Spur",
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Multiple solution-data validation issues:

  • Author must include contact info in the format {Organization} - {email} (e.g., Spur - support@spur.com).
Suggested change
"Author": "Spur",
"Author": "Spur - support@spur.com",

Copilot uses AI. Check for mistakes.
Comment on lines +13 to +15
"Version": "3.0.0",
"Metadata": "SolutionMetadata.json",
"TemplateSpec": true,
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Multiple solution-data validation issues:

  • Author must include contact info in the format {Organization} - {email} (e.g., Spur - support@spur.com).

Copilot uses AI. Check for mistakes.
Comment on lines +6 to +10
"Playbooks": [
"Playbooks/Custom Connector/azuredeploy.json",
"Playbooks/Spur-Get-IP-Context-Data-Incident-Trigger/azuredeploy.json",
"Playbooks/Spur-Get-IP-Context-Data-Alert-Trigger/azuredeploy.json"
],
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The playbook/custom-connector path includes a folder with a space (Playbooks/Custom Connector/), which violates the repository Playbooks naming/file-structure conventions (no spaces; Custom Connectors must live under Playbooks/CustomConnector/<Name>CustomConnector/). Rename/restructure the custom connector folder accordingly and update this manifest path to match.

Copilot generated this review using guidance from repository custom instructions.
},
{
"type": "Microsoft.Logic/workflows",
"apiVersion": "2017-07-01",
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Logic App workflow resource should use apiVersion 2019-05-01 per Sentinel playbook ARM template requirements. Using 2017-07-01 can break template validation and Gallery packaging—please update the workflow resource apiVersion accordingly.

Suggested change
"apiVersion": "2017-07-01",
"apiVersion": "2019-05-01",

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +14
"type": "String",
"metadata": {
"description": "Name of the Logic App/Playbook"
}
},
"SpurConnectorName": {
"defaultValue": "Spur-Context-Connector",
"type": "String",
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ARM template parameter type values should use standard lowercase ARM types (string, bool, secureString, object, etc.). Using String/Bool/SecureString/Object may fail repo validation tooling—please normalize these types.

Suggested change
"type": "String",
"metadata": {
"description": "Name of the Logic App/Playbook"
}
},
"SpurConnectorName": {
"defaultValue": "Spur-Context-Connector",
"type": "String",
"type": "string",
"metadata": {
"description": "Name of the Logic App/Playbook"
}
},
"SpurConnectorName": {
"defaultValue": "Spur-Context-Connector",
"type": "string",

Copilot uses AI. Check for mistakes.
Comment on lines +1257 to +1260
"name": "access_token_body",
"type": "string",
"value": "@{concat(concat(concat(concat('grant_type=client_credentials&client_id=',parameters('ClientID')),'&client_secret='),parameters('ClientSecret')),'&scope=https://monitor.azure.com/.default')}"
},
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This concatenates ClientSecret into a plain string variable (access_token_body), which can expose the secret in Logic App run history, inputs/outputs, and diagnostics. Avoid storing secrets in variables; instead pass the secret directly as a secure parameter into the HTTP action with secure inputs/outputs enabled (or enable secureData masking on the relevant actions).

Copilot uses AI. Check for mistakes.
Comment on lines +208 to +209
"[variables('tableName')]",
"[parameters('DCEName')]"
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dependsOn must reference resource IDs, not a table name variable or parameter value. As written, this dependency won’t ensure correct deployment ordering and can cause ARM validation failures. Use resourceId(...) references to the workspace table resource and the data collection endpoint resource.

Suggested change
"[variables('tableName')]",
"[parameters('DCEName')]"
"[resourceId('Microsoft.OperationalInsights/workspaces/tables', parameters('workspaceName'), variables('tableName'))]",
"[resourceId('Microsoft.Insights/dataCollectionEndpoints', parameters('DCEName'))]"

Copilot uses AI. Check for mistakes.
Comment on lines +188 to +196
"configurationAccess": {
"endpoint": "[concat('https://', parameters('DCEName'), '-eawp.', parameters('location'), '-1.handler.control.monitor.azure.com')]"
},
"logsIngestion": {
"endpoint": "[concat('https://', parameters('DCEName'), '-eawp.', parameters('location'), '-1.ingest.monitor.azure.com')]"
},
"metricsIngestion": {
"endpoint": "[concat('https://', parameters('DCEName'), '-eawp.', parameters('location'), '-1.metrics.ingest.monitor.azure.com')]"
},
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These endpoint fields for Microsoft.Insights/dataCollectionEndpoints are typically system-generated/read-only values, and hardcoding region-specific hostnames is fragile and may fail ARM deployment. Prefer letting Azure provision the endpoint and then output the ingestion URI, rather than attempting to set these properties.

Suggested change
"configurationAccess": {
"endpoint": "[concat('https://', parameters('DCEName'), '-eawp.', parameters('location'), '-1.handler.control.monitor.azure.com')]"
},
"logsIngestion": {
"endpoint": "[concat('https://', parameters('DCEName'), '-eawp.', parameters('location'), '-1.ingest.monitor.azure.com')]"
},
"metricsIngestion": {
"endpoint": "[concat('https://', parameters('DCEName'), '-eawp.', parameters('location'), '-1.metrics.ingest.monitor.azure.com')]"
},

Copilot uses AI. Check for mistakes.
@RamboV
Copy link
Copy Markdown
Contributor Author

RamboV commented Apr 29, 2026

spur_custom_connector spur_custom_table

Remove redundant top-level headers and compress file to only the version table. Also added a trailing period to the 3.0.0 release entry for punctuation consistency.
@v-dvedak v-dvedak merged commit 6d93cbf into Azure:master Apr 29, 2026
33 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

New Solution For new Solutions which are new to Microsoft Sentinel

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants