Skip to content

Added new playbooks, workbook and migrated from function app based data connector to CCF Data connector#14508

Open
niralishah-crest wants to merge 1 commit into
Azure:masterfrom
niralishah-crest:VectraRUX
Open

Added new playbooks, workbook and migrated from function app based data connector to CCF Data connector#14508
niralishah-crest wants to merge 1 commit into
Azure:masterfrom
niralishah-crest:VectraRUX

Conversation

@niralishah-crest

Copy link
Copy Markdown
Contributor

Required items, please complete

Change(s):

  • Added new playbooks and workbook
  • removed some existing playbooks
  • removed existing
  • migrated from function app based data connector to CCF based data connector
  • updated existing workbook based on schema updates in data connector

Reason for Change(s):

  • New requirements from customer
  • customer is moving from entity based approach to detection based so need to update things accordingly
  • migration required from function app to CCF connector

Version Updated:

  • Yes, 3.3.1

Testing Completed:

  • Yes

Checked that the validations are passing and have addressed any issues that are present:

  • Yes

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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.

This PR migrates the Vectra XDR solution from an Azure Function-based connector to a Codeless Connector Framework (CCF) connector, while also updating solution content (playbooks/workbooks/parsers/analytic rules) to support a detection-based workflow.

Changes:

  • Added CCF connector assets (connector definition, polling config, DCR, and custom tables).
  • Added/updated parsers and new analytic rules to work with the new schema.
  • Reworked packaged UI/parameters and removed several legacy playbook READMEs.

Reviewed changes

Copilot reviewed 42 out of 66 changed files in this pull request and generated 21 comments.

Show a summary per file
File Description
Solutions/Vectra XDR/_backup_old_connectors/VectraCCFConnector.bak/VectraRUX_Table_Lockdown.json Backup copy of old table resource definition (may impact validation if shipped).
Solutions/Vectra XDR/_backup_old_connectors/VectraCCFConnector.bak/VectraRUX_Table_Entities.json Backup copy of old table resource definition (may impact validation if shipped).
Solutions/Vectra XDR/_backup_old_connectors/VectraCCFConnector.bak/VectraRUX_Table_Detections.json Backup copy of old table resource definition (may impact validation if shipped).
Solutions/Vectra XDR/_backup_old_connectors/VectraCCFConnector.bak/VectraRUX_PollingConfig.json Backup polling config for legacy connector (string template expressions appear malformed).
Solutions/Vectra XDR/_backup_old_connectors/VectraCCFConnector.bak/VectraRUX_DCR.json Backup DCR definition for legacy connector (contains transformKql).
Solutions/Vectra XDR/_backup_old_connectors/VectraCCFConnector.bak/VectraRUX_ConnectorDefinition.json Backup connector definition describing CCF connector UI and queries.
Solutions/Vectra XDR/Playbooks/VectraUpdateIncidentBasedOnTagAndNotify/README.md Removed legacy playbook documentation.
Solutions/Vectra XDR/Playbooks/VectraStaticResolveAssignment/README.md Removed legacy playbook documentation.
Solutions/Vectra XDR/Playbooks/VectraSetDetectionStatus/README.md Added/updated playbook documentation for detection-status workflow.
Solutions/Vectra XDR/Playbooks/VectraOperateOnEntitySourceIP/README.md Removed legacy playbook documentation.
Solutions/Vectra XDR/Playbooks/VectraMarkDetectionsAsFixed/README.md Removed legacy playbook documentation.
Solutions/Vectra XDR/Playbooks/VectraDynamicResolveAssignment/README.md Removed legacy playbook documentation.
Solutions/Vectra XDR/Playbooks/VectraDetectionTimelineLink/azuredeploy.json Added new playbook ARM template to comment with pivot + workbook link.
Solutions/Vectra XDR/Playbooks/VectraDecorateIncidentBasedOnTagAndNotify/README.md Removed legacy playbook documentation.
Solutions/Vectra XDR/Playbooks/VectraDecorateIncidentBasedOnTag/README.md Removed legacy playbook documentation.
Solutions/Vectra XDR/Playbooks/VectraAddTagToDetections/README.md Added/updated playbook documentation for tagging detections.
Solutions/Vectra XDR/Playbooks/VectraAddNoteToDetections/README.md Added/updated playbook documentation for adding notes to detections.
Solutions/Vectra XDR/Parsers/VectraRUXDetections.yaml Added new parser function for detections.
Solutions/Vectra XDR/Parsers/VectraLockdown.yaml Updated lockdown parser to union old/new table names.
Solutions/Vectra XDR/Parsers/VectraEntities.yaml Added new entities parser supporting old/new table names.
Solutions/Vectra XDR/Parsers/VectraDetectionsCombined.yaml Added combined parser bridging Function + CCF schemas.
Solutions/Vectra XDR/Package/testParameters.json Modified packaged parameters used for deploy-time testing.
Solutions/Vectra XDR/Package/createUiDefinition.json Modified packaged UI definition content/sections.
Solutions/Vectra XDR/Data/Solution_VectraXDR.json Updated solution manifest: workbooks, playbooks, connector reference, version/basepath.
Solutions/Vectra XDR/Data Connectors/VectraUpdatedCCFConnector/VectraRUX_Table_Lockdown.json Added new CCF custom table schema for lockdown.
Solutions/Vectra XDR/Data Connectors/VectraUpdatedCCFConnector/VectraRUX_Table_Entities.json Added new CCF custom table schema for entities.
Solutions/Vectra XDR/Data Connectors/VectraUpdatedCCFConnector/VectraRUX_Table_Detections.json Added new CCF custom table schema for detections.
Solutions/Vectra XDR/Data Connectors/VectraUpdatedCCFConnector/VectraRUX_PollingConfig.json Added new CCF polling configuration (template expressions currently malformed).
Solutions/Vectra XDR/Data Connectors/VectraUpdatedCCFConnector/VectraRUX_DCR.json Added new DCR including ingestion-time transforms into LA.
Solutions/Vectra XDR/Analytic Rules/Vectra_RUX_Incident_Detection_Host.yaml Added new scheduled analytic rule for escalated/unresolved host detection.
Solutions/Vectra XDR/Analytic Rules/Vectra_RUX_Incident_Detection_Account.yaml Added new scheduled analytic rule for escalated/unresolved account detection.

