Skip to content

Add Trend Vision One Workbench and OAT data connectors using CCF#14535

Open
V1ManagedServices wants to merge 1 commit into
Azure:masterfrom
V1ManagedServices:trendai-sentinel-dataconnectors
Open

Add Trend Vision One Workbench and OAT data connectors using CCF#14535
V1ManagedServices wants to merge 1 commit into
Azure:masterfrom
V1ManagedServices:trendai-sentinel-dataconnectors

Conversation

@V1ManagedServices

@V1ManagedServices V1ManagedServices commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Change(s):

Added a new Trend Vision One Microsoft Sentinel data connector based on the Common Connector Framework (CCF).
Added ARM templates and deployment artifacts required for connector deployment.
Added DCR-based ingestion configuration and transformation logic for Workbench data ingestion.
Added custom table schema and supporting resources required for data collection.
Added parser/query support to transform ingested Workbench data into the expected Sentinel schema.
Reason for Change(s):

Introduce a CCF-based implementation of the Trend Vision One connector aligned with Microsoft's modern ingestion architecture.
Reduce dependency on the legacy Azure Function-based connector model.
Enable DCR-based ingestion-time transformations and simplify deployment for Microsoft Sentinel customers.
Provide a foundation for future enhancements while maintaining compatibility with existing Trend Vision One data consumption scenarios.
Version Updated:

N/A
Testing Completed:

Yes
Successfully deployed the ARM template in a Microsoft Sentinel test environment.
Verified connector deployment and data ingestion from Trend Vision One APIs.
Verified records are written to the target Log Analytics table.
Verified transformation/query logic produces the expected output schema.
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.

Adds a new TrendAI Vision One Microsoft Sentinel solution that uses the Codeless Connector Framework (CCF) with DCR-based ingestion to collect Workbench Alerts and OAT Detections, plus supporting content for visualization and detections.

Changes:

  • Added CCF connector definitions and deployment artifacts (ARM/template spec, DCR/DCE, custom tables).
  • Added parser functions to normalize legacy + CCF tables into consistent schemas.
  • Added a workbook and an analytic rule to visualize/use ingested Workbench data.

Reviewed changes

Copilot reviewed 16 out of 17 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
Solutions/TrendAI Vision One(Via CCF)/Workbooks/TrendAIVisionOneWorkbenchOverview.json Adds workbook visualizations using the Workbench parser function.
Solutions/TrendAI Vision One(Via CCF)/README.md Documents installation, configuration, tables, and sample queries.
Solutions/TrendAI Vision One(Via CCF)/Parsers/TrendAIWorkbench_Complete.yaml Adds Workbench normalization parser (legacy + CCF).
Solutions/TrendAI Vision One(Via CCF)/Parsers/TrendAIOAT_Complete.yaml Adds OAT normalization parser (legacy + CCF).
Solutions/TrendAI Vision One(Via CCF)/Package/mainTemplate.json Adds the deployable ARM template creating tables, DCR/DCE, connector definitions, parsers, and solution package.
Solutions/TrendAI Vision One(Via CCF)/Package/createUiDefinition.json Adds Azure Marketplace UI definition for solution deployment.
Solutions/TrendAI Vision One(Via CCF)/Data/Solution_TrendAIVisionOne.json Adds solution metadata referencing included artifacts.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneWorkbench_ccp/table.json Defines the Workbench custom table schema.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneWorkbench_ccp/connectorDefinition.json Defines the Workbench connector UI/metadata.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneWorkbench_ccp/PollerConfig.json Defines Workbench RestApiPoller configuration.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneWorkbench_ccp/DCR.json Defines Workbench DCR stream + transform for CCF pipeline.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneOAT_ccp/table.json Defines the OAT custom table schema.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneOAT_ccp/connectorDefinition.json Defines the OAT connector UI/metadata.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneOAT_ccp/PollerConfig.json Defines OAT RestApiPoller configuration.
Solutions/TrendAI Vision One(Via CCF)/Data Connectors/TrendAIVisionOneOAT_ccp/DCR.json Defines OAT DCR stream + transform for CCF pipeline.
Solutions/TrendAI Vision One(Via CCF)/Analytic Rules/TrendAIVisionOneWorkbenchIncident.yaml Adds scheduled analytic rule to create incidents from Workbench alerts.

Comment on lines +377 to +389
"name": "[[concat(parameters('workspace'), '/Microsoft.SecurityInsights/TrendAIWorkbench-', uniqueString(parameters('apiDomain')))]",
"apiVersion": "2023-02-01-preview",
"type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectors",
"location": "[parameters('workspace-location')]",
"kind": "RestApiPoller",
"properties": {
"connectorDefinitionName": "[[parameters('connectorDefinitionName')]",
"dataType": "TrendAI_XDR_WORKBENCH_V2_CL",
"dcrConfig": {
"streamName": "Custom-TrendAI_XDR_WORKBENCH_V2_CL",
"dataCollectionEndpoint": "[[parameters('dcrConfig').dataCollectionEndpoint]",
"dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]"
},
Comment on lines +86 to +93
{
"parameters": {
"label": "API Token",
"placeholder": "Paste your TrendAI Vision One™ API token here",
"type": "password",
"name": "apitoken",
"required": true
},
Comment on lines +14 to +17
"dataType": "TrendAI Vision One Workbench API",
"auth": {
"type": "APIKey",
"ApiKey": "[[concat('Bearer ', parameters('apitoken'))]",
"dataTypes": [
{
"name": "TrendAI_XDR_OAT_V2_CL",
"lastDataReceivedQuery": "TrendMicro_XDR_OAT_V2_CL\n | where TimeGenerated > ago(12h) | summarize Time = max(TimeGenerated)\n | where isnotempty(Time)"
"Data Connectors/TrendAIVisionOneOAT_ccp/connectorDefinition.json"
],
"Metadata": "Data/Solution_TrendAIVisionOne.json",
"BasePath": "https://raw.githubusercontent.com/trendmicro/TrendAI_Sentinel_public_data_Connector/main/Solutions/TrendAI Vision One",
Comment on lines +7 to +10
requiredDataConnectors:
- connectorId: TrendAI_XDR_Workbench
dataTypes:
- TrendAI_XDR_WORKBENCH_V2_CL
"dataFlows": [{
"streams": ["Custom-TrendAI_XDR_WORKBENCH_V2_CL"],
"destinations": ["clv2ws1"],
"transformKql": "source | extend TimeGenerated = todatetime(createdDateTime) | extend SourceSystem = 'RestAPI' | extend Computer = '' | extend MG = '' | extend ManagementGroupName = '' | extend RawData = tostring(indicators) | extend workbenchId_s = tostring(id) | extend schemaVersion_s = tostring(schemaVersion) | extend investigationStatus_s = tostring(investigationStatus) | extend alertStatus_s = tostring(status) | extend investigationResult_s = tostring(investigationResult) | extend workbenchLink_s = tostring(workbenchLink) | extend alertProvider_s = tostring(alertProvider) | extend modelId_g = tostring(modelId) | extend modelId_s = tostring(modelId) | extend model_s = tostring(model) | extend workbenchName_s = tostring(model) | extend modelType_s = tostring(modelType) | extend priorityScore_d = todouble(score) | extend severity_s = tostring(severity) | extend createdTime_t = todatetime(createdDateTime) | extend updatedTime_t = todatetime(updatedDateTime) | extend alertTriggerTimestamp_t = todatetime(createdDateTime) | extend workbenchCompleteTimestamp_t = todatetime(updatedDateTime) | extend incidentId_s = tostring(incidentId) | extend description_s = tostring(description) | extend desktopCount_d = todouble(impactScope.desktopCount) | extend serverCount_d = todouble(impactScope.serverCount) | extend accountCount_d = todouble(impactScope.accountCount) | extend emailAddressCount_d = todouble(impactScope.emailAddressCount) | extend containerCount_d = todouble(impactScope.containerCount) | extend cloudIdentityCount_d = todouble(impactScope.cloudIdentityCount) | extend cloudWorkloadCount_d = todouble(impactScope.cloudWorkloadCount) | extend indicators_dynamic = indicators | extend indicators_s = tostring(indicators) | extend impactScope_s = tostring(impactScope) | extend impactScope_Summary_s = tostring(impactScope) | extend entities = impactScope.entities | extend matchedRules_dynamic = matchedRules | extend matchedRules_s = tostring(matchedRules) | extend xdrCustomerID_g = '' | extend FileName_s = '' | extend FileHashValue_s = '' | extend DomainName_s = '' | extend FileDirectory_s = '' | extend IPAddress = '' | extend URL_s = '' | extend HostHostName_s = '' | extend ProcessCommandLine_s = '' | extend RegistryKey_s = '' | extend RegistryValue_s = '' | extend RegistryValueName_s = '' | extend UserAccountNTDomain_s = '' | extend UserAccountName_s = '' | extend MailboxPrimaryAddress_s = '' | extend MalwareName_s = '' | extend indicators = indicators_dynamic | extend matchedRules = matchedRules_dynamic | project-away id, schemaVersion, investigationStatus, status, investigationResult, workbenchLink, alertProvider, modelId, model, modelType, score, severity, createdDateTime, updatedDateTime, incidentId, description, impactScope, indicators_dynamic, matchedRules_dynamic",
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