Skip to content

Commit 4c731dd

Browse files
committed
fix(TacitRed-Defender): Restructure playbook folders for Content Hub visibility
- Move Function App from Playbooks/CustomConnector/ to Playbooks/ (matches Fortinet pattern) - Remove functionCode.zip from Package folder per reviewer request - Remove duplicate workspaceResourceId variable that caused V3 packaging error - Update Data/Solution file with new playbook paths - Re-run V3 packaging to regenerate mainTemplate.json
1 parent 4fcfd96 commit 4c731dd

File tree

6 files changed

+44
-40
lines changed

6 files changed

+44
-40
lines changed

Solutions/TacitRed-Defender-ThreatIntelligence/Data/Solution_TacitRedDefenderThreatIntelligence.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"Logo": "<img src=\"https://raw.githubusercontent.com/Azure/Azure-Sentinel/master/Logos/tacitred_logo.svg\"width=\"75px\"height=\"75px\">",
55
"Description": "The TacitRed Defender Threat Intelligence solution integrates TacitRed's threat intelligence feed with Microsoft Sentinel. It automatically retrieves compromised credentials and other threat indicators from TacitRed and ingests them into Microsoft Sentinel using the Upload API for enhanced threat detection.",
66
"Playbooks": [
7-
"Playbooks/CustomConnector/TacitRedDefenderTI_FunctionApp/azuredeploy.json",
7+
"Playbooks/TacitRedDefenderTI_FunctionApp/azuredeploy.json",
88
"Playbooks/TacitRedToDefenderTI/azuredeploy.json"
99
],
1010
"Metadata": "SolutionMetadata.json",
-671 Bytes
Binary file not shown.

Solutions/TacitRed-Defender-ThreatIntelligence/Package/createUiDefinition.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"config": {
77
"isWizard": false,
88
"basics": {
9-
"description": "<svg id=\"d4e9f9a0-1b2c-4d4e-9f6a-7b8c9d0e1f2a\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 50\" width=\"75px\" height=\"75px\"><text x=\"10\" y=\"35\" font-family=\"Arial, sans-serif\" font-size=\"24\" font-weight=\"bold\" fill=\"#000000\">Tacit</text><text x=\"70\" y=\"35\" font-family=\"Arial, sans-serif\" font-size=\"24\" font-weight=\"bold\" fill=\"#FF0000\">Red</text><text x=\"120\" y=\"35\" font-family=\"Arial, sans-serif\" font-size=\"12\" fill=\"#555555\">by Data443</text></svg>\n\n**Note:** Please refer to the following before installing the solution: \n\n&#8226; Review the solution [Release Notes](https://github.com/Azure/Azure-Sentinel/tree/master/Solutions/TacitRed-Defender-ThreatIntelligence/ReleaseNotes.md)\n\n&#8226; There may be [known issues](https://aka.ms/sentinelsolutionsknownissues) pertaining to this Solution, please refer to them before installing.\n\nThe TacitRed Defender Threat Intelligence solution integrates TacitRed's threat intelligence feed with Microsoft Sentinel. It automatically retrieves compromised credentials and other threat indicators from TacitRed and ingests them into Microsoft Sentinel using the Upload API for enhanced threat detection.\n\n**Function Apps:** 1, **Playbooks:** 1\n\n[Learn more about Microsoft Sentinel](https://aka.ms/azuresentinel) | [Learn more about Solutions](https://aka.ms/azuresentinelsolutionsdoc)",
9+
"description": "<img src=\"https://raw.githubusercontent.com/Azure/Azure-Sentinel/master/Logos/tacitred_logo.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/TacitRed-Defender-ThreatIntelligence/ReleaseNotes.md)\n\n • There may be [known issues](https://aka.ms/sentinelsolutionsknownissues) pertaining to this Solution, please refer to them before installing.\n\nThe TacitRed Defender Threat Intelligence solution integrates TacitRed's threat intelligence feed with Microsoft Sentinel. It automatically retrieves compromised credentials and other threat indicators from TacitRed and ingests them into Microsoft Sentinel using the Upload API for enhanced threat detection.\n\n**Function Apps:** 1, **Playbooks:** 1\n\n[Learn more about Microsoft Sentinel](https://aka.ms/azuresentinel) | [Learn more about Solutions](https://aka.ms/azuresentinelsolutionsdoc)",
1010
"subscription": {
1111
"resourceProviders": [
1212
"Microsoft.OperationsManagement/solutions",
@@ -64,7 +64,7 @@
6464
"name": "playbooks-text",
6565
"type": "Microsoft.Common.TextBlock",
6666
"options": {
67-
"text": "This solution installs the Playbook templates to help implement your Security Orchestration, Automation and Response (SOAR) operations. After installing the solution, these will be deployed under Playbook Templates in the Automation blade in Microsoft Sentinel. They can be configured and managed from the Manage solution view in Content Hub.\n\n**Important:** Deploy the Azure Function App first, then deploy the Playbook and provide the Function App URL when prompted."
67+
"text": "This solution installs the Playbook templates to help implement your Security Orchestration, Automation and Response (SOAR) operations. After installing the solution, these will be deployed under Playbook Templates in the Automation blade in Microsoft Sentinel. They can be configured and managed from the Manage solution view in Content Hub."
6868
}
6969
},
7070
{
Binary file not shown.

Solutions/TacitRed-Defender-ThreatIntelligence/Package/mainTemplate.json

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -70,29 +70,6 @@
7070
"mainTemplate": {
7171
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
7272
"contentVersion": "[variables('playbookVersion1')]",
73-
"metadata": {
74-
"title": "TacitRed Defender TI - Function App",
75-
"description": "This Azure Function App processes TacitRed threat intelligence data and prepares it for ingestion into Microsoft Defender Threat Intelligence via the Upload API.",
76-
"prerequisites": "1. TacitRed API Key (obtain from https://app.tacitred.com)\n2. Microsoft Sentinel workspace with Defender TI integration",
77-
"postDeployment": [
78-
"1. Note the Function App URL after deployment",
79-
"2. Deploy the TacitRedToDefenderTI Logic App playbook",
80-
"3. Configure the Logic App with the Function App URL and TacitRed API Key"
81-
],
82-
"prerequisitesDeployTemplateFile": "",
83-
"lastUpdateTime": "2025-12-10T00:00:00.000Z",
84-
"entities": [],
85-
"tags": ["ThreatIntelligence", "DefenderTI", "AzureFunction", "TacitRed"],
86-
"support": {
87-
"tier": "Partner",
88-
"name": "Data443 Risk Mitigation, Inc.",
89-
"email": "support@data443.com",
90-
"link": "https://www.data443.com"
91-
},
92-
"author": {
93-
"name": "Data443 Risk Mitigation, Inc."
94-
}
95-
},
9673
"parameters": {
9774
"FunctionAppName": {
9875
"defaultValue": "tacitreddefenderti",
@@ -219,7 +196,7 @@
219196
},
220197
{
221198
"name": "SENTINEL_WORKSPACE_ID",
222-
"value": "[[variables('workspaceResourceId')]"
199+
"value": "[[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]"
223200
},
224201
{
225202
"name": "APPINSIGHTS_INSTRUMENTATIONKEY",
@@ -233,7 +210,7 @@
233210
"type": "Microsoft.Authorization/roleAssignments",
234211
"apiVersion": "2022-04-01",
235212
"name": "[[guid(resourceGroup().id, variables('functionAppName'), 'Reader')]",
236-
"scope": "[[variables('workspaceResourceId')]",
213+
"scope": "[[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]",
237214
"properties": {
238215
"roleDefinitionId": "[[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
239216
"principalId": "[[reference(resourceId('Microsoft.Web/sites', variables('functionAppName')), '2024-04-01', 'Full').identity.principalId]",
@@ -247,7 +224,7 @@
247224
"type": "Microsoft.Authorization/roleAssignments",
248225
"apiVersion": "2022-04-01",
249226
"name": "[[guid(resourceGroup().id, variables('functionAppName'), 'SentinelContributor')]",
250-
"scope": "[[variables('workspaceResourceId')]",
227+
"scope": "[[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]",
251228
"properties": {
252229
"roleDefinitionId": "[[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ab8e14d6-4a74-4a29-9ba8-549422addade')]",
253230
"principalId": "[[reference(resourceId('Microsoft.Web/sites', variables('functionAppName')), '2024-04-01', 'Full').identity.principalId]",
@@ -283,7 +260,33 @@
283260
}
284261
}
285262
}
286-
]
263+
],
264+
"metadata": {
265+
"title": "TacitRedDefenderTI_FunctionApp",
266+
"description": "This Azure Function connects to TacitRed API to retrieve compromised credentials and pushes them to Microsoft Defender Threat Intelligence.",
267+
"prerequisites": [
268+
"TacitRed API Key",
269+
"Microsoft Sentinel workspace with Defender TI enabled"
270+
],
271+
"lastUpdateTime": "2025-12-09T00:00:00Z",
272+
"tags": [
273+
"TacitRed",
274+
"Threat Intelligence",
275+
"Azure Function"
276+
],
277+
"postDeployment": [
278+
"Deploy the TacitRedToDefenderTI playbook and provide the Function App URL"
279+
],
280+
"releaseNotes": [
281+
{
282+
"version": "1.0.0",
283+
"title": "TacitRedDefenderTI_FunctionApp",
284+
"notes": [
285+
"Initial version"
286+
]
287+
}
288+
]
289+
}
287290
},
288291
"packageKind": "Solution",
289292
"packageVersion": "[variables('_solutionVersion')]",
@@ -325,15 +328,17 @@
325328
"description": "TacitRed API Key for authentication"
326329
}
327330
},
328-
"FunctionAppUrl": {
331+
"FunctionAppName": {
329332
"type": "string",
333+
"defaultValue": "tacitreddefenderti",
330334
"metadata": {
331-
"description": "URL of the deployed TacitRed Azure Function App (e.g., https://tacitreddefendertiXXX.azurewebsites.net/api/TacitRedToDefenderTI)"
335+
"description": "Prefix for the Azure Function App name"
332336
}
333337
}
334338
},
335339
"variables": {
336340
"logicAppName": "[[parameters('PlaybookName')]",
341+
"functionAppName": "[[concat(parameters('FunctionAppName'), uniqueString(resourceGroup().id))]",
337342
"workspace-location-inline": "[concat('[resourceGroup().locatio', 'n]')]",
338343
"workspace-name": "[parameters('workspace')]",
339344
"workspaceResourceId": "[[resourceId('microsoft.OperationalInsights/Workspaces', variables('workspace-name'))]"
@@ -375,7 +380,7 @@
375380
{
376381
"name": "FunctionAppUrl",
377382
"type": "String",
378-
"value": "[[parameters('FunctionAppUrl')]"
383+
"value": "[[concat('https://', reference(resourceId('Microsoft.Web/sites', variables('functionAppName')), '2024-04-01').defaultHostName, '/api/TacitRedToDefenderTI')]"
379384
},
380385
{
381386
"name": "Domains",
@@ -505,11 +510,11 @@
505510
"contentSchemaVersion": "3.0.0",
506511
"displayName": "TacitRed-Defender-ThreatIntelligence",
507512
"publisherDisplayName": "Data443 Risk Mitigation, Inc.",
508-
"descriptionHtml": "<p><strong>Note:</strong> Please refer to the following before installing the solution:</p>\n<p>&#8226; Review the solution <a href=\"https://github.com/Azure/Azure-Sentinel/tree/master/Solutions/TacitRed-Defender-ThreatIntelligence/ReleaseNotes.md\">Release Notes</a></p>\n<p>&#8226; There may be <a href=\"https://aka.ms/sentinelsolutionsknownissues\">known issues</a> pertaining to this Solution, please refer to them before installing.</p>\n<p>The TacitRed Defender Threat Intelligence solution integrates TacitRed's threat intelligence feed with Microsoft Sentinel. It automatically retrieves compromised credentials and other threat indicators from TacitRed and ingests them into Microsoft Sentinel using the Upload API for enhanced threat detection.</p>\n<p><strong>Function Apps:</strong> 1, <strong>Playbooks:</strong> 1</p>\n<p><a href=\"https://aka.ms/azuresentinel\">Learn more about Microsoft Sentinel</a> | <a href=\"https://aka.ms/azuresentinelsolutionsdoc\">Learn more about Solutions</a></p>\n",
513+
"descriptionHtml": "<p><strong>Note:</strong> Please refer to the following before installing the solution:</p>\n<p>• Review the solution <a href=\"https://github.com/Azure/Azure-Sentinel/tree/master/Solutions/TacitRed-Defender-ThreatIntelligence/ReleaseNotes.md\">Release Notes</a></p>\n<p>• There may be <a href=\"https://aka.ms/sentinelsolutionsknownissues\">known issues</a> pertaining to this Solution, please refer to them before installing.</p>\n<p>The TacitRed Defender Threat Intelligence solution integrates TacitRed's threat intelligence feed with Microsoft Sentinel. It automatically retrieves compromised credentials and other threat indicators from TacitRed and ingests them into Microsoft Sentinel using the Upload API for enhanced threat detection.</p>\n<p><strong>Function Apps:</strong> 1, <strong>Playbooks:</strong> 1</p>\n<p><a href=\"https://aka.ms/azuresentinel\">Learn more about Microsoft Sentinel</a> | <a href=\"https://aka.ms/azuresentinelsolutionsdoc\">Learn more about Solutions</a></p>\n",
509514
"contentKind": "Solution",
510515
"contentProductId": "[variables('_solutioncontentProductId')]",
511516
"id": "[variables('_solutioncontentProductId')]",
512-
"icon": "<svg id=\"d4e9f9a0-1b2c-4d4e-9f6a-7b8c9d0e1f2a\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 50\" width=\"75px\" height=\"75px\"><text x=\"10\" y=\"35\" font-family=\"Arial, sans-serif\" font-size=\"24\" font-weight=\"bold\" fill=\"#000000\">Tacit</text><text x=\"70\" y=\"35\" font-family=\"Arial, sans-serif\" font-size=\"24\" font-weight=\"bold\" fill=\"#FF0000\">Red</text><text x=\"120\" y=\"35\" font-family=\"Arial, sans-serif\" font-size=\"12\" fill=\"#555555\">by Data443</text></svg>",
517+
"icon": "<img src=\"https://raw.githubusercontent.com/Azure/Azure-Sentinel/master/Logos/tacitred_logo.svg\"width=\"75px\"height=\"75px\">",
513518
"contentId": "[variables('_solutionId')]",
514519
"parentId": "[variables('_solutionId')]",
515520
"source": {

Solutions/TacitRed-Defender-ThreatIntelligence/Playbooks/CustomConnector/TacitRedDefenderTI_FunctionApp/azuredeploy.json renamed to Solutions/TacitRed-Defender-ThreatIntelligence/Playbooks/TacitRedDefenderTI_FunctionApp/azuredeploy.json

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@
5555
"functionAppName": "[concat(parameters('FunctionAppName'), uniqueString(resourceGroup().id))]",
5656
"hostingPlanName": "[concat('plan-', variables('functionAppName'))]",
5757
"storageAccountName": "[concat('st', uniqueString(resourceGroup().id))]",
58-
"appInsightsName": "[concat('appi-', variables('functionAppName'))]",
59-
"workspaceResourceId": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]"
58+
"appInsightsName": "[concat('appi-', variables('functionAppName'))]"
6059
},
6160
"resources": [
6261
{
@@ -151,7 +150,7 @@
151150
},
152151
{
153152
"name": "SENTINEL_WORKSPACE_ID",
154-
"value": "[variables('workspaceResourceId')]"
153+
"value": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]"
155154
},
156155
{
157156
"name": "APPINSIGHTS_INSTRUMENTATIONKEY",
@@ -165,7 +164,7 @@
165164
"type": "Microsoft.Authorization/roleAssignments",
166165
"apiVersion": "2022-04-01",
167166
"name": "[guid(resourceGroup().id, variables('functionAppName'), 'Reader')]",
168-
"scope": "[variables('workspaceResourceId')]",
167+
"scope": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]",
169168
"properties": {
170169
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
171170
"principalId": "[reference(resourceId('Microsoft.Web/sites', variables('functionAppName')), '2024-04-01', 'Full').identity.principalId]",
@@ -179,7 +178,7 @@
179178
"type": "Microsoft.Authorization/roleAssignments",
180179
"apiVersion": "2022-04-01",
181180
"name": "[guid(resourceGroup().id, variables('functionAppName'), 'SentinelContributor')]",
182-
"scope": "[variables('workspaceResourceId')]",
181+
"scope": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]",
183182
"properties": {
184183
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ab8e14d6-4a74-4a29-9ba8-549422addade')]",
185184
"principalId": "[reference(resourceId('Microsoft.Web/sites', variables('functionAppName')), '2024-04-01', 'Full').identity.principalId]",

0 commit comments

Comments
 (0)