|
45 | 45 | }, |
46 | 46 | "variables": { |
47 | 47 | "_solutionName": "Ermes Browser Security", |
48 | | - "_solutionVersion": "3.0.3", |
| 48 | + "_solutionVersion": "3.1.0", |
49 | 49 | "solutionId": "ermes.azure-sentinel-solution-ermes-browser-security", |
50 | 50 | "_solutionId": "[variables('solutionId')]", |
51 | 51 | "workspaceResourceId": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]", |
|
79 | 79 | "resources": [ |
80 | 80 | { |
81 | 81 | "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',variables('_dataConnectorContentIdConnectorDefinition1'))]", |
82 | | - "apiVersion": "2022-09-01-preview", |
| 82 | + "apiVersion": "2025-09-01", |
83 | 83 | "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectorDefinitions", |
84 | 84 | "location": "[parameters('workspace-location')]", |
85 | 85 | "kind": "Customizable", |
|
151 | 151 | { |
152 | 152 | "description": "Connect using OAuth2 credentials", |
153 | 153 | "instructions": [ |
| 154 | + { |
| 155 | + "type": "Textbox", |
| 156 | + "parameters": { |
| 157 | + "label": "API URL (optional)", |
| 158 | + "placeholder": "https://api.shield.ermessecurity.com", |
| 159 | + "type": "text", |
| 160 | + "name": "apiUrl", |
| 161 | + "validations": { |
| 162 | + "required": false |
| 163 | + } |
| 164 | + } |
| 165 | + }, |
154 | 166 | { |
155 | 167 | "type": "OAuthForm", |
156 | 168 | "parameters": { |
|
203 | 215 | }, |
204 | 216 | { |
205 | 217 | "name": "ErmesOauthDCR1", |
206 | | - "apiVersion": "2022-06-01", |
| 218 | + "apiVersion": "2024-03-11", |
207 | 219 | "type": "Microsoft.Insights/dataCollectionRules", |
208 | 220 | "location": "[parameters('workspace-location')]", |
209 | 221 | "kind": "[variables('blanks')]", |
|
215 | 227 | { |
216 | 228 | "name": "_created", |
217 | 229 | "type": "string", |
218 | | - "description": "Event Timestamp" |
| 230 | + "description": "Event creation timestamp (server ingestion/generation time)" |
| 231 | + }, |
| 232 | + { |
| 233 | + "name": "timestamp", |
| 234 | + "type": "string", |
| 235 | + "description": "Event timestamp" |
219 | 236 | }, |
220 | 237 | { |
221 | 238 | "name": "username", |
|
246 | 263 | "name": "message", |
247 | 264 | "type": "dynamic", |
248 | 265 | "description": "Message" |
| 266 | + }, |
| 267 | + { |
| 268 | + "name": "log_data", |
| 269 | + "type": "dynamic", |
| 270 | + "description": "Event-specific log data" |
249 | 271 | } |
250 | 272 | ] |
251 | 273 | } |
|
266 | 288 | "destinations": [ |
267 | 289 | "clv2ws1" |
268 | 290 | ], |
269 | | - "transformKql": "source | project TimeGenerated = todatetime([\"_created\"]), Username = username, ClientIP = client_ip, EventCategory = event_cat, EventId = event_id, Level = level, Message = tostring(message.en)", |
| 291 | + "transformKql": "source | extend actual_timestamp = iff(isnotnull(timestamp), todatetime(timestamp), todatetime([\"_created\"])) | extend log_data_final = case(event_cat in (\"general\", \"dashboard_auth\", \"dashboard_audit\", \"device_status\"), parse_json('null'), log_data) | project TimeGenerated = actual_timestamp, Username = username, ClientIP = client_ip, EventCategory = event_cat, EventId = event_id, Level = level, Message = tostring(message.en), LogData = log_data_final", |
270 | 292 | "outputStream": "Custom-ErmesBrowserSecurityEvents_CL" |
271 | 293 | } |
272 | 294 | ] |
273 | 295 | } |
274 | 296 | }, |
275 | 297 | { |
276 | 298 | "name": "ErmesBrowserSecurityEvents_CL", |
277 | | - "apiVersion": "2022-10-01", |
| 299 | + "apiVersion": "2025-07-01", |
278 | 300 | "type": "Microsoft.OperationalInsights/workspaces/tables", |
279 | 301 | "location": "[parameters('workspace-location')]", |
280 | 302 | "kind": null, |
|
317 | 339 | "name": "Message", |
318 | 340 | "type": "String", |
319 | 341 | "description": "Message" |
| 342 | + }, |
| 343 | + { |
| 344 | + "name": "LogData", |
| 345 | + "type": "Dynamic", |
| 346 | + "description": "Event-specific log data" |
320 | 347 | } |
321 | 348 | ] |
322 | 349 | } |
|
335 | 362 | }, |
336 | 363 | { |
337 | 364 | "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',variables('_dataConnectorContentIdConnectorDefinition1'))]", |
338 | | - "apiVersion": "2022-09-01-preview", |
| 365 | + "apiVersion": "2025-09-01", |
339 | 366 | "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectorDefinitions", |
340 | 367 | "location": "[parameters('workspace-location')]", |
341 | 368 | "kind": "Customizable", |
|
407 | 434 | { |
408 | 435 | "description": "Connect using OAuth2 credentials", |
409 | 436 | "instructions": [ |
| 437 | + { |
| 438 | + "type": "Textbox", |
| 439 | + "parameters": { |
| 440 | + "label": "API URL (optional)", |
| 441 | + "placeholder": "https://api.shield.ermessecurity.com", |
| 442 | + "type": "text", |
| 443 | + "name": "apiUrl", |
| 444 | + "validations": { |
| 445 | + "required": false |
| 446 | + } |
| 447 | + } |
| 448 | + }, |
410 | 449 | { |
411 | 450 | "type": "OAuthForm", |
412 | 451 | "parameters": { |
|
473 | 512 | "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", |
474 | 513 | "contentVersion": "[variables('dataConnectorCCPVersion')]", |
475 | 514 | "parameters": { |
476 | | - "ClientId": { |
477 | | - "defaultValue": "-NA-", |
478 | | - "type": "securestring", |
479 | | - "minLength": 1 |
| 515 | + "guidValue": { |
| 516 | + "defaultValue": "[[newGuid()]", |
| 517 | + "type": "securestring" |
480 | 518 | }, |
481 | | - "ClientSecret": { |
482 | | - "defaultValue": "-NA-", |
483 | | - "type": "securestring", |
484 | | - "minLength": 1 |
| 519 | + "innerWorkspace": { |
| 520 | + "defaultValue": "[parameters('workspace')]", |
| 521 | + "type": "securestring" |
485 | 522 | }, |
486 | 523 | "connectorDefinitionName": { |
487 | 524 | "defaultValue": "Ermes Browser Security Events", |
488 | | - "type": "string", |
| 525 | + "type": "securestring", |
489 | 526 | "minLength": 1 |
490 | 527 | }, |
491 | 528 | "workspace": { |
492 | 529 | "defaultValue": "[parameters('workspace')]", |
493 | | - "type": "string" |
| 530 | + "type": "securestring" |
494 | 531 | }, |
495 | 532 | "dcrConfig": { |
496 | 533 | "defaultValue": { |
|
499 | 536 | }, |
500 | 537 | "type": "object" |
501 | 538 | }, |
| 539 | + "apiUrl": { |
| 540 | + "defaultValue": "", |
| 541 | + "type": "securestring" |
| 542 | + }, |
| 543 | + "ClientId": { |
| 544 | + "defaultValue": "-NA-", |
| 545 | + "type": "securestring", |
| 546 | + "minLength": 1 |
| 547 | + }, |
| 548 | + "ClientSecret": { |
| 549 | + "defaultValue": "-NA-", |
| 550 | + "type": "securestring", |
| 551 | + "minLength": 1 |
| 552 | + }, |
502 | 553 | "AuthorizationCode": { |
503 | 554 | "defaultValue": "-NA-", |
504 | 555 | "type": "securestring", |
|
535 | 586 | } |
536 | 587 | }, |
537 | 588 | { |
538 | | - "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', 'ErmesBrowserSecurityEvents')]", |
539 | | - "apiVersion": "2023-02-01-preview", |
| 589 | + "name": "[[concat(parameters('innerWorkspace'),'/Microsoft.SecurityInsights/', 'ErmesBrowserSecurityEvents', parameters('guidValue'))]", |
| 590 | + "apiVersion": "2025-09-01", |
540 | 591 | "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectors", |
541 | 592 | "location": "[parameters('workspace-location')]", |
542 | 593 | "kind": "RestApiPoller", |
|
550 | 601 | }, |
551 | 602 | "auth": { |
552 | 603 | "type": "OAuth2", |
553 | | - "ClientSecret": "[[parameters('ClientSecret')]", |
554 | | - "ClientId": "[[parameters('ClientId')]", |
| 604 | + "ClientSecret": "[[parameters('clientSecret')]", |
| 605 | + "ClientId": "[[parameters('clientId')]", |
555 | 606 | "GrantType": "client_credentials", |
556 | | - "TokenEndpoint": "https://api.shield.ermessecurity.com/oauth/token", |
| 607 | + "TokenEndpoint": "[[concat(if(empty(parameters('apiUrl')), 'https://api.shield.ermessecurity.com', parameters('apiUrl')),'/oauth/token')]", |
557 | 608 | "TokenEndpointHeaders": { |
558 | 609 | "Content-Type": "application/x-www-form-urlencoded" |
559 | 610 | }, |
560 | 611 | "TokenEndpointQueryParameters": {} |
561 | 612 | }, |
562 | 613 | "request": { |
563 | | - "apiEndpoint": "https://api.shield.ermessecurity.com/public/v1/events", |
| 614 | + "apiEndpoint": "[[concat(if(empty(parameters('apiUrl')), 'https://api.shield.ermessecurity.com', parameters('apiUrl')),'/public/v1/events')]", |
564 | 615 | "httpMethod": "GET", |
565 | 616 | "queryParameters": { |
566 | 617 | "max_results": 100, |
567 | | - "sort": "-_created", |
| 618 | + "sort": "_created", |
568 | 619 | "is_azure": "[variables('_solutionVersion')]" |
569 | 620 | }, |
570 | 621 | "queryWindowInMin": 5, |
571 | 622 | "queryTimeFormat": "yyyy-MM-ddTHH:mm:ss.000000+00:00", |
572 | | - "startTimeAttributeName": "gte__created", |
573 | | - "endTimeAttributeName": "lt__created", |
| 623 | + "startTimeAttributeName": "gt__created", |
| 624 | + "endTimeAttributeName": "lte__created", |
574 | 625 | "rateLimitQps": 1, |
575 | 626 | "retryCount": 3, |
576 | 627 | "timeoutInSeconds": 30, |
|
605 | 656 | "apiVersion": "2023-04-01-preview", |
606 | 657 | "location": "[parameters('workspace-location')]", |
607 | 658 | "properties": { |
608 | | - "version": "3.0.3", |
| 659 | + "version": "3.1.0", |
609 | 660 | "kind": "Solution", |
610 | 661 | "contentSchemaVersion": "3.0.0", |
611 | 662 | "displayName": "Ermes Browser Security", |
|
0 commit comments