Comment on lines +3 to +4
"condition": "[[equals(parameters('selectedStream')[0], 'detections')]",
"name": "[[concat('parameters('workspace')', '/Microsoft.SecurityInsights/', uniqueString(concat('VectraDetectionsPoller', parameters('alias'))))]",
"TokenEndpointHeaders": {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "[[concat('Basic ', base64(concat(parameters('clientId'), ':', parameters('clientSecret'))))]",
"clv2ws1"
],
"outputStream": "Custom-Detections_Data_CCF_CL",
"transformKql": "source | extend threat = real(null) , certainty = real(null) | extend entity_type = ['type'] , TimeGenerated = iff(isnull(['event_timestamp']), now(), todatetime(['event_timestamp'])) , id = todouble(id) , detection_id = todouble(detection_id) , entity_id = todouble(entity_id) , src_host_id = tolong(src_host['id']) , src_host_ip = tostring(src_host['ip']) , src_host_name = tostring(src_host['name']) , src_host_url = tostring(src_host['url']) , src_host_certainty = toreal(src_host['certainty']) , src_host_threat = toreal(src_host['threat']) , src_host_is_key_asset = tobool(src_host['is_key_asset']) , src_host_groups = src_host['groups'] , src_account_id = tolong(src_account['id']) , src_account_name = tostring(src_account['name']) , src_account_url = tostring(src_account['url']) , src_account_groups = src_account['groups'] , dst_host_id = tolong(dst_host['id']) , dst_host_ip = tostring(dst_host['ip']) , dst_host_name = tostring(dst_host['name']) , dst_host_url = tostring(dst_host['url']) , dst_host_session_luid = tostring(dst_host['session_luid']) , dst_host_groups = dst_host['groups'] , dst_account_id = tolong(dst_account['id']) , dst_account_name = tostring(dst_account['name']) , dst_account_uid = tostring(dst_account['uid']) , dst_account_url = tostring(dst_account['url']) , dst_account_groups = dst_account['groups'] , dst_domain_dns = tostring(dst_domain['dns']) , dst_domain_domain = tostring(dst_domain['domain']) , dst_domain_external_target = tostring(dst_domain['external_target']) , src_external_host_ip = tostring(src_external_host['ip']) , src_external_host_name = tostring(src_external_host['name']) , data_source_sensor_id = tostring(data_source['sensor_id']) , data_source_sensor_name = tostring(data_source['sensor_name']) , data_source_type = tostring(data_source['type']) , filters_filtered_by_ai = tobool(filters['filtered_by_ai']) , filters_filtered_by_rule = tobool(filters['filtered_by_rule']) , filters_filtered_by_user = tobool(filters['filtered_by_user']) , filters_is_custom_model = tobool(filters['is_custom_model']) , filters_triaged = tobool(filters['triaged']) , assignment_id = tolong(assignment['id']) , assignment_assigned_by = assignment['assigned_by'] , assignment_assigned_by_id = tolong(assignment['assigned_by']['id']) , assignment_assigned_by_username = tostring(assignment['assigned_by']['username']) , assignment_assigned_to = assignment['assigned_to'] , assignment_assigned_to_id = tolong(assignment['assigned_to']['id']) , assignment_assigned_to_username = tostring(assignment['assigned_to']['username']) , assignment_date_assigned = todatetime(assignment['date_assigned']) , is_targeting_key_asset = tostring(is_targeting_key_asset) , src_ip = tostring(src_host['ip']) | project TimeGenerated , id , detection_id , change_type , event_timestamp , event_type , category , threat , certainty , severity , d_type_vname , triaged , detail , d_detection_details , detection_href , detection_type , entity_id , entity_uid , entity_name , entity_type , url , mitre , is_prioritized , is_targeting_key_asset , unresolved_priority , investigation_status , reason , src_host , src_host_id , src_host_ip , src_ip , src_host_name , src_host_url , src_host_certainty , src_host_threat , src_host_is_key_asset , src_host_groups , src_account , src_account_id , src_account_name , src_account_url , src_account_groups , dst_host , dst_host_id , dst_host_ip , dst_host_name , dst_host_url , dst_host_session_luid , dst_host_groups , dst_account , dst_account_id , dst_account_name , dst_account_uid , dst_account_url , dst_account_groups , dst_domain , dst_domain_dns , dst_domain_domain , dst_domain_external_target , src_external_host , src_external_host_ip , src_external_host_name , data_source , data_source_sensor_id , data_source_sensor_name , data_source_type , filters , filters_filtered_by_ai , filters_filtered_by_rule , filters_filtered_by_user , filters_is_custom_model , filters_triaged , assignment , assignment_id , assignment_assigned_by , assignment_assigned_by_id , assignment_assigned_by_username , assignment_assigned_to , assignment_assigned_to_id , assignment_assigned_to_username , assignment_date_assigned , summary , grouped_details , tags , normal_domains , external_reference_id , process_context_data"
"clv2ws1"
],
"outputStream": "Custom-Lockdown_Data_CCF_CL",
"transformKql": "source | extend TimeGenerated = iff(isnull(['lock_event_timestamp']), now(), todatetime(['lock_event_timestamp'])) , id = todouble(id) , entity_id = todouble(entity_id) , entity_type = ['type'] | project TimeGenerated , id , lock_event_timestamp , locked_by , unlock_event_timestamp , entity_id , entity_name , entity_type"
"clv2ws1"
],
"outputStream": "Custom-Entities_Data_CCF_CL",
"transformKql": "source | extend TimeGenerated = iff(isnull(last_modified_timestamp), now(), todatetime(last_modified_timestamp)) , entity_type = ['type'] , id = todouble(id) , assignment_id = todouble(assignment['id']) , assignment_assigned_by = assignment['assigned_by'] , assignment_assigned_by_id = todouble(assignment['assigned_by']['id']) , assignment_assigned_by_username = tostring(assignment['assigned_by']['username']) , assignment_date_assigned = todatetime(assignment['date_assigned']) , assignment_assigned_to = assignment['assigned_to'] , assignment_assigned_to_id = todouble(assignment['assigned_to']['id']) , assignment_assigned_to_username = tostring(assignment['assigned_to']['username']) | project TimeGenerated , id , name , breadth_contrib , importance , entity_type , is_prioritized , severity , urgency_score , velocity_contrib , detection_set , last_detection_timestamp , last_modified_timestamp , notes , attack_rating , privilege_level , privilege_category , attack_profile , sensors , state , tags , url , host_type , account_type , ip , assignment , assignment_id , assignment_assigned_by , assignment_assigned_by_id , assignment_assigned_by_username , assignment_date_assigned , assignment_assigned_to , assignment_assigned_to_id , assignment_assigned_to_username"
Comment on lines 106 to +107
"type": "Microsoft.Common.Section",
"label": "Vectra XDR",
"label": null,
Comment on lines 112 to +113
"options": {
"text": "This workbook provides visualization of Audit, Detections, Entity Scoring, Lockdown and Health data."
}
}
]
}
]
},
{
"name": "analytics",
"label": "Analytics",
"subLabel": {
"preValidation": "Configure the analytics",
"postValidation": "Done"
},
"bladeTitle": "Analytics",
"elements": [
{
"name": "analytics-text",
"type": "Microsoft.Common.TextBlock",
"options": {
"text": "This solution installs the following analytic rule templates. After installing the solution, create and enable analytic rules in Manage solution view."
}
},
{
"name": "analytics-link",
"type": "Microsoft.Common.TextBlock",
"options": {
"link": {
"label": "Learn more",
"uri": "https://docs.microsoft.com/azure/sentinel/tutorial-detect-threats-custom?WT.mc_id=Portal-Microsoft_Azure_CreateUIDef"
}
}
},
{
"name": "analytic1",
"type": "Microsoft.Common.Section",
"label": "Vectra Create Incident Based on Tag for Accounts",
"elements": [
{
"name": "analytic1-text",
"type": "Microsoft.Common.TextBlock",
"options": {
"text": "Create an incident when the account entity presents a specific tag. If the tag is present, an incident should be created and marked with highest priority."
"text": null
Comment on lines 24 to 27
"workbook1-name": {
"type": "string",
"defaultValue": "Vectra XDR",
"defaultValue": null,
"minLength": 1,
"isWizard": false,
"basics": {
"description": "<img src=\"https://raw.githubusercontent.com/Azure/Azure-Sentinel/master/Logos/AIVectraDetect.svg\" width=\"75px\" height=\"75px\">\n\n**Note:** Please refer to the following before installing the solution: \n\n• Review the solution [Release Notes](https://github.com/Azure/Azure-Sentinel/tree/master/Solutions/Vectra%20XDR/ReleaseNotes.md)\n\n • There may be [known issues](https://aka.ms/sentinelsolutionsknownissues) pertaining to this Solution, please refer to them before installing.\n\nVectra AI is the leader in AI-driven threat detection and response for hybrid and multi-cloud enterprises. Vectra AI's cloud-native platform - powered by our patented Attack Signal Intelligence- provide security teams with unified threat visibility, context and control across public cloud, SaaS, identity and data center networks in a prioritized feed. Vectra AI-driven Attack Signal IntelligenceTM, empowers SOC analysts to rapidly prioritize, investigate and respond to the most urgent cyber-attacks in their hybrid cloud environment. Organizations worldwide rely on Vectra AI's cloud-native platform and MDR services to see and stop attacks from becoming breaches. The Vectra AI App enables the security operations team to consume the industry's richest threat signals spanning public cloud, SaaS, identity and data center networks inside of Microsoft Sentinel. For more information, visit www.vectra.ai.\n\n The Vectra XDR App for Microsoft Sentinel contains:\n Data Connector to ingest events generated by Vectra XDR (through OMS agent).\n Workbook: Dynamic dashboard view of Entities, Detections, Lockdown, Audit and, Health\n\n**Data Connectors:** 1, **Parsers:** 5, **Workbooks:** 1, **Analytic Rules:** 7, **Playbooks:** 20\n\n[Learn more about Microsoft Sentinel](https://aka.ms/azuresentinel) | [Learn more about Solutions](https://aka.ms/azuresentinelsolutionsdoc)",
"description": "<img src=\"https://raw.githubusercontent.com/Azure/Azure-Sentinel/master/Logos/AIVectraDetect.svg\" width=\"75px\" height=\"75px\">\n\n**Note:** Please refer to the following before installing the solution: \n\n• Review the solution [Release Notes](https://github.com/Azure/Azure-Sentinel/tree/master/Solutions/Vectra%20XDR/ReleaseNotes.md)\n\n • There may be [known issues](https://aka.ms/sentinelsolutionsknownissues) pertaining to this Solution, please refer to them before installing.\n\nVectra AI is the leader in AI-driven threat detection and response for hybrid and multi-cloud enterprises. Vectra AI's cloud-native platform - powered by our patented Attack Signal Intelligence- provide security teams with unified threat visibility, context and control across public cloud, SaaS, identity and data center networks in a prioritized feed. Vectra AI-driven Attack Signal IntelligenceTM, empowers SOC analysts to rapidly prioritize, investigate and respond to the most urgent cyber-attacks in their hybrid cloud environment. Organizations worldwide rely on Vectra AI's cloud-native platform and MDR services to see and stop attacks from becoming breaches. The Vectra AI App enables the security operations team to consume the industry's richest threat signals spanning public cloud, SaaS, identity and data center networks inside of Microsoft Sentinel. For more information, visit www.vectra.ai.\n\n The Vectra XDR App for Microsoft Sentinel contains:\n Data Connector to ingest events generated by Vectra XDR (through OMS agent).\n Workbook: Dynamic dashboard view of Entities, Detections, Lockdown, Audit and, Health\n\n**Data Connectors:** 1, **Workbooks:** 1\n\n[Learn more about Microsoft Sentinel](https://aka.ms/azuresentinel) | [Learn more about Solutions](https://aka.ms/azuresentinelsolutionsdoc)",
Comment on lines +3 to +4
"condition": "[[equals(parameters('selectedStream')[0], 'detections')]",
"name": "[[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', uniqueString(concat('VectraDetectionsPoller', parameters('alias'))))]",
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants