Skip to content

Commit e69115f

Browse files
authored
Merge pull request Azure#13067 from Azure/v-kasghosh_salesforceServiceCloud_AnalyticRuleBugsfixing
Update analytic rules and bump solution to v3.0.8 for Salesforce Service Cloud
2 parents ac6b922 + bbcac8f commit e69115f

File tree

8 files changed

+39
-35
lines changed

8 files changed

+39
-35
lines changed

.script/tests/detectionTemplateSchemaValidation/ValidConnectorIds.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@
158158
"RubrikSecurityCloudAzureFunctions",
159159
"SailPointIdentityNow",
160160
"SalesforceServiceCloud",
161+
"SalesforceServiceCloudCCPDefinition",
161162
"SAP",
162163
"SAPBTPAuditEvents",
163164
"SAPLogServ",

Solutions/Salesforce Service Cloud/Analytic Rules/Salesforce-BruteForce.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ description: |
66
severity: Medium
77
status: Available
88
requiredDataConnectors:
9-
- connectorId: SalesforceServiceCloud
9+
- connectorId: SalesforceServiceCloudCCPDefinition
1010
dataTypes:
1111
- SalesforceServiceCloud
1212
queryFrequency: 1h
@@ -48,5 +48,5 @@ entityMappings:
4848
fieldMappings:
4949
- identifier: FullName
5050
columnName: User
51-
version: 1.0.3
51+
version: 1.0.4
5252
kind: Scheduled

Solutions/Salesforce Service Cloud/Analytic Rules/Salesforce-PasswordSpray.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: |
55
severity: Medium
66
status: Available
77
requiredDataConnectors:
8-
- connectorId: SalesforceServiceCloud
8+
- connectorId: SalesforceServiceCloudCCPDefinition
99
dataTypes:
1010
- SalesforceServiceCloud
1111
queryFrequency: 1h
@@ -21,6 +21,7 @@ query: |
2121
SalesforceServiceCloud
2222
| where EventType =~ 'Login' and LoginStatus != 'LOGIN_NO_ERROR'
2323
| where LoginStatus in~ ('LOGIN_ERROR_INVALID_PASSWORD', 'LOGIN_ERROR_SSO_PWD_INVALID')
24+
| extend TimestampDerived = todatetime(TimestampDerived)
2425
| summarize UserCount=dcount(UserId), Users = make_set(UserId,100) by ClientIp, bin(TimestampDerived, 5m)
2526
| where UserCount > FailureThreshold
2627
customDetails:
@@ -30,5 +31,5 @@ entityMappings:
3031
fieldMappings:
3132
- identifier: Address
3233
columnName: ClientIp
33-
version: 1.0.3
34+
version: 1.0.4
3435
kind: Scheduled

Solutions/Salesforce Service Cloud/Analytic Rules/Salesforce-SigninsMultipleCountries.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: |
55
severity: Medium
66
status: Available
77
requiredDataConnectors:
8-
- connectorId: SalesforceServiceCloud
8+
- connectorId: SalesforceServiceCloudCCPDefinition
99
dataTypes:
1010
- SalesforceServiceCloud
1111
queryFrequency: 1h
@@ -25,6 +25,7 @@ query: |
2525
| project TimeGenerated, TimestampDerived, ClientIp, UserId, User, UserType ;
2626
UsersLocation
2727
| extend Dummy=1
28+
| extend TimestampDerived = todatetime(TimestampDerived)
2829
| summarize count() by Hour=bin(TimestampDerived,30m), ClientIp,User, Dummy
2930
| partition by Hour(
3031
lookup (Countrydb|extend Dummy=1) on Dummy
@@ -37,5 +38,5 @@ entityMappings:
3738
fieldMappings:
3839
- identifier: AadUserId
3940
columnName: User
40-
version: 1.0.3
41+
version: 1.0.4
4142
kind: Scheduled

Solutions/Salesforce Service Cloud/Data/Solution_TSalesforceCloudtemplateSpec.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"Workbooks/SalesforceServiceCloud.json"
1919
],
2020
"BasePath": "C:\\NewCodeBase\\Azure-Sentinel\\Solutions\\Salesforce Service Cloud",
21-
"Version": "3.0.7",
21+
"Version": "3.0.8",
2222
"Metadata": "SolutionMetadata.json",
2323
"TemplateSpec": true,
2424
"Is1PConnector": false
25.7 KB
Binary file not shown.

Solutions/Salesforce Service Cloud/Package/mainTemplate.json

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -55,29 +55,29 @@
5555
"email": "[email protected]",
5656
"_email": "[variables('email')]",
5757
"_solutionName": "Salesforce Service Cloud",
58-
"_solutionVersion": "3.0.7",
58+
"_solutionVersion": "3.0.8",
5959
"solutionId": "azuresentinel.azure-sentinel-solution-salesforceservicecloud",
6060
"_solutionId": "[variables('solutionId')]",
6161
"analyticRuleObject1": {
62-
"analyticRuleVersion1": "1.0.3",
62+
"analyticRuleVersion1": "1.0.4",
6363
"_analyticRulecontentId1": "5a6ce089-e756-40fb-b022-c8e8864a973a",
6464
"analyticRuleId1": "[resourceId('Microsoft.SecurityInsights/AlertRuleTemplates', '5a6ce089-e756-40fb-b022-c8e8864a973a')]",
6565
"analyticRuleTemplateSpecName1": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat(parameters('workspace'),'-ar-',uniquestring('5a6ce089-e756-40fb-b022-c8e8864a973a')))]",
66-
"_analyticRulecontentProductId1": "[concat(take(variables('_solutionId'),50),'-','ar','-', uniqueString(concat(variables('_solutionId'),'-','AnalyticsRule','-','5a6ce089-e756-40fb-b022-c8e8864a973a','-', '1.0.3')))]"
66+
"_analyticRulecontentProductId1": "[concat(take(variables('_solutionId'),50),'-','ar','-', uniqueString(concat(variables('_solutionId'),'-','AnalyticsRule','-','5a6ce089-e756-40fb-b022-c8e8864a973a','-', '1.0.4')))]"
6767
},
6868
"analyticRuleObject2": {
69-
"analyticRuleVersion2": "1.0.3",
69+
"analyticRuleVersion2": "1.0.4",
7070
"_analyticRulecontentId2": "64d16e62-1a17-4a35-9ea7-2b9fe6f07118",
7171
"analyticRuleId2": "[resourceId('Microsoft.SecurityInsights/AlertRuleTemplates', '64d16e62-1a17-4a35-9ea7-2b9fe6f07118')]",
7272
"analyticRuleTemplateSpecName2": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat(parameters('workspace'),'-ar-',uniquestring('64d16e62-1a17-4a35-9ea7-2b9fe6f07118')))]",
73-
"_analyticRulecontentProductId2": "[concat(take(variables('_solutionId'),50),'-','ar','-', uniqueString(concat(variables('_solutionId'),'-','AnalyticsRule','-','64d16e62-1a17-4a35-9ea7-2b9fe6f07118','-', '1.0.3')))]"
73+
"_analyticRulecontentProductId2": "[concat(take(variables('_solutionId'),50),'-','ar','-', uniqueString(concat(variables('_solutionId'),'-','AnalyticsRule','-','64d16e62-1a17-4a35-9ea7-2b9fe6f07118','-', '1.0.4')))]"
7474
},
7575
"analyticRuleObject3": {
76-
"analyticRuleVersion3": "1.0.3",
76+
"analyticRuleVersion3": "1.0.4",
7777
"_analyticRulecontentId3": "3094e036-e5ae-4d6e-8626-b0f86ebc71f2",
7878
"analyticRuleId3": "[resourceId('Microsoft.SecurityInsights/AlertRuleTemplates', '3094e036-e5ae-4d6e-8626-b0f86ebc71f2')]",
7979
"analyticRuleTemplateSpecName3": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat(parameters('workspace'),'-ar-',uniquestring('3094e036-e5ae-4d6e-8626-b0f86ebc71f2')))]",
80-
"_analyticRulecontentProductId3": "[concat(take(variables('_solutionId'),50),'-','ar','-', uniqueString(concat(variables('_solutionId'),'-','AnalyticsRule','-','3094e036-e5ae-4d6e-8626-b0f86ebc71f2','-', '1.0.3')))]"
80+
"_analyticRulecontentProductId3": "[concat(take(variables('_solutionId'),50),'-','ar','-', uniqueString(concat(variables('_solutionId'),'-','AnalyticsRule','-','3094e036-e5ae-4d6e-8626-b0f86ebc71f2','-', '1.0.4')))]"
8181
},
8282
"workspaceResourceId": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]",
8383
"dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]",
@@ -112,7 +112,7 @@
112112
"[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
113113
],
114114
"properties": {
115-
"description": "Salesforce-BruteForce_AnalyticalRules Analytics Rule with template version 3.0.7",
115+
"description": "Salesforce-BruteForce_AnalyticalRules Analytics Rule with template version 3.0.8",
116116
"mainTemplate": {
117117
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
118118
"contentVersion": "[variables('analyticRuleObject1').analyticRuleVersion1]",
@@ -140,10 +140,10 @@
140140
"status": "Available",
141141
"requiredDataConnectors": [
142142
{
143+
"connectorId": "SalesforceServiceCloudCCPDefinition",
143144
"dataTypes": [
144145
"SalesforceServiceCloud"
145-
],
146-
"connectorId": "SalesforceServiceCloud"
146+
]
147147
}
148148
],
149149
"tactics": [
@@ -154,18 +154,18 @@
154154
],
155155
"entityMappings": [
156156
{
157-
"entityType": "Account",
158157
"fieldMappings": [
159158
{
160159
"columnName": "User",
161160
"identifier": "FullName"
162161
}
163-
]
162+
],
163+
"entityType": "Account"
164164
}
165165
],
166166
"customDetails": {
167-
"EventStartTime": "FailureStartTime",
168167
"EventEndTime": "SuccessEndTime",
168+
"EventStartTime": "FailureStartTime",
169169
"IPAddresses": "IpAddresses"
170170
}
171171
}
@@ -221,7 +221,7 @@
221221
"[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
222222
],
223223
"properties": {
224-
"description": "Salesforce-PasswordSpray_AnalyticalRules Analytics Rule with template version 3.0.7",
224+
"description": "Salesforce-PasswordSpray_AnalyticalRules Analytics Rule with template version 3.0.8",
225225
"mainTemplate": {
226226
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
227227
"contentVersion": "[variables('analyticRuleObject2').analyticRuleVersion2]",
@@ -238,7 +238,7 @@
238238
"description": "This query searches for failed attempts to log in from more than 15 various users within a 5 minutes timeframe from the same source. This is a potential indication of a password spray attack.",
239239
"displayName": "Potential Password Spray Attack",
240240
"enabled": false,
241-
"query": "let FailureThreshold = 15; \nSalesforceServiceCloud\n| where EventType =~ 'Login' and LoginStatus != 'LOGIN_NO_ERROR'\n| where LoginStatus in~ ('LOGIN_ERROR_INVALID_PASSWORD', 'LOGIN_ERROR_SSO_PWD_INVALID')\n| summarize UserCount=dcount(UserId), Users = make_set(UserId,100) by ClientIp, bin(TimestampDerived, 5m)\n| where UserCount > FailureThreshold\n",
241+
"query": "let FailureThreshold = 15; \nSalesforceServiceCloud\n| where EventType =~ 'Login' and LoginStatus != 'LOGIN_NO_ERROR'\n| where LoginStatus in~ ('LOGIN_ERROR_INVALID_PASSWORD', 'LOGIN_ERROR_SSO_PWD_INVALID')\n| extend TimestampDerived = todatetime(TimestampDerived)\n| summarize UserCount=dcount(UserId), Users = make_set(UserId,100) by ClientIp, bin(TimestampDerived, 5m)\n| where UserCount > FailureThreshold\n",
242242
"queryFrequency": "PT1H",
243243
"queryPeriod": "PT1H",
244244
"severity": "Medium",
@@ -249,10 +249,10 @@
249249
"status": "Available",
250250
"requiredDataConnectors": [
251251
{
252+
"connectorId": "SalesforceServiceCloudCCPDefinition",
252253
"dataTypes": [
253254
"SalesforceServiceCloud"
254-
],
255-
"connectorId": "SalesforceServiceCloud"
255+
]
256256
}
257257
],
258258
"tactics": [
@@ -263,13 +263,13 @@
263263
],
264264
"entityMappings": [
265265
{
266-
"entityType": "IP",
267266
"fieldMappings": [
268267
{
269268
"columnName": "ClientIp",
270269
"identifier": "Address"
271270
}
272-
]
271+
],
272+
"entityType": "IP"
273273
}
274274
],
275275
"customDetails": {
@@ -328,7 +328,7 @@
328328
"[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
329329
],
330330
"properties": {
331-
"description": "Salesforce-SigninsMultipleCountries_AnalyticalRules Analytics Rule with template version 3.0.7",
331+
"description": "Salesforce-SigninsMultipleCountries_AnalyticalRules Analytics Rule with template version 3.0.8",
332332
"mainTemplate": {
333333
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
334334
"contentVersion": "[variables('analyticRuleObject3').analyticRuleVersion3]",
@@ -345,7 +345,7 @@
345345
"description": "This query searches for successful user logins from different countries within 30 mins.",
346346
"displayName": "User Sign in from different countries",
347347
"enabled": false,
348-
"query": "let threshold = 2;\nlet Countrydb = externaldata(Network:string, geoname_id:string, continent_code:string, continent_name:string, country_iso_code:string, country_name:string)\n[@\"https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv\"];\nlet UsersLocation = SalesforceServiceCloud\n| where EventType =~ 'Login' and LoginStatus=~'LOGIN_NO_ERROR'\n| project TimeGenerated, TimestampDerived, ClientIp, UserId, User, UserType ;\nUsersLocation\n| extend Dummy=1\n| summarize count() by Hour=bin(TimestampDerived,30m), ClientIp,User, Dummy\n| partition by Hour(\n lookup (Countrydb|extend Dummy=1) on Dummy\n | where ipv4_is_match(ClientIp, Network)\n )\n| summarize NumOfCountries = dcount(country_name) by User, Hour\n| where NumOfCountries >= threshold\n",
348+
"query": "let threshold = 2;\nlet Countrydb = externaldata(Network:string, geoname_id:string, continent_code:string, continent_name:string, country_iso_code:string, country_name:string)\n[@\"https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv\"];\nlet UsersLocation = SalesforceServiceCloud\n| where EventType =~ 'Login' and LoginStatus=~'LOGIN_NO_ERROR'\n| project TimeGenerated, TimestampDerived, ClientIp, UserId, User, UserType ;\nUsersLocation\n| extend Dummy=1\n| extend TimestampDerived = todatetime(TimestampDerived)\n| summarize count() by Hour=bin(TimestampDerived,30m), ClientIp,User, Dummy\n| partition by Hour(\n lookup (Countrydb|extend Dummy=1) on Dummy\n | where ipv4_is_match(ClientIp, Network)\n )\n| summarize NumOfCountries = dcount(country_name) by User, Hour\n| where NumOfCountries >= threshold\n",
349349
"queryFrequency": "PT1H",
350350
"queryPeriod": "PT1H",
351351
"severity": "Medium",
@@ -356,10 +356,10 @@
356356
"status": "Available",
357357
"requiredDataConnectors": [
358358
{
359+
"connectorId": "SalesforceServiceCloudCCPDefinition",
359360
"dataTypes": [
360361
"SalesforceServiceCloud"
361-
],
362-
"connectorId": "SalesforceServiceCloud"
362+
]
363363
}
364364
],
365365
"tactics": [
@@ -370,13 +370,13 @@
370370
],
371371
"entityMappings": [
372372
{
373-
"entityType": "Account",
374373
"fieldMappings": [
375374
{
376375
"columnName": "User",
377376
"identifier": "AadUserId"
378377
}
379-
]
378+
],
379+
"entityType": "Account"
380380
}
381381
]
382382
}
@@ -2949,7 +2949,7 @@
29492949
"[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
29502950
],
29512951
"properties": {
2952-
"description": "SalesforceServiceCloud Data Parser with template version 3.0.7",
2952+
"description": "SalesforceServiceCloud Data Parser with template version 3.0.8",
29532953
"mainTemplate": {
29542954
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
29552955
"contentVersion": "[variables('parserObject1').parserVersion1]",
@@ -3081,7 +3081,7 @@
30813081
"[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
30823082
],
30833083
"properties": {
3084-
"description": "SalesforceServiceCloud Workbook with template version 3.0.7",
3084+
"description": "SalesforceServiceCloud Workbook with template version 3.0.8",
30853085
"mainTemplate": {
30863086
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
30873087
"contentVersion": "[variables('workbookVersion1')]",
@@ -3165,7 +3165,7 @@
31653165
"apiVersion": "2023-04-01-preview",
31663166
"location": "[parameters('workspace-location')]",
31673167
"properties": {
3168-
"version": "3.0.7",
3168+
"version": "3.0.8",
31693169
"kind": "Solution",
31703170
"contentSchemaVersion": "3.0.0",
31713171
"displayName": "Salesforce Service Cloud",

Solutions/Salesforce Service Cloud/ReleaseNotes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
| **Version** | **Date Modified (DD-MM-YYYY)** | **Change History** |
22
|-------------|--------------------------------|--------------------------------------------------------------------|
3+
| 3.0.8 | 04-11-2025 | Resolved bugs in **Analytic rules** related to TimestampDerived field. |
34
| 3.0.7 | 02-11-2025 | Updated CCF Data Connector polling config to v65.0. |
45
| 3.0.6 | 17-10-2025 | Updated KQL transformation logic to map USER_NAME to the UserEmail column instead of USER_EMAIL.|
56
| 3.0.5 | 20-08-2025 | Moving Salesforce Service cloud **CCF Data Connector** to GA. |

0 commit comments

Comments
 (0)