From 8378fc900d90298d00fad4a2673fc5c18d61b126 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 6 Jun 2026 02:12:53 +0000 Subject: [PATCH 1/5] Add Cloudflare Security Events CCF data connector (GraphQL Analytics API) Adds a Codeless Connector Framework (CCF) RestApiPoller connector that ingests Cloudflare security/firewall events into Microsoft Sentinel via the Cloudflare GraphQL Analytics API (firewallEventsAdaptive dataset, queried at account scope). - POST to https://api.cloudflare.com/client/v4/graphql with a templated GraphQL body (queryParametersTemplate + isPostPayloadJson), injecting the account tag via parameters('accountId') and the poll window via the {_QueryWindowStartTime}/{_QueryWindowEndTime} tokens. - Bearer API token auth (Account Analytics > Read scope). - DCR maps the camelCase GraphQL fields to PascalCase columns and derives TimeGenerated from the event datetime. - New custom table CloudflareSecurityEvents_CL (90-day retention) with a broadly-available core field set (34 columns) chosen for compatibility across Cloudflare plans/entitlements. Mirrors the structure of the sibling CloudflareApi_CCF (audit logs) connector. --- ...areSecurityEvents_ConnectorDefinition.json | 117 +++++++++++ .../CloudflareSecurityEvents_DCR.json | 173 ++++++++++++++++ ...CloudflareSecurityEvents_PollerConfig.json | 46 +++++ .../CloudflareSecurityEvents_Table.json | 186 ++++++++++++++++++ 4 files changed, 522 insertions(+) create mode 100644 Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_ConnectorDefinition.json create mode 100644 Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json create mode 100644 Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json create mode 100644 Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_Table.json diff --git a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_ConnectorDefinition.json b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_ConnectorDefinition.json new file mode 100644 index 00000000000..8d7542c9555 --- /dev/null +++ b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_ConnectorDefinition.json @@ -0,0 +1,117 @@ +{ + "name": "CloudflareSecurityEventsDefinition", + "apiVersion": "2025-07-01-preview", + "type": "Microsoft.SecurityInsights/dataConnectorDefinitions", + "location": "{{location}}", + "kind": "Customizable", + "properties": { + "connectorUiConfig": { + "id": "CloudflareSecurityEventsDefinition", + "title": "Cloudflare Security Events (via Codeless Connector Framework)", + "publisher": "Cloudflare", + "descriptionMarkdown": "The [Cloudflare](https://www.cloudflare.com/) Security Events connector ingests Cloudflare [security events](https://developers.cloudflare.com/waf/analytics/security-events/) into Microsoft Sentinel using the Cloudflare [GraphQL Analytics API](https://developers.cloudflare.com/analytics/graphql-api/) (the `firewallEventsAdaptive` dataset, queried at account scope).\n\nSecurity events capture requests acted on by Cloudflare security products, including the WAF managed and custom rulesets, rate limiting, L7 DDoS mitigation, IP reputation, and bot mitigations.\n\n**Underlying Microsoft Technologies used:**\n\nThis solution takes a dependency on the following technologies, and some of these dependencies either may be in Preview state or might result in additional ingestion or operational costs:\n\na. [Codeless Connector Framework (CCF)](https://learn.microsoft.com/en-us/azure/sentinel/create-custom-connector)", + "graphQueriesTableName": "CloudflareSecurityEvents_CL", + "graphQueries": [ + { + "metricName": "Total events received", + "legend": "Cloudflare Security Events", + "baseQuery": "{{graphQueriesTableName}}" + } + ], + "sampleQueries": [ + { + "description": "Get sample Cloudflare Security Events", + "query": "{{graphQueriesTableName}}\n | take 10" + }, + { + "description": "Cloudflare Security Events by action", + "query": "{{graphQueriesTableName}}\n | summarize count() by Action" + }, + { + "description": "Top client IPs blocked by the Cloudflare WAF", + "query": "{{graphQueriesTableName}}\n | where Action == 'block'\n | summarize count() by ClientIP\n | top 10 by count_" + } + ], + "dataTypes": [ + { + "name": "CloudflareSecurityEvents_CL", + "lastDataReceivedQuery": "{{graphQueriesTableName}}\n | where TimeGenerated > ago(12h) | summarize Time = max(TimeGenerated)\n | where isnotempty(Time)" + } + ], + "connectivityCriteria": [ + { + "type": "HasDataConnectors" + } + ], + "availability": { + "isPreview": true, + "status": 1 + }, + "permissions": { + "resourceProvider": [ + { + "provider": "Microsoft.OperationalInsights/workspaces", + "permissionsDisplayText": "Read and Write permissions are required.", + "providerDisplayName": "Workspace", + "scope": "Workspace", + "requiredPermissions": { + "read": true, + "write": true, + "delete": true, + "action": false + } + } + ], + "customs": [ + { + "name": "Cloudflare Account API token", + "description": "A Cloudflare Account API token with **Account Analytics > Read** permission is required to query the GraphQL Analytics API. Refer to the [Cloudflare documentation](https://developers.cloudflare.com/fundamentals/api/get-started/account-owned-tokens/) for instructions on creating an account-owned API token." + }, + { + "name": "Cloudflare Account ID", + "description": "Your Cloudflare Account ID is available in the Cloudflare dashboard URL or under **Account Home > Overview**. Refer to the [Cloudflare documentation](https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/) for instructions." + } + ] + }, + "instructionSteps": [ + { + "title": "Connect Cloudflare Security Events to Microsoft Sentinel", + "description": "To enable ingestion of Cloudflare security events, provide your Cloudflare Account ID and Cloudflare Account API token below, then select **Connect**.\n\n> **Note:** Ensure your API token has the **Account Analytics > Read** permission scope. Security events are collected across all zones in the account.", + "instructions": [ + { + "type": "Textbox", + "parameters": { + "label": "Cloudflare Account ID", + "placeholder": "Enter your Cloudflare Account ID (e.g. 9a7806061c88ada191ed06f989cc3dac)", + "type": "text", + "name": "accountId", + "validations": { + "required": true + } + } + }, + { + "type": "Textbox", + "parameters": { + "label": "Cloudflare Account API token", + "placeholder": "Enter your Cloudflare Account API token", + "type": "password", + "name": "apikey", + "validations": { + "required": true + } + } + }, + { + "type": "ConnectionToggleButton", + "parameters": { + "connectLabel": "Connect", + "name": "Connect" + } + } + ] + } + ] + } + } +} diff --git a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json new file mode 100644 index 00000000000..bde2484e4aa --- /dev/null +++ b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json @@ -0,0 +1,173 @@ +[ + { + "name": "CloudflareSecurityEventsDCR", + "apiVersion": "2023-04-01-preview", + "type": "Microsoft.Insights/dataCollectionRules", + "location": "{{location}}", + "properties": { + "dataCollectionEndpointId": "{{dataCollectionEndpointId}}", + "streamDeclarations": { + "Custom-CloudflareSecurityEvents_CL": { + "columns": [ + { + "name": "action", + "type": "string" + }, + { + "name": "source", + "type": "string" + }, + { + "name": "kind", + "type": "string" + }, + { + "name": "description", + "type": "string" + }, + { + "name": "ref", + "type": "string" + }, + { + "name": "ruleId", + "type": "string" + }, + { + "name": "rulesetId", + "type": "string" + }, + { + "name": "matchIndex", + "type": "int" + }, + { + "name": "rayName", + "type": "string" + }, + { + "name": "originatorRayName", + "type": "string" + }, + { + "name": "sampleInterval", + "type": "int" + }, + { + "name": "clientIP", + "type": "string" + }, + { + "name": "clientIPClass", + "type": "string" + }, + { + "name": "clientAsn", + "type": "string" + }, + { + "name": "clientASNDescription", + "type": "string" + }, + { + "name": "clientCountryName", + "type": "string" + }, + { + "name": "clientRequestHTTPHost", + "type": "string" + }, + { + "name": "clientRequestHTTPMethodName", + "type": "string" + }, + { + "name": "clientRequestHTTPProtocol", + "type": "string" + }, + { + "name": "clientRequestPath", + "type": "string" + }, + { + "name": "clientRequestQuery", + "type": "string" + }, + { + "name": "clientRequestScheme", + "type": "string" + }, + { + "name": "clientRefererHost", + "type": "string" + }, + { + "name": "clientRefererPath", + "type": "string" + }, + { + "name": "clientRefererQuery", + "type": "string" + }, + { + "name": "clientRefererScheme", + "type": "string" + }, + { + "name": "userAgent", + "type": "string" + }, + { + "name": "edgeColoName", + "type": "string" + }, + { + "name": "edgeResponseStatus", + "type": "int" + }, + { + "name": "originResponseStatus", + "type": "int" + }, + { + "name": "httpApplicationVersion", + "type": "long" + }, + { + "name": "zoneTag", + "type": "string" + }, + { + "name": "zoneVersion", + "type": "long" + }, + { + "name": "datetime", + "type": "string" + } + ] + } + }, + "destinations": { + "logAnalytics": [ + { + "workspaceResourceId": "{{workspaceResourceId}}", + "name": "clv2ws1" + } + ] + }, + "dataFlows": [ + { + "streams": [ + "Custom-CloudflareSecurityEvents_CL" + ], + "destinations": [ + "clv2ws1" + ], + "transformKql": "source\n| extend TimeGenerated = todatetime(datetime)\n| project-rename Action = action, Source = source, Kind = kind, Description = description, Ref = ref, RuleId = ruleId, RulesetId = rulesetId, MatchIndex = matchIndex, RayName = rayName, OriginatorRayName = originatorRayName, SampleInterval = sampleInterval, ClientIP = clientIP, ClientIPClass = clientIPClass, ClientAsn = clientAsn, ClientASNDescription = clientASNDescription, ClientCountryName = clientCountryName, ClientRequestHTTPHost = clientRequestHTTPHost, ClientRequestHTTPMethodName = clientRequestHTTPMethodName, ClientRequestHTTPProtocol = clientRequestHTTPProtocol, ClientRequestPath = clientRequestPath, ClientRequestQuery = clientRequestQuery, ClientRequestScheme = clientRequestScheme, ClientRefererHost = clientRefererHost, ClientRefererPath = clientRefererPath, ClientRefererQuery = clientRefererQuery, ClientRefererScheme = clientRefererScheme, UserAgent = userAgent, EdgeColoName = edgeColoName, EdgeResponseStatus = edgeResponseStatus, OriginResponseStatus = originResponseStatus, HttpApplicationVersion = httpApplicationVersion, ZoneTag = zoneTag, ZoneVersion = zoneVersion", + "outputStream": "Custom-CloudflareSecurityEvents_CL" + } + ] + } + } +] diff --git a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json new file mode 100644 index 00000000000..fea5c770e27 --- /dev/null +++ b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json @@ -0,0 +1,46 @@ +[ + { + "name": "CloudflareSecurityEventsPoller", + "apiVersion": "2025-03-01", + "type": "Microsoft.SecurityInsights/dataConnectors", + "location": "{{location}}", + "kind": "RestApiPoller", + "properties": { + "connectorDefinitionName": "CloudflareSecurityEventsDefinition", + "dataType": "CloudflareSecurityEvents_CL", + "dcrConfig": { + "streamName": "Custom-CloudflareSecurityEvents_CL", + "dataCollectionEndpoint": "{{dataCollectionEndpoint}}", + "dataCollectionRuleImmutableId": "{{dataCollectionRuleImmutableId}}" + }, + "auth": { + "type": "APIKey", + "ApiKey": "[[parameters('apikey')]", + "ApiKeyName": "Authorization", + "ApiKeyIdentifier": "Bearer" + }, + "request": { + "apiEndpoint": "https://api.cloudflare.com/client/v4/graphql", + "httpMethod": "POST", + "queryWindowInMin": 10, + "queryTimeFormat": "yyyy-MM-ddTHH:mm:ssZ", + "rateLimitQPS": 5, + "retryCount": 3, + "timeoutInSeconds": 60, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "User-Agent": "Scuba" + }, + "isPostPayloadJson": true, + "queryParametersTemplate": "[[concat('{\"query\":\"{ viewer { accounts(filter: {accountTag: \\\"', parameters('accountId'), '\\\"}) { firewallEventsAdaptive(filter: {datetime_geq: \\\"{_QueryWindowStartTime}\\\", datetime_leq: \\\"{_QueryWindowEndTime}\\\"}, limit: 10000, orderBy: [datetime_ASC]) { action source kind description ref ruleId rulesetId matchIndex rayName originatorRayName sampleInterval clientIP clientIPClass clientAsn clientASNDescription clientCountryName clientRequestHTTPHost clientRequestHTTPMethodName clientRequestHTTPProtocol clientRequestPath clientRequestQuery clientRequestScheme clientRefererHost clientRefererPath clientRefererQuery clientRefererScheme userAgent edgeColoName edgeResponseStatus originResponseStatus httpApplicationVersion zoneTag zoneVersion datetime } } } }\"}')]" + }, + "response": { + "eventsJsonPaths": [ + "$.data.viewer.accounts[0].firewallEventsAdaptive" + ], + "format": "json" + } + } + } +] diff --git a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_Table.json b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_Table.json new file mode 100644 index 00000000000..cef9798ae2e --- /dev/null +++ b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_Table.json @@ -0,0 +1,186 @@ +[ + { + "name": "CloudflareSecurityEvents_CL", + "type": "Microsoft.OperationalInsights/workspaces/tables", + "apiVersion": "2023-09-01", + "properties": { + "retentionInDays": 90, + "schema": { + "name": "CloudflareSecurityEvents_CL", + "description": "Cloudflare security (firewall) events ingested from the Cloudflare GraphQL Analytics API (firewallEventsAdaptive dataset, account scope). Captures requests acted on by Cloudflare security products including the WAF managed and custom rulesets, rate limiting, L7 DDoS mitigation, IP reputation and bot mitigations.", + "columns": [ + { + "name": "TimeGenerated", + "description": "The timestamp of the firewall event, derived from the Cloudflare 'datetime' field (when the request was evaluated).", + "type": "datetime" + }, + { + "name": "Action", + "description": "The action the firewall rule took when it matched the request (for example, 'block', 'challenge', 'allow', 'log', 'skip', 'managed_challenge', 'jschallenge').", + "type": "string" + }, + { + "name": "Source", + "description": "The Cloudflare security product/source that produced the event (for example, 'firewallManaged', 'firewallCustom', 'ratelimit', 'l7ddos', 'bic', 'hot', 'securityLevel', 'ipReputation', 'sanitycheck').", + "type": "string" + }, + { + "name": "Kind", + "description": "The kind of firewall event. Currently always 'firewall'.", + "type": "string" + }, + { + "name": "Description", + "description": "A human-readable description of the rule or managed rule signature that matched (for example, the WAF managed rule name).", + "type": "string" + }, + { + "name": "Ref", + "description": "The user-defined reference (ref) tag of the matched rule, when configured.", + "type": "string" + }, + { + "name": "RuleId", + "description": "The identifier of the rule that matched the request.", + "type": "string" + }, + { + "name": "RulesetId", + "description": "The identifier of the ruleset that contains the matched rule.", + "type": "string" + }, + { + "name": "MatchIndex", + "description": "The index of the rule match within the request evaluation order.", + "type": "int" + }, + { + "name": "RayName", + "description": "The Cloudflare Ray ID associated with the request that generated the event.", + "type": "string" + }, + { + "name": "OriginatorRayName", + "description": "The Ray ID of the originating request when the event was generated by a related/sub request ('00' when not applicable).", + "type": "string" + }, + { + "name": "SampleInterval", + "description": "The sampling interval for the event. A value of 1 means the event was not sampled; values greater than 1 indicate each stored event represents that many requests.", + "type": "int" + }, + { + "name": "ClientIP", + "description": "The IP address of the client that made the request.", + "type": "string" + }, + { + "name": "ClientIPClass", + "description": "Cloudflare's classification of the client IP (for example, 'clean', 'badHost', 'searchEngine', 'allowlist', 'monitoringService', 'noRecord', 'unknown').", + "type": "string" + }, + { + "name": "ClientAsn", + "description": "The Autonomous System Number (ASN) of the client that made the request.", + "type": "string" + }, + { + "name": "ClientASNDescription", + "description": "The description/name of the client's Autonomous System (for example, 'Microsoft Corporation').", + "type": "string" + }, + { + "name": "ClientCountryName", + "description": "The ISO 3166-1 alpha-2 country code of the client, derived from the client IP.", + "type": "string" + }, + { + "name": "ClientRequestHTTPHost", + "description": "The HTTP host header of the request.", + "type": "string" + }, + { + "name": "ClientRequestHTTPMethodName", + "description": "The HTTP method of the request (for example, 'GET', 'POST').", + "type": "string" + }, + { + "name": "ClientRequestHTTPProtocol", + "description": "The HTTP protocol version of the request (for example, 'HTTP/1.1', 'HTTP/2').", + "type": "string" + }, + { + "name": "ClientRequestPath", + "description": "The URI path of the request.", + "type": "string" + }, + { + "name": "ClientRequestQuery", + "description": "The URI query string of the request.", + "type": "string" + }, + { + "name": "ClientRequestScheme", + "description": "The URI scheme of the request (for example, 'http', 'https').", + "type": "string" + }, + { + "name": "ClientRefererHost", + "description": "The host portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererPath", + "description": "The path portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererQuery", + "description": "The query string portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererScheme", + "description": "The scheme portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "UserAgent", + "description": "The User-Agent header string of the client request.", + "type": "string" + }, + { + "name": "EdgeColoName", + "description": "The IATA airport code of the Cloudflare data center (colo) that handled the request (for example, 'IAD', 'ORD').", + "type": "string" + }, + { + "name": "EdgeResponseStatus", + "description": "The HTTP status code Cloudflare's edge returned to the client.", + "type": "int" + }, + { + "name": "OriginResponseStatus", + "description": "The HTTP status code the origin server returned, or 0 when the edge responded without contacting the origin.", + "type": "int" + }, + { + "name": "HttpApplicationVersion", + "description": "The internal HTTP application version associated with the request.", + "type": "long" + }, + { + "name": "ZoneTag", + "description": "The Cloudflare zone identifier (zone tag) the event belongs to. Useful for distinguishing zones in an account-wide query.", + "type": "string" + }, + { + "name": "ZoneVersion", + "description": "The version of the zone configuration in effect when the event was generated.", + "type": "long" + } + ] + } + } + } +] From 29a124533d9e29ea4e98695ec993ab6bc8b25c2d Mon Sep 17 00:00:00 2001 From: Tom Plant Date: Sat, 6 Jun 2026 04:27:37 +0000 Subject: [PATCH 2/5] Package CloudflareSecurityEvents in v3.0.4 Signed-off-by: GitHub --- .../Data/Solution_Cloudflare.json | 7 +- Solutions/Cloudflare CCF/Package/3.0.4.zip | Bin 0 -> 40682 bytes .../Package/createUiDefinition.json | 19 +- .../Cloudflare CCF/Package/mainTemplate.json | 1555 ++++++++++++++--- Solutions/Cloudflare CCF/ReleaseNotes.md | 1 + 5 files changed, 1312 insertions(+), 270 deletions(-) create mode 100644 Solutions/Cloudflare CCF/Package/3.0.4.zip diff --git a/Solutions/Cloudflare CCF/Data/Solution_Cloudflare.json b/Solutions/Cloudflare CCF/Data/Solution_Cloudflare.json index c2b02beee1b..9d49828a581 100644 --- a/Solutions/Cloudflare CCF/Data/Solution_Cloudflare.json +++ b/Solutions/Cloudflare CCF/Data/Solution_Cloudflare.json @@ -4,7 +4,8 @@ "Logo": "", "Description": "The [Cloudflare](https://www.cloudflare.com/) solution provides the capability to ingest [Cloudflare logs](https://developers.cloudflare.com/logs/) into Microsoft Sentinel using the Codeless Connector Framework (CCF) and Azure Blob Storage. Refer to [Cloudflare documentation](https://developers.cloudflare.com/logs/about/) for more information.\n\n**Underlying Microsoft Technologies used:**\r\n\n a. [Codeless Connector Framework](https://learn.microsoft.com/en-us/azure/sentinel/create-codeless-connector)\n\n b. [Azure Monitor HTTP Data Collector API](https://docs.microsoft.com/azure/azure-monitor/logs/data-collector-api) (for reference, legacy support)", "Data Connectors": [ - "Cloudflare CCF/Data Connectors/CloudflareLog_CCF/CloudflareLog_ConnectorDefinition.json" + "Cloudflare CCF/Data Connectors/CloudflareLog_CCF/CloudflareLog_ConnectorDefinition.json", + "Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_ConnectorDefinition.json" ], "Parsers": [ "Cloudflare CCF/Parsers/Cloudflare.yaml" @@ -38,7 +39,7 @@ ], "Metadata": "SolutionMetadata.json", "BasePath": "C:\\GitHub\\Azure-Sentinel\\Solutions\\Cloudflare CCF", - "Version": "3.0.3", + "Version": "3.0.4", "TemplateSpec": true, "Is1PConnector": false -} \ No newline at end of file +} diff --git a/Solutions/Cloudflare CCF/Package/3.0.4.zip b/Solutions/Cloudflare CCF/Package/3.0.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..85abf303c44d72ce4d1df709e4dff99dcaee2541 GIT binary patch literal 40682 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 wz`^OXA;aPPM*}P^35kQLcCxT{*0y$Xb%d$\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/Cloudflare%20CCF/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 [Cloudflare](https://www.cloudflare.com/) solution provides the capability to ingest [Cloudflare logs](https://developers.cloudflare.com/logs/) into Microsoft Sentinel using the Codeless Connector Framework (CCF) and Azure Blob Storage. Refer to [Cloudflare documentation](https://developers.cloudflare.com/logs/about/) for more information.\n\n**Underlying Microsoft Technologies used:**\r\n\n a. [Codeless Connector Framework](https://learn.microsoft.com/en-us/azure/sentinel/create-codeless-connector)\n\n b. [Azure Monitor HTTP Data Collector API](https://docs.microsoft.com/azure/azure-monitor/logs/data-collector-api) (for reference, legacy support)\n\n**Data Connectors:** 1, **Parsers:** 1, **Workbooks:** 1, **Analytic Rules:** 10, **Hunting Queries:** 10\n\n[Learn more about Microsoft Sentinel](https://aka.ms/azuresentinel) | [Learn more about Solutions](https://aka.ms/azuresentinelsolutionsdoc)", + "description": "\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/Cloudflare%20CCF/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 [Cloudflare](https://www.cloudflare.com/) solution provides the capability to ingest [Cloudflare logs](https://developers.cloudflare.com/logs/) into Microsoft Sentinel using the Codeless Connector Framework (CCF) and Azure Blob Storage. Refer to [Cloudflare documentation](https://developers.cloudflare.com/logs/about/) for more information.\n\n**Underlying Microsoft Technologies used:**\r\n\n a. [Codeless Connector Framework](https://learn.microsoft.com/en-us/azure/sentinel/create-codeless-connector)\n\n b. [Azure Monitor HTTP Data Collector API](https://docs.microsoft.com/azure/azure-monitor/logs/data-collector-api) (for reference, legacy support)\n\n**Data Connectors:** 2, **Parsers:** 1, **Workbooks:** 1, **Analytic Rules:** 10, **Hunting Queries:** 10\n\n[Learn more about Microsoft Sentinel](https://aka.ms/azuresentinel) | [Learn more about Solutions](https://aka.ms/azuresentinelsolutionsdoc)", "subscription": { "resourceProviders": [ "Microsoft.OperationsManagement/solutions", @@ -72,6 +72,23 @@ "uri": "https://docs.microsoft.com/azure/sentinel/connect-data-sources" } } + }, + { + "name": "dataconnectors2-text", + "type": "Microsoft.Common.TextBlock", + "options": { + "text": "This Solution installs the data connector for Cloudflare Security Events (via Codeless Connector Framework). You can get Cloudflare Security Events (via Codeless Connector Framework) data in your Microsoft Sentinel workspace. After installing the solution, configure and enable this data connector by following guidance in Manage solution view." + } + }, + { + "name": "dataconnectors-link2", + "type": "Microsoft.Common.TextBlock", + "options": { + "link": { + "label": "Learn more about connecting data sources", + "uri": "https://docs.microsoft.com/azure/sentinel/connect-data-sources" + } + } } ] }, diff --git a/Solutions/Cloudflare CCF/Package/mainTemplate.json b/Solutions/Cloudflare CCF/Package/mainTemplate.json index 9eb4fd436d6..78ab3aa6b0e 100644 --- a/Solutions/Cloudflare CCF/Package/mainTemplate.json +++ b/Solutions/Cloudflare CCF/Package/mainTemplate.json @@ -55,17 +55,22 @@ "email": "support@cloudflare.com", "_email": "[variables('email')]", "_solutionName": "Cloudflare CCF", - "_solutionVersion": "3.0.3", + "_solutionVersion": "3.0.4", "solutionId": "cloudflare.azure-sentinel-solution-cloudflare-ccf", "_solutionId": "[variables('solutionId')]", "workspaceResourceId": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]", - "dataConnectorCCPVersion": "3.0.3", + "dataConnectorCCPVersion": "3.0.4", "_dataConnectorContentIdConnectorDefinition1": "CloudflareDefinition", "dataConnectorTemplateNameConnectorDefinition1": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnectorDefinition1')))]", "_dataConnectorContentIdConnections1": "CloudflareDefinitionConnections", "dataConnectorTemplateNameConnections1": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnections1')))]", "dataCollectionEndpointId1": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]", "blanks": "[replace('b', 'b', '')]", + "_dataConnectorContentIdConnectorDefinition2": "CloudflareSecurityEventsDefinition", + "dataConnectorTemplateNameConnectorDefinition2": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnectorDefinition2')))]", + "_dataConnectorContentIdConnections2": "CloudflareSecurityEventsDefinitionConnections", + "dataConnectorTemplateNameConnections2": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnections2')))]", + "dataCollectionEndpointId2": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]", "parserObject1": { "_parserName1": "[concat(parameters('workspace'),'/','Cloudflare')]", "_parserId1": "[resourceId('Microsoft.OperationalInsights/workspaces/savedSearches', parameters('workspace'), 'Cloudflare')]", @@ -4422,6 +4427,192 @@ ] } } + }, + { + "name": "CloudflareSecurityEvents_CL", + "apiVersion": "2022-10-01", + "type": "Microsoft.OperationalInsights/workspaces/tables", + "location": "[parameters('workspace-location')]", + "kind": null, + "properties": { + "retentionInDays": 90, + "schema": { + "name": "CloudflareSecurityEvents_CL", + "description": "Cloudflare security (firewall) events ingested from the Cloudflare GraphQL Analytics API (firewallEventsAdaptive dataset, account scope). Captures requests acted on by Cloudflare security products including the WAF managed and custom rulesets, rate limiting, L7 DDoS mitigation, IP reputation and bot mitigations.", + "columns": [ + { + "name": "TimeGenerated", + "description": "The timestamp of the firewall event, derived from the Cloudflare 'datetime' field (when the request was evaluated).", + "type": "datetime" + }, + { + "name": "Action", + "description": "The action the firewall rule took when it matched the request (for example, 'block', 'challenge', 'allow', 'log', 'skip', 'managed_challenge', 'jschallenge').", + "type": "string" + }, + { + "name": "Source", + "description": "The Cloudflare security product/source that produced the event (for example, 'firewallManaged', 'firewallCustom', 'ratelimit', 'l7ddos', 'bic', 'hot', 'securityLevel', 'ipReputation', 'sanitycheck').", + "type": "string" + }, + { + "name": "Kind", + "description": "The kind of firewall event. Currently always 'firewall'.", + "type": "string" + }, + { + "name": "Description", + "description": "A human-readable description of the rule or managed rule signature that matched (for example, the WAF managed rule name).", + "type": "string" + }, + { + "name": "Ref", + "description": "The user-defined reference (ref) tag of the matched rule, when configured.", + "type": "string" + }, + { + "name": "RuleId", + "description": "The identifier of the rule that matched the request.", + "type": "string" + }, + { + "name": "RulesetId", + "description": "The identifier of the ruleset that contains the matched rule.", + "type": "string" + }, + { + "name": "MatchIndex", + "description": "The index of the rule match within the request evaluation order.", + "type": "int" + }, + { + "name": "RayName", + "description": "The Cloudflare Ray ID associated with the request that generated the event.", + "type": "string" + }, + { + "name": "OriginatorRayName", + "description": "The Ray ID of the originating request when the event was generated by a related/sub request ('00' when not applicable).", + "type": "string" + }, + { + "name": "SampleInterval", + "description": "The sampling interval for the event. A value of 1 means the event was not sampled; values greater than 1 indicate each stored event represents that many requests.", + "type": "int" + }, + { + "name": "ClientIP", + "description": "The IP address of the client that made the request.", + "type": "string" + }, + { + "name": "ClientIPClass", + "description": "Cloudflare's classification of the client IP (for example, 'clean', 'badHost', 'searchEngine', 'allowlist', 'monitoringService', 'noRecord', 'unknown').", + "type": "string" + }, + { + "name": "ClientAsn", + "description": "The Autonomous System Number (ASN) of the client that made the request.", + "type": "string" + }, + { + "name": "ClientASNDescription", + "description": "The description/name of the client's Autonomous System (for example, 'Microsoft Corporation').", + "type": "string" + }, + { + "name": "ClientCountryName", + "description": "The ISO 3166-1 alpha-2 country code of the client, derived from the client IP.", + "type": "string" + }, + { + "name": "ClientRequestHTTPHost", + "description": "The HTTP host header of the request.", + "type": "string" + }, + { + "name": "ClientRequestHTTPMethodName", + "description": "The HTTP method of the request (for example, 'GET', 'POST').", + "type": "string" + }, + { + "name": "ClientRequestHTTPProtocol", + "description": "The HTTP protocol version of the request (for example, 'HTTP/1.1', 'HTTP/2').", + "type": "string" + }, + { + "name": "ClientRequestPath", + "description": "The URI path of the request.", + "type": "string" + }, + { + "name": "ClientRequestQuery", + "description": "The URI query string of the request.", + "type": "string" + }, + { + "name": "ClientRequestScheme", + "description": "The URI scheme of the request (for example, 'http', 'https').", + "type": "string" + }, + { + "name": "ClientRefererHost", + "description": "The host portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererPath", + "description": "The path portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererQuery", + "description": "The query string portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererScheme", + "description": "The scheme portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "UserAgent", + "description": "The User-Agent header string of the client request.", + "type": "string" + }, + { + "name": "EdgeColoName", + "description": "The IATA airport code of the Cloudflare data center (colo) that handled the request (for example, 'IAD', 'ORD').", + "type": "string" + }, + { + "name": "EdgeResponseStatus", + "description": "The HTTP status code Cloudflare's edge returned to the client.", + "type": "int" + }, + { + "name": "OriginResponseStatus", + "description": "The HTTP status code the origin server returned, or 0 when the edge responded without contacting the origin.", + "type": "int" + }, + { + "name": "HttpApplicationVersion", + "description": "The internal HTTP application version associated with the request.", + "type": "long" + }, + { + "name": "ZoneTag", + "description": "The Cloudflare zone identifier (zone tag) the event belongs to. Useful for distinguishing zones in an account-wide query.", + "type": "string" + }, + { + "name": "ZoneVersion", + "description": "The version of the zone configuration in effect when the event was generated.", + "type": "long" + } + ] + } + } } ] }, @@ -4553,48 +4744,1004 @@ }, { "parameters": { - "label": "The Blob container's storage account subscription id", + "label": "The Blob container's storage account subscription id", + "type": "text", + "name": "StorageAccountSubscription", + "validations": { + "required": true + } + }, + "type": "Textbox" + }, + { + "parameters": { + "label": "The event grid topic name of the blob container's storage account if exist. else keep empty.", + "description": "The data flow using event grid to send 'blob-created event' notifications. There could be only one event grid topic for each storage account.\nGo to your blob container's storage account and look in the 'Events' section. If you already have a topic, please provide it's name. Else, keep the text box empty.", + "type": "text", + "name": "EGSystemTopicName", + "validations": { + "required": false + } + }, + "type": "Textbox" + }, + { + "parameters": { + "label": "toggle", + "name": "toggle" + }, + "type": "ConnectionToggleButton" + } + ] + } + ], + "isConnectivityCriteriasMatchSome": false + } + } + }, + { + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition1')))]", + "apiVersion": "2022-01-01-preview", + "type": "Microsoft.OperationalInsights/workspaces/providers/metadata", + "properties": { + "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition1'))]", + "contentId": "[variables('_dataConnectorContentIdConnectorDefinition1')]", + "kind": "DataConnector", + "version": "[variables('dataConnectorCCPVersion')]", + "source": { + "sourceId": "[variables('_solutionId')]", + "name": "[variables('_solutionName')]", + "kind": "Solution" + }, + "author": { + "name": "Cloudflare", + "email": "[variables('_email')]" + }, + "support": { + "name": "Cloudflare", + "email": "support@cloudflare.com", + "tier": "Partner", + "link": "https://support.cloudflare.com" + }, + "dependencies": { + "criteria": [ + { + "version": "[variables('dataConnectorCCPVersion')]", + "contentId": "[variables('_dataConnectorContentIdConnections1')]", + "kind": "ResourcesDataConnector" + } + ] + } + } + }, + { + "type": "Microsoft.OperationalInsights/workspaces/providers/contentTemplates", + "apiVersion": "2023-04-01-preview", + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnections1'), variables('dataConnectorCCPVersion'))]", + "location": "[parameters('workspace-location')]", + "dependsOn": [ + "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" + ], + "properties": { + "contentId": "[variables('_dataConnectorContentIdConnections1')]", + "displayName": "Cloudflare (Using Blob Container) (via Codeless Connector Framework)", + "contentKind": "ResourcesDataConnector", + "mainTemplate": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "[variables('dataConnectorCCPVersion')]", + "parameters": { + "guidValue": { + "defaultValue": "[[newGuid()]", + "type": "securestring" + }, + "innerWorkspace": { + "defaultValue": "[parameters('workspace')]", + "type": "securestring" + }, + "connectorDefinitionName": { + "defaultValue": "Cloudflare (Using Blob Container) (via Codeless Connector Framework)", + "type": "securestring", + "minLength": 1 + }, + "workspace": { + "defaultValue": "[parameters('workspace')]", + "type": "securestring" + }, + "dcrConfig": { + "defaultValue": { + "dataCollectionEndpoint": "data collection Endpoint", + "dataCollectionRuleImmutableId": "data collection rule immutableId" + }, + "type": "object" + }, + "principalId": { + "defaultValue": "principalId", + "type": "securestring", + "minLength": 1 + }, + "blobContainerUri": { + "defaultValue": "blobContainerUri", + "type": "securestring", + "minLength": 1 + }, + "StorageAccountResourceGroupName": { + "defaultValue": "StorageAccountResourceGroupName", + "type": "securestring", + "minLength": 1 + }, + "StorageAccountLocation": { + "defaultValue": "StorageAccountLocation", + "type": "securestring", + "minLength": 1 + }, + "StorageAccountSubscription": { + "defaultValue": "StorageAccountSubscription", + "type": "securestring", + "minLength": 1 + }, + "EGSystemTopicName": { + "defaultValue": "", + "type": "securestring" + } + }, + "variables": { + "_dataConnectorContentIdConnections1": "[variables('_dataConnectorContentIdConnections1')]", + "connectorName": "sentinel-connector", + "blobContainerUriPart": "[concat('.blob.core', '.windows.net')]", + "storageAccountName": "[[split(split(parameters('blobContainerUri'), 'https://')[1], variables('blobContainerUriPart'))[0]]", + "blobContainerName": "[[split(split(parameters('blobContainerUri'), concat(variables('blobContainerUriPart'), '/'))[1], '/')[0]]", + "queueName": "[[concat(variables('connectorName'), '-notification')]", + "dlqName": "[[concat(variables('connectorName'), '-dlq')]", + "storageAccountId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", + "notificationQueueResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues', variables('storageAccountName'), 'default', variables('queueName'))]", + "dlqResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues', variables('storageAccountName'), 'default', variables('dlqName'))]", + "EGSystemTopicDefaultName": "[[format('eg-system-topic-{0}-{1}', variables('connectorName'), parameters('innerWorkspace'))]", + "EGSystemTopicName": "[[if(empty(parameters('EGSystemTopicName')), variables('EGSystemTopicDefaultName'), parameters('EGSystemTopicName'))]", + "EGTopicResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.EventGrid/systemTopics', variables('EGSystemTopicName'))]", + "EgSubscriptionName": "[[format('{0}-{1}', variables('connectorName'), 'blobcreatedevents')]", + "EgSubscriptionResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.EventGrid/systemTopics/eventSubscriptions', variables('EGSystemTopicName'), variables('EgSubscriptionName'))]", + "storageBlobContributorRoleId": "[[subscriptionResourceId(parameters('StorageAccountSubscription'), 'Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", + "storageQueueContributorRoleId": "[[subscriptionResourceId(parameters('StorageAccountSubscription'), 'Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88')]", + "blobRaGuid": "[[guid(variables('storageAccountName'), variables('blobContainerName'))]", + "notificationQueueRaGuid": "[[guid(variables('storageAccountName'), variables('queueName'))]", + "dlqRaGuid": "[[guid(variables('storageAccountName'), variables('dlqName'))]", + "blobRoleAssignmentResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/blobServices/containers/providers/roleAssignments', variables('storageAccountName'), 'default', variables('blobContainerName'), 'Microsoft.Authorization', variables('blobRaGuid'))]", + "notificationQueueRoleAssignmentResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments', variables('storageAccountName'), 'default', variables('queueName'), 'Microsoft.Authorization', variables('notificationQueueRaGuid'))]", + "dlqRoleAssignmentResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments', variables('storageAccountName'), 'default', variables('dlqName'), 'Microsoft.Authorization', variables('dlqRaGuid'))]", + "nestedDeploymentName": "CreateDataFlowResources", + "nestedDeploymentId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Resources/deployments', variables('nestedDeploymentName'))]" + }, + "resources": [ + { + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnections1')))]", + "apiVersion": "2022-01-01-preview", + "type": "Microsoft.OperationalInsights/workspaces/providers/metadata", + "properties": { + "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectors', variables('_dataConnectorContentIdConnections1'))]", + "contentId": "[variables('_dataConnectorContentIdConnections1')]", + "kind": "ResourcesDataConnector", + "version": "[variables('dataConnectorCCPVersion')]", + "source": { + "sourceId": "[variables('_solutionId')]", + "name": "[variables('_solutionName')]", + "kind": "Solution" + }, + "author": { + "name": "Cloudflare", + "email": "[variables('_email')]" + }, + "support": { + "name": "Cloudflare", + "email": "support@cloudflare.com", + "tier": "Partner", + "link": "https://support.cloudflare.com" + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2021-04-01", + "name": "[[variables('nestedDeploymentName')]", + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [ + { + "type": "Microsoft.Storage/storageAccounts/queueServices/queues", + "apiVersion": "2021-04-01", + "name": "[[concat(variables('storageAccountName'), '/default/', variables('queueName'))]", + "dependsOn": [], + "properties": {} + }, + { + "type": "Microsoft.Storage/storageAccounts/queueServices/queues", + "apiVersion": "2021-04-01", + "name": "[[concat(variables('storageAccountName'), '/default/', variables('dlqName'))]", + "dependsOn": [], + "properties": {} + }, + { + "type": "Microsoft.EventGrid/systemTopics", + "apiVersion": "2022-06-15", + "name": "[[variables('EGSystemTopicName')]", + "location": "[[parameters('StorageAccountLocation')]", + "properties": { + "source": "[[variables('storageAccountId')]", + "topicType": "microsoft.storage.storageaccounts" + }, + "condition": "[[empty(parameters('EGSystemTopicName'))]" + }, + { + "type": "Microsoft.EventGrid/systemTopics/eventSubscriptions", + "apiVersion": "2023-12-15-preview", + "name": "[[format('{0}/{1}', variables('EGSystemTopicName'), variables('EgSubscriptionName'))]", + "dependsOn": [ + "[[format('Microsoft.EventGrid/systemTopics/{0}', variables('EGSystemTopicName'))]" + ], + "properties": { + "destination": { + "endpointType": "StorageQueue", + "properties": { + "queueName": "[[variables('queueName')]", + "resourceId": "[[variables('storageAccountId')]" + } + }, + "filter": { + "includedEventTypes": [ + "Microsoft.Storage.BlobCreated" + ], + "subjectBeginsWith": "[[format('{0}/{1}', '/blobServices/default/containers', variables('blobContainerName'))]" + } + } + }, + { + "type": "Microsoft.Storage/storageAccounts/blobServices/containers/providers/roleAssignments", + "apiVersion": "2018-01-01-preview", + "name": "[[concat(variables('storageAccountName'), '/default/', variables('blobContainerName'), '/Microsoft.Authorization/', variables('blobRaGuid'))]", + "properties": { + "roleDefinitionId": "[[variables('storageBlobContributorRoleId')]", + "principalId": "[[parameters('principalId')]" + } + }, + { + "type": "Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments", + "apiVersion": "2018-01-01-preview", + "name": "[[concat(variables('storageAccountName'), '/default/', variables('queueName'), '/Microsoft.Authorization/', variables('notificationQueueRaGuid'))]", + "dependsOn": [ + "[[variables('notificationQueueResourceId')]" + ], + "properties": { + "roleDefinitionId": "[[variables('storageQueueContributorRoleId')]", + "principalId": "[[parameters('principalId')]" + } + }, + { + "type": "Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments", + "apiVersion": "2018-01-01-preview", + "name": "[[concat(variables('storageAccountName'), '/default/', variables('dlqName'), '/Microsoft.Authorization/', variables('dlqRaGuid'))]", + "dependsOn": [ + "[[variables('dlqResourceId')]" + ], + "properties": { + "roleDefinitionId": "[[variables('storageQueueContributorRoleId')]", + "principalId": "[[parameters('principalId')]" + } + } + ] + } + }, + "subscriptionId": "[[parameters('StorageAccountSubscription')]", + "resourceGroup": "[[parameters('StorageAccountResourceGroupName')]" + }, + { + "name": "[[concat(parameters('innerWorkspace'),'/Microsoft.SecurityInsights/', 'CloudflareUsingBlob', parameters('guidValue'))]", + "apiVersion": "2023-02-01-preview", + "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectors", + "location": "[parameters('workspace-location')]", + "kind": "StorageAccountBlobContainer", + "properties": { + "connectorDefinitionName": "CloudflareDefinition", + "dataType": "CloudflareV2_CL", + "dcrConfig": { + "dataCollectionEndpoint": "[[parameters('dcrConfig').dataCollectionEndpoint]", + "dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]", + "streamName": "Custom-Cloudflare" + }, + "auth": { + "type": "ServicePrincipal" + }, + "response": { + "eventsJsonPaths": [ + "$" + ], + "format": "json", + "isGzipCompressed": true + }, + "request": { + "QueueUri": "[[uri(concat('https://', variables('storageAccountName'), '.queue.core', '.windows.net', '/'), variables('queueName'))]", + "DlqUri": "[[uri(concat('https://', variables('storageAccountName'), '.queue.core', '.windows.net', '/'), variables('dlqName'))]" + } + }, + "dependsOn": [ + "[[variables('nestedDeploymentId')]" + ] + } + ] + }, + "packageKind": "Solution", + "packageVersion": "[variables('_solutionVersion')]", + "packageName": "[variables('_solutionName')]", + "contentProductId": "[concat(take(variables('_solutionId'), 50),'-','rdc','-', uniqueString(concat(variables('_solutionId'),'-','ResourcesDataConnector','-',variables('_dataConnectorContentIdConnections1'),'-', variables('dataConnectorCCPVersion'))))]", + "packageId": "[variables('_solutionId')]", + "contentSchemaVersion": "3.0.0", + "version": "[variables('dataConnectorCCPVersion')]" + } + }, + { + "type": "Microsoft.OperationalInsights/workspaces/providers/contentTemplates", + "apiVersion": "2023-04-01-preview", + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnectorDefinition2'), variables('dataConnectorCCPVersion'))]", + "location": "[parameters('workspace-location')]", + "dependsOn": [ + "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" + ], + "properties": { + "contentId": "[variables('_dataConnectorContentIdConnectorDefinition2')]", + "displayName": "Cloudflare Security Events (via Codeless Connector Framework)", + "contentKind": "DataConnector", + "mainTemplate": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "[variables('dataConnectorCCPVersion')]", + "parameters": {}, + "variables": {}, + "resources": [ + { + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',variables('_dataConnectorContentIdConnectorDefinition2'))]", + "apiVersion": "2022-09-01-preview", + "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectorDefinitions", + "location": "[parameters('workspace-location')]", + "kind": "Customizable", + "properties": { + "connectorUiConfig": { + "id": "CloudflareSecurityEventsDefinition", + "title": "Cloudflare Security Events (via Codeless Connector Framework)", + "publisher": "Cloudflare", + "descriptionMarkdown": "The [Cloudflare](https://www.cloudflare.com/) Security Events connector ingests Cloudflare [security events](https://developers.cloudflare.com/waf/analytics/security-events/) into Microsoft Sentinel using the Cloudflare [GraphQL Analytics API](https://developers.cloudflare.com/analytics/graphql-api/) (the `firewallEventsAdaptive` dataset, queried at account scope).\n\nSecurity events capture requests acted on by Cloudflare security products, including the WAF managed and custom rulesets, rate limiting, L7 DDoS mitigation, IP reputation, and bot mitigations.\n\n**Underlying Microsoft Technologies used:**\n\nThis solution takes a dependency on the following technologies, and some of these dependencies either may be in Preview state or might result in additional ingestion or operational costs:\n\na. [Codeless Connector Framework (CCF)](https://learn.microsoft.com/en-us/azure/sentinel/create-custom-connector)", + "graphQueriesTableName": "CloudflareSecurityEvents_CL", + "graphQueries": [ + { + "metricName": "Total events received", + "legend": "Cloudflare Security Events", + "baseQuery": "{{graphQueriesTableName}}" + } + ], + "sampleQueries": [ + { + "description": "Get sample Cloudflare Security Events", + "query": "{{graphQueriesTableName}}\n | take 10" + }, + { + "description": "Cloudflare Security Events by action", + "query": "{{graphQueriesTableName}}\n | summarize count() by Action" + }, + { + "description": "Top client IPs blocked by the Cloudflare WAF", + "query": "{{graphQueriesTableName}}\n | where Action == 'block'\n | summarize count() by ClientIP\n | top 10 by count_" + } + ], + "dataTypes": [ + { + "name": "CloudflareSecurityEvents_CL", + "lastDataReceivedQuery": "{{graphQueriesTableName}}\n | where TimeGenerated > ago(12h) | summarize Time = max(TimeGenerated)\n | where isnotempty(Time)" + } + ], + "connectivityCriteria": [ + { + "type": "HasDataConnectors" + } + ], + "availability": { + "isPreview": true, + "status": 1 + }, + "permissions": { + "resourceProvider": [ + { + "provider": "Microsoft.OperationalInsights/workspaces", + "permissionsDisplayText": "Read and Write permissions are required.", + "providerDisplayName": "Workspace", + "scope": "Workspace", + "requiredPermissions": { + "read": true, + "write": true, + "delete": true, + "action": false + } + } + ], + "customs": [ + { + "name": "Cloudflare Account API token", + "description": "A Cloudflare Account API token with **Account Analytics > Read** permission is required to query the GraphQL Analytics API. Refer to the [Cloudflare documentation](https://developers.cloudflare.com/fundamentals/api/get-started/account-owned-tokens/) for instructions on creating an account-owned API token." + }, + { + "name": "Cloudflare Account ID", + "description": "Your Cloudflare Account ID is available in the Cloudflare dashboard URL or under **Account Home > Overview**. Refer to the [Cloudflare documentation](https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/) for instructions." + } + ] + }, + "instructionSteps": [ + { + "title": "Connect Cloudflare Security Events to Microsoft Sentinel", + "description": "To enable ingestion of Cloudflare security events, provide your Cloudflare Account ID and Cloudflare Account API token below, then select **Connect**.\n\n> **Note:** Ensure your API token has the **Account Analytics > Read** permission scope. Security events are collected across all zones in the account.", + "instructions": [ + { + "type": "Textbox", + "parameters": { + "label": "Cloudflare Account ID", + "placeholder": "Enter your Cloudflare Account ID (e.g. 9a7806061c88ada191ed06f989cc3dac)", + "type": "text", + "name": "accountId", + "validations": { + "required": true + } + } + }, + { + "type": "Textbox", + "parameters": { + "label": "Cloudflare Account API token", + "placeholder": "Enter your Cloudflare Account API token", + "type": "password", + "name": "apikey", + "validations": { + "required": true + } + } + }, + { + "type": "ConnectionToggleButton", + "parameters": { + "connectLabel": "Connect", + "name": "Connect" + } + } + ] + } + ] + } + } + }, + { + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition2')))]", + "apiVersion": "2022-01-01-preview", + "type": "Microsoft.OperationalInsights/workspaces/providers/metadata", + "properties": { + "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition2'))]", + "contentId": "[variables('_dataConnectorContentIdConnectorDefinition2')]", + "kind": "DataConnector", + "version": "[variables('dataConnectorCCPVersion')]", + "source": { + "sourceId": "[variables('_solutionId')]", + "name": "[variables('_solutionName')]", + "kind": "Solution" + }, + "author": { + "name": "Cloudflare", + "email": "[variables('_email')]" + }, + "support": { + "name": "Cloudflare", + "email": "support@cloudflare.com", + "tier": "Partner", + "link": "https://support.cloudflare.com" + }, + "dependencies": { + "criteria": [ + { + "version": "[variables('dataConnectorCCPVersion')]", + "contentId": "[variables('_dataConnectorContentIdConnections2')]", + "kind": "ResourcesDataConnector" + } + ] + } + } + }, + { + "name": "CloudflareSecurityEventsDCR", + "apiVersion": "2022-06-01", + "type": "Microsoft.Insights/dataCollectionRules", + "location": "[parameters('workspace-location')]", + "kind": "[variables('blanks')]", + "properties": { + "dataCollectionEndpointId": "[variables('dataCollectionEndpointId2')]", + "streamDeclarations": { + "Custom-CloudflareSecurityEvents_CL": { + "columns": [ + { + "name": "action", + "type": "string" + }, + { + "name": "source", + "type": "string" + }, + { + "name": "kind", + "type": "string" + }, + { + "name": "description", + "type": "string" + }, + { + "name": "ref", + "type": "string" + }, + { + "name": "ruleId", + "type": "string" + }, + { + "name": "rulesetId", + "type": "string" + }, + { + "name": "matchIndex", + "type": "int" + }, + { + "name": "rayName", + "type": "string" + }, + { + "name": "originatorRayName", + "type": "string" + }, + { + "name": "sampleInterval", + "type": "int" + }, + { + "name": "clientIP", + "type": "string" + }, + { + "name": "clientIPClass", + "type": "string" + }, + { + "name": "clientAsn", + "type": "string" + }, + { + "name": "clientASNDescription", + "type": "string" + }, + { + "name": "clientCountryName", + "type": "string" + }, + { + "name": "clientRequestHTTPHost", + "type": "string" + }, + { + "name": "clientRequestHTTPMethodName", + "type": "string" + }, + { + "name": "clientRequestHTTPProtocol", + "type": "string" + }, + { + "name": "clientRequestPath", + "type": "string" + }, + { + "name": "clientRequestQuery", + "type": "string" + }, + { + "name": "clientRequestScheme", + "type": "string" + }, + { + "name": "clientRefererHost", + "type": "string" + }, + { + "name": "clientRefererPath", + "type": "string" + }, + { + "name": "clientRefererQuery", + "type": "string" + }, + { + "name": "clientRefererScheme", + "type": "string" + }, + { + "name": "userAgent", + "type": "string" + }, + { + "name": "edgeColoName", + "type": "string" + }, + { + "name": "edgeResponseStatus", + "type": "int" + }, + { + "name": "originResponseStatus", + "type": "int" + }, + { + "name": "httpApplicationVersion", + "type": "long" + }, + { + "name": "zoneTag", + "type": "string" + }, + { + "name": "zoneVersion", + "type": "long" + }, + { + "name": "datetime", + "type": "string" + } + ] + } + }, + "destinations": { + "logAnalytics": [ + { + "workspaceResourceId": "[variables('workspaceResourceId')]", + "name": "clv2ws1" + } + ] + }, + "dataFlows": [ + { + "streams": [ + "Custom-CloudflareSecurityEvents_CL" + ], + "destinations": [ + "clv2ws1" + ], + "transformKql": "source\n| extend TimeGenerated = todatetime(datetime)\n| project-rename Action = action, Source = source, Kind = kind, Description = description, Ref = ref, RuleId = ruleId, RulesetId = rulesetId, MatchIndex = matchIndex, RayName = rayName, OriginatorRayName = originatorRayName, SampleInterval = sampleInterval, ClientIP = clientIP, ClientIPClass = clientIPClass, ClientAsn = clientAsn, ClientASNDescription = clientASNDescription, ClientCountryName = clientCountryName, ClientRequestHTTPHost = clientRequestHTTPHost, ClientRequestHTTPMethodName = clientRequestHTTPMethodName, ClientRequestHTTPProtocol = clientRequestHTTPProtocol, ClientRequestPath = clientRequestPath, ClientRequestQuery = clientRequestQuery, ClientRequestScheme = clientRequestScheme, ClientRefererHost = clientRefererHost, ClientRefererPath = clientRefererPath, ClientRefererQuery = clientRefererQuery, ClientRefererScheme = clientRefererScheme, UserAgent = userAgent, EdgeColoName = edgeColoName, EdgeResponseStatus = edgeResponseStatus, OriginResponseStatus = originResponseStatus, HttpApplicationVersion = httpApplicationVersion, ZoneTag = zoneTag, ZoneVersion = zoneVersion", + "outputStream": "Custom-CloudflareSecurityEvents_CL" + } + ] + } + }, + { + "name": "CloudflareSecurityEvents_CL", + "apiVersion": "2022-10-01", + "type": "Microsoft.OperationalInsights/workspaces/tables", + "location": "[parameters('workspace-location')]", + "kind": null, + "properties": { + "retentionInDays": 90, + "schema": { + "name": "CloudflareSecurityEvents_CL", + "description": "Cloudflare security (firewall) events ingested from the Cloudflare GraphQL Analytics API (firewallEventsAdaptive dataset, account scope). Captures requests acted on by Cloudflare security products including the WAF managed and custom rulesets, rate limiting, L7 DDoS mitigation, IP reputation and bot mitigations.", + "columns": [ + { + "name": "TimeGenerated", + "description": "The timestamp of the firewall event, derived from the Cloudflare 'datetime' field (when the request was evaluated).", + "type": "datetime" + }, + { + "name": "Action", + "description": "The action the firewall rule took when it matched the request (for example, 'block', 'challenge', 'allow', 'log', 'skip', 'managed_challenge', 'jschallenge').", + "type": "string" + }, + { + "name": "Source", + "description": "The Cloudflare security product/source that produced the event (for example, 'firewallManaged', 'firewallCustom', 'ratelimit', 'l7ddos', 'bic', 'hot', 'securityLevel', 'ipReputation', 'sanitycheck').", + "type": "string" + }, + { + "name": "Kind", + "description": "The kind of firewall event. Currently always 'firewall'.", + "type": "string" + }, + { + "name": "Description", + "description": "A human-readable description of the rule or managed rule signature that matched (for example, the WAF managed rule name).", + "type": "string" + }, + { + "name": "Ref", + "description": "The user-defined reference (ref) tag of the matched rule, when configured.", + "type": "string" + }, + { + "name": "RuleId", + "description": "The identifier of the rule that matched the request.", + "type": "string" + }, + { + "name": "RulesetId", + "description": "The identifier of the ruleset that contains the matched rule.", + "type": "string" + }, + { + "name": "MatchIndex", + "description": "The index of the rule match within the request evaluation order.", + "type": "int" + }, + { + "name": "RayName", + "description": "The Cloudflare Ray ID associated with the request that generated the event.", + "type": "string" + }, + { + "name": "OriginatorRayName", + "description": "The Ray ID of the originating request when the event was generated by a related/sub request ('00' when not applicable).", + "type": "string" + }, + { + "name": "SampleInterval", + "description": "The sampling interval for the event. A value of 1 means the event was not sampled; values greater than 1 indicate each stored event represents that many requests.", + "type": "int" + }, + { + "name": "ClientIP", + "description": "The IP address of the client that made the request.", + "type": "string" + }, + { + "name": "ClientIPClass", + "description": "Cloudflare's classification of the client IP (for example, 'clean', 'badHost', 'searchEngine', 'allowlist', 'monitoringService', 'noRecord', 'unknown').", + "type": "string" + }, + { + "name": "ClientAsn", + "description": "The Autonomous System Number (ASN) of the client that made the request.", + "type": "string" + }, + { + "name": "ClientASNDescription", + "description": "The description/name of the client's Autonomous System (for example, 'Microsoft Corporation').", + "type": "string" + }, + { + "name": "ClientCountryName", + "description": "The ISO 3166-1 alpha-2 country code of the client, derived from the client IP.", + "type": "string" + }, + { + "name": "ClientRequestHTTPHost", + "description": "The HTTP host header of the request.", + "type": "string" + }, + { + "name": "ClientRequestHTTPMethodName", + "description": "The HTTP method of the request (for example, 'GET', 'POST').", + "type": "string" + }, + { + "name": "ClientRequestHTTPProtocol", + "description": "The HTTP protocol version of the request (for example, 'HTTP/1.1', 'HTTP/2').", + "type": "string" + }, + { + "name": "ClientRequestPath", + "description": "The URI path of the request.", + "type": "string" + }, + { + "name": "ClientRequestQuery", + "description": "The URI query string of the request.", + "type": "string" + }, + { + "name": "ClientRequestScheme", + "description": "The URI scheme of the request (for example, 'http', 'https').", + "type": "string" + }, + { + "name": "ClientRefererHost", + "description": "The host portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererPath", + "description": "The path portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererQuery", + "description": "The query string portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "ClientRefererScheme", + "description": "The scheme portion of the HTTP Referer header.", + "type": "string" + }, + { + "name": "UserAgent", + "description": "The User-Agent header string of the client request.", + "type": "string" + }, + { + "name": "EdgeColoName", + "description": "The IATA airport code of the Cloudflare data center (colo) that handled the request (for example, 'IAD', 'ORD').", + "type": "string" + }, + { + "name": "EdgeResponseStatus", + "description": "The HTTP status code Cloudflare's edge returned to the client.", + "type": "int" + }, + { + "name": "OriginResponseStatus", + "description": "The HTTP status code the origin server returned, or 0 when the edge responded without contacting the origin.", + "type": "int" + }, + { + "name": "HttpApplicationVersion", + "description": "The internal HTTP application version associated with the request.", + "type": "long" + }, + { + "name": "ZoneTag", + "description": "The Cloudflare zone identifier (zone tag) the event belongs to. Useful for distinguishing zones in an account-wide query.", + "type": "string" + }, + { + "name": "ZoneVersion", + "description": "The version of the zone configuration in effect when the event was generated.", + "type": "long" + } + ] + } + } + } + ] + }, + "packageKind": "Solution", + "packageVersion": "[variables('_solutionVersion')]", + "packageName": "[variables('_solutionName')]", + "contentProductId": "[concat(take(variables('_solutionId'), 50),'-','dc','-', uniqueString(concat(variables('_solutionId'),'-','DataConnector','-',variables('_dataConnectorContentIdConnectorDefinition2'),'-', variables('dataConnectorCCPVersion'))))]", + "packageId": "[variables('_solutionId')]", + "contentSchemaVersion": "3.0.0", + "version": "[variables('dataConnectorCCPVersion')]" + } + }, + { + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',variables('_dataConnectorContentIdConnectorDefinition2'))]", + "apiVersion": "2022-09-01-preview", + "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectorDefinitions", + "location": "[parameters('workspace-location')]", + "kind": "Customizable", + "properties": { + "connectorUiConfig": { + "id": "CloudflareSecurityEventsDefinition", + "title": "Cloudflare Security Events (via Codeless Connector Framework)", + "publisher": "Cloudflare", + "descriptionMarkdown": "The [Cloudflare](https://www.cloudflare.com/) Security Events connector ingests Cloudflare [security events](https://developers.cloudflare.com/waf/analytics/security-events/) into Microsoft Sentinel using the Cloudflare [GraphQL Analytics API](https://developers.cloudflare.com/analytics/graphql-api/) (the `firewallEventsAdaptive` dataset, queried at account scope).\n\nSecurity events capture requests acted on by Cloudflare security products, including the WAF managed and custom rulesets, rate limiting, L7 DDoS mitigation, IP reputation, and bot mitigations.\n\n**Underlying Microsoft Technologies used:**\n\nThis solution takes a dependency on the following technologies, and some of these dependencies either may be in Preview state or might result in additional ingestion or operational costs:\n\na. [Codeless Connector Framework (CCF)](https://learn.microsoft.com/en-us/azure/sentinel/create-custom-connector)", + "graphQueriesTableName": "CloudflareSecurityEvents_CL", + "graphQueries": [ + { + "metricName": "Total events received", + "legend": "Cloudflare Security Events", + "baseQuery": "{{graphQueriesTableName}}" + } + ], + "sampleQueries": [ + { + "description": "Get sample Cloudflare Security Events", + "query": "{{graphQueriesTableName}}\n | take 10" + }, + { + "description": "Cloudflare Security Events by action", + "query": "{{graphQueriesTableName}}\n | summarize count() by Action" + }, + { + "description": "Top client IPs blocked by the Cloudflare WAF", + "query": "{{graphQueriesTableName}}\n | where Action == 'block'\n | summarize count() by ClientIP\n | top 10 by count_" + } + ], + "dataTypes": [ + { + "name": "CloudflareSecurityEvents_CL", + "lastDataReceivedQuery": "{{graphQueriesTableName}}\n | where TimeGenerated > ago(12h) | summarize Time = max(TimeGenerated)\n | where isnotempty(Time)" + } + ], + "connectivityCriteria": [ + { + "type": "HasDataConnectors" + } + ], + "availability": { + "isPreview": true, + "status": 1 + }, + "permissions": { + "resourceProvider": [ + { + "provider": "Microsoft.OperationalInsights/workspaces", + "permissionsDisplayText": "Read and Write permissions are required.", + "providerDisplayName": "Workspace", + "scope": "Workspace", + "requiredPermissions": { + "read": true, + "write": true, + "delete": true, + "action": false + } + } + ], + "customs": [ + { + "name": "Cloudflare Account API token", + "description": "A Cloudflare Account API token with **Account Analytics > Read** permission is required to query the GraphQL Analytics API. Refer to the [Cloudflare documentation](https://developers.cloudflare.com/fundamentals/api/get-started/account-owned-tokens/) for instructions on creating an account-owned API token." + }, + { + "name": "Cloudflare Account ID", + "description": "Your Cloudflare Account ID is available in the Cloudflare dashboard URL or under **Account Home > Overview**. Refer to the [Cloudflare documentation](https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/) for instructions." + } + ] + }, + "instructionSteps": [ + { + "title": "Connect Cloudflare Security Events to Microsoft Sentinel", + "description": "To enable ingestion of Cloudflare security events, provide your Cloudflare Account ID and Cloudflare Account API token below, then select **Connect**.\n\n> **Note:** Ensure your API token has the **Account Analytics > Read** permission scope. Security events are collected across all zones in the account.", + "instructions": [ + { + "type": "Textbox", + "parameters": { + "label": "Cloudflare Account ID", + "placeholder": "Enter your Cloudflare Account ID (e.g. 9a7806061c88ada191ed06f989cc3dac)", "type": "text", - "name": "StorageAccountSubscription", + "name": "accountId", "validations": { "required": true } - }, - "type": "Textbox" + } }, { + "type": "Textbox", "parameters": { - "label": "The event grid topic name of the blob container's storage account if exist. else keep empty.", - "description": "The data flow using event grid to send 'blob-created event' notifications. There could be only one event grid topic for each storage account.\nGo to your blob container's storage account and look in the 'Events' section. If you already have a topic, please provide it's name. Else, keep the text box empty.", - "type": "text", - "name": "EGSystemTopicName", + "label": "Cloudflare Account API token", + "placeholder": "Enter your Cloudflare Account API token", + "type": "password", + "name": "apikey", "validations": { - "required": false + "required": true } - }, - "type": "Textbox" + } }, { + "type": "ConnectionToggleButton", "parameters": { - "label": "toggle", - "name": "toggle" - }, - "type": "ConnectionToggleButton" + "connectLabel": "Connect", + "name": "Connect" + } } ] } - ], - "isConnectivityCriteriasMatchSome": false + ] } } }, { - "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition1')))]", + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition2')))]", "apiVersion": "2022-01-01-preview", "type": "Microsoft.OperationalInsights/workspaces/providers/metadata", "properties": { - "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition1'))]", - "contentId": "[variables('_dataConnectorContentIdConnectorDefinition1')]", + "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition2'))]", + "contentId": "[variables('_dataConnectorContentIdConnectorDefinition2')]", "kind": "DataConnector", "version": "[variables('dataConnectorCCPVersion')]", "source": { @@ -4616,7 +5763,7 @@ "criteria": [ { "version": "[variables('dataConnectorCCPVersion')]", - "contentId": "[variables('_dataConnectorContentIdConnections1')]", + "contentId": "[variables('_dataConnectorContentIdConnections2')]", "kind": "ResourcesDataConnector" } ] @@ -4626,14 +5773,14 @@ { "type": "Microsoft.OperationalInsights/workspaces/providers/contentTemplates", "apiVersion": "2023-04-01-preview", - "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnections1'), variables('dataConnectorCCPVersion'))]", + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnections2'), variables('dataConnectorCCPVersion'))]", "location": "[parameters('workspace-location')]", "dependsOn": [ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "contentId": "[variables('_dataConnectorContentIdConnections1')]", - "displayName": "Cloudflare (Using Blob Container) (via Codeless Connector Framework)", + "contentId": "[variables('_dataConnectorContentIdConnections2')]", + "displayName": "Cloudflare Security Events (via Codeless Connector Framework)", "contentKind": "ResourcesDataConnector", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", @@ -4648,7 +5795,7 @@ "type": "securestring" }, "connectorDefinitionName": { - "defaultValue": "Cloudflare (Using Blob Container) (via Codeless Connector Framework)", + "defaultValue": "Cloudflare Security Events (via Codeless Connector Framework)", "type": "securestring", "minLength": 1 }, @@ -4663,71 +5810,28 @@ }, "type": "object" }, - "principalId": { - "defaultValue": "principalId", - "type": "securestring", - "minLength": 1 - }, - "blobContainerUri": { - "defaultValue": "blobContainerUri", - "type": "securestring", - "minLength": 1 - }, - "StorageAccountResourceGroupName": { - "defaultValue": "StorageAccountResourceGroupName", - "type": "securestring", - "minLength": 1 - }, - "StorageAccountLocation": { - "defaultValue": "StorageAccountLocation", + "accountId": { + "defaultValue": "accountId", "type": "securestring", "minLength": 1 }, - "StorageAccountSubscription": { - "defaultValue": "StorageAccountSubscription", + "apikey": { + "defaultValue": "apikey", "type": "securestring", "minLength": 1 - }, - "EGSystemTopicName": { - "defaultValue": "", - "type": "securestring" } }, "variables": { - "_dataConnectorContentIdConnections1": "[variables('_dataConnectorContentIdConnections1')]", - "connectorName": "sentinel-connector", - "blobContainerUriPart": "[concat('.blob.core', '.windows.net')]", - "storageAccountName": "[[split(split(parameters('blobContainerUri'), 'https://')[1], variables('blobContainerUriPart'))[0]]", - "blobContainerName": "[[split(split(parameters('blobContainerUri'), concat(variables('blobContainerUriPart'), '/'))[1], '/')[0]]", - "queueName": "[[concat(variables('connectorName'), '-notification')]", - "dlqName": "[[concat(variables('connectorName'), '-dlq')]", - "storageAccountId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts', variables('storageAccountName'))]", - "notificationQueueResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues', variables('storageAccountName'), 'default', variables('queueName'))]", - "dlqResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues', variables('storageAccountName'), 'default', variables('dlqName'))]", - "EGSystemTopicDefaultName": "[[format('eg-system-topic-{0}-{1}', variables('connectorName'), parameters('innerWorkspace'))]", - "EGSystemTopicName": "[[if(empty(parameters('EGSystemTopicName')), variables('EGSystemTopicDefaultName'), parameters('EGSystemTopicName'))]", - "EGTopicResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.EventGrid/systemTopics', variables('EGSystemTopicName'))]", - "EgSubscriptionName": "[[format('{0}-{1}', variables('connectorName'), 'blobcreatedevents')]", - "EgSubscriptionResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.EventGrid/systemTopics/eventSubscriptions', variables('EGSystemTopicName'), variables('EgSubscriptionName'))]", - "storageBlobContributorRoleId": "[[subscriptionResourceId(parameters('StorageAccountSubscription'), 'Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')]", - "storageQueueContributorRoleId": "[[subscriptionResourceId(parameters('StorageAccountSubscription'), 'Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88')]", - "blobRaGuid": "[[guid(variables('storageAccountName'), variables('blobContainerName'))]", - "notificationQueueRaGuid": "[[guid(variables('storageAccountName'), variables('queueName'))]", - "dlqRaGuid": "[[guid(variables('storageAccountName'), variables('dlqName'))]", - "blobRoleAssignmentResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/blobServices/containers/providers/roleAssignments', variables('storageAccountName'), 'default', variables('blobContainerName'), 'Microsoft.Authorization', variables('blobRaGuid'))]", - "notificationQueueRoleAssignmentResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments', variables('storageAccountName'), 'default', variables('queueName'), 'Microsoft.Authorization', variables('notificationQueueRaGuid'))]", - "dlqRoleAssignmentResourceId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments', variables('storageAccountName'), 'default', variables('dlqName'), 'Microsoft.Authorization', variables('dlqRaGuid'))]", - "nestedDeploymentName": "CreateDataFlowResources", - "nestedDeploymentId": "[[resourceId(parameters('StorageAccountResourceGroupName'), 'Microsoft.Resources/deployments', variables('nestedDeploymentName'))]" + "_dataConnectorContentIdConnections2": "[variables('_dataConnectorContentIdConnections2')]" }, "resources": [ { - "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnections1')))]", + "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnections2')))]", "apiVersion": "2022-01-01-preview", "type": "Microsoft.OperationalInsights/workspaces/providers/metadata", "properties": { - "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectors', variables('_dataConnectorContentIdConnections1'))]", - "contentId": "[variables('_dataConnectorContentIdConnections1')]", + "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectors', variables('_dataConnectorContentIdConnections2'))]", + "contentId": "[variables('_dataConnectorContentIdConnections2')]", "kind": "ResourcesDataConnector", "version": "[variables('dataConnectorCCPVersion')]", "source": { @@ -4748,141 +5852,55 @@ } }, { - "type": "Microsoft.Resources/deployments", - "apiVersion": "2021-04-01", - "name": "[[variables('nestedDeploymentName')]", - "properties": { - "mode": "Incremental", - "template": { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "resources": [ - { - "type": "Microsoft.Storage/storageAccounts/queueServices/queues", - "apiVersion": "2021-04-01", - "name": "[[concat(variables('storageAccountName'), '/default/', variables('queueName'))]", - "dependsOn": [], - "properties": {} - }, - { - "type": "Microsoft.Storage/storageAccounts/queueServices/queues", - "apiVersion": "2021-04-01", - "name": "[[concat(variables('storageAccountName'), '/default/', variables('dlqName'))]", - "dependsOn": [], - "properties": {} - }, - { - "type": "Microsoft.EventGrid/systemTopics", - "apiVersion": "2022-06-15", - "name": "[[variables('EGSystemTopicName')]", - "location": "[[parameters('StorageAccountLocation')]", - "properties": { - "source": "[[variables('storageAccountId')]", - "topicType": "microsoft.storage.storageaccounts" - }, - "condition": "[[empty(parameters('EGSystemTopicName'))]" - }, - { - "type": "Microsoft.EventGrid/systemTopics/eventSubscriptions", - "apiVersion": "2023-12-15-preview", - "name": "[[format('{0}/{1}', variables('EGSystemTopicName'), variables('EgSubscriptionName'))]", - "dependsOn": [ - "[[format('Microsoft.EventGrid/systemTopics/{0}', variables('EGSystemTopicName'))]" - ], - "properties": { - "destination": { - "endpointType": "StorageQueue", - "properties": { - "queueName": "[[variables('queueName')]", - "resourceId": "[[variables('storageAccountId')]" - } - }, - "filter": { - "includedEventTypes": [ - "Microsoft.Storage.BlobCreated" - ], - "subjectBeginsWith": "[[format('{0}/{1}', '/blobServices/default/containers', variables('blobContainerName'))]" - } - } - }, - { - "type": "Microsoft.Storage/storageAccounts/blobServices/containers/providers/roleAssignments", - "apiVersion": "2018-01-01-preview", - "name": "[[concat(variables('storageAccountName'), '/default/', variables('blobContainerName'), '/Microsoft.Authorization/', variables('blobRaGuid'))]", - "properties": { - "roleDefinitionId": "[[variables('storageBlobContributorRoleId')]", - "principalId": "[[parameters('principalId')]" - } - }, - { - "type": "Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments", - "apiVersion": "2018-01-01-preview", - "name": "[[concat(variables('storageAccountName'), '/default/', variables('queueName'), '/Microsoft.Authorization/', variables('notificationQueueRaGuid'))]", - "dependsOn": [ - "[[variables('notificationQueueResourceId')]" - ], - "properties": { - "roleDefinitionId": "[[variables('storageQueueContributorRoleId')]", - "principalId": "[[parameters('principalId')]" - } - }, - { - "type": "Microsoft.Storage/storageAccounts/queueServices/queues/providers/roleAssignments", - "apiVersion": "2018-01-01-preview", - "name": "[[concat(variables('storageAccountName'), '/default/', variables('dlqName'), '/Microsoft.Authorization/', variables('dlqRaGuid'))]", - "dependsOn": [ - "[[variables('dlqResourceId')]" - ], - "properties": { - "roleDefinitionId": "[[variables('storageQueueContributorRoleId')]", - "principalId": "[[parameters('principalId')]" - } - } - ] - } - }, - "subscriptionId": "[[parameters('StorageAccountSubscription')]", - "resourceGroup": "[[parameters('StorageAccountResourceGroupName')]" - }, - { - "name": "[[concat(parameters('innerWorkspace'),'/Microsoft.SecurityInsights/', 'CloudflareUsingBlob', parameters('guidValue'))]", + "name": "[[concat(parameters('innerWorkspace'),'/Microsoft.SecurityInsights/', 'CloudflareSecurityEventsPoller', parameters('guidValue'))]", "apiVersion": "2023-02-01-preview", "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectors", "location": "[parameters('workspace-location')]", - "kind": "StorageAccountBlobContainer", + "kind": "RestApiPoller", "properties": { - "connectorDefinitionName": "CloudflareDefinition", - "dataType": "CloudflareV2_CL", + "connectorDefinitionName": "CloudflareSecurityEventsDefinition", + "dataType": "CloudflareSecurityEvents_CL", "dcrConfig": { + "streamName": "Custom-CloudflareSecurityEvents_CL", "dataCollectionEndpoint": "[[parameters('dcrConfig').dataCollectionEndpoint]", - "dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]", - "streamName": "Custom-Cloudflare" + "dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]" }, "auth": { - "type": "ServicePrincipal" + "type": "APIKey", + "ApiKey": "[[parameters('apikey')]", + "ApiKeyName": "Authorization", + "ApiKeyIdentifier": "Bearer" + }, + "request": { + "apiEndpoint": "https://api.cloudflare.com/client/v4/graphql", + "httpMethod": "POST", + "queryWindowInMin": 10, + "queryTimeFormat": "yyyy-MM-ddTHH:mm:ssZ", + "rateLimitQPS": 5, + "retryCount": 3, + "timeoutInSeconds": 60, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "User-Agent": "Scuba" + }, + "isPostPayloadJson": true, + "queryParametersTemplate": "[[concat('{\"query\":\"{ viewer { accounts(filter: {accountTag: \\\"', parameters('accountId'), '\\\"}) { firewallEventsAdaptive(filter: {datetime_geq: \\\"{_QueryWindowStartTime}\\\", datetime_leq: \\\"{_QueryWindowEndTime}\\\"}, limit: 10000, orderBy: [datetime_ASC]) { action source kind description ref ruleId rulesetId matchIndex rayName originatorRayName sampleInterval clientIP clientIPClass clientAsn clientASNDescription clientCountryName clientRequestHTTPHost clientRequestHTTPMethodName clientRequestHTTPProtocol clientRequestPath clientRequestQuery clientRequestScheme clientRefererHost clientRefererPath clientRefererQuery clientRefererScheme userAgent edgeColoName edgeResponseStatus originResponseStatus httpApplicationVersion zoneTag zoneVersion datetime } } } }\"}')]" }, "response": { "eventsJsonPaths": [ - "$" + "$.data.viewer.accounts[0].firewallEventsAdaptive" ], - "format": "json", - "isGzipCompressed": true - }, - "request": { - "QueueUri": "[[uri(concat('https://', variables('storageAccountName'), '.queue.core', '.windows.net', '/'), variables('queueName'))]", - "DlqUri": "[[uri(concat('https://', variables('storageAccountName'), '.queue.core', '.windows.net', '/'), variables('dlqName'))]" + "format": "json" } - }, - "dependsOn": [ - "[[variables('nestedDeploymentId')]" - ] + } } ] }, "packageKind": "Solution", "packageVersion": "[variables('_solutionVersion')]", "packageName": "[variables('_solutionName')]", - "contentProductId": "[concat(take(variables('_solutionId'), 50),'-','rdc','-', uniqueString(concat(variables('_solutionId'),'-','ResourcesDataConnector','-',variables('_dataConnectorContentIdConnections1'),'-', variables('dataConnectorCCPVersion'))))]", + "contentProductId": "[concat(take(variables('_solutionId'), 50),'-','rdc','-', uniqueString(concat(variables('_solutionId'),'-','ResourcesDataConnector','-',variables('_dataConnectorContentIdConnections2'),'-', variables('dataConnectorCCPVersion'))))]", "packageId": "[variables('_solutionId')]", "contentSchemaVersion": "3.0.0", "version": "[variables('dataConnectorCCPVersion')]" @@ -4897,7 +5915,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "Cloudflare Data Parser with template version 3.0.3", + "description": "Cloudflare Data Parser with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('parserObject1').parserVersion1]", @@ -5029,7 +6047,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCF Workbook with template version 3.0.3", + "description": "CloudflareCCF Workbook with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('workbookVersion1')]", @@ -5121,7 +6139,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFClientErrors_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFClientErrors_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject1').huntingQueryVersion1]", @@ -5206,7 +6224,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFClientTlsErrors_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFClientTlsErrors_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject2').huntingQueryVersion2]", @@ -5291,7 +6309,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFFilesRequested_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFFilesRequested_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject3').huntingQueryVersion3]", @@ -5376,7 +6394,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFRareUAs_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFRareUAs_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject4').huntingQueryVersion4]", @@ -5461,7 +6479,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFServerErrors_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFServerErrors_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject5').huntingQueryVersion5]", @@ -5546,7 +6564,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFServerTlsErrors_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFServerTlsErrors_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject6').huntingQueryVersion6]", @@ -5631,7 +6649,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFTopNetworkRules_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFTopNetworkRules_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject7').huntingQueryVersion7]", @@ -5716,7 +6734,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFTopWafRules_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFTopWafRules_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject8').huntingQueryVersion8]", @@ -5801,7 +6819,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFUnexpectedCountries_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFUnexpectedCountries_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject9').huntingQueryVersion9]", @@ -5886,7 +6904,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFUnexpectedEdgeResponse_HuntingQueries Hunting Query with template version 3.0.3", + "description": "CloudflareCCFUnexpectedEdgeResponse_HuntingQueries Hunting Query with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('huntingQueryObject10').huntingQueryVersion10]", @@ -5971,7 +6989,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFBadClientIp_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFBadClientIp_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject1').analyticRuleVersion1]", @@ -5999,10 +7017,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6014,22 +7032,22 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] }, { + "entityType": "URL", "fieldMappings": [ { "columnName": "CompleteUrl", "identifier": "Url" } - ], - "entityType": "URL" + ] } ] } @@ -6085,7 +7103,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFEmptyUA_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFEmptyUA_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject2').analyticRuleVersion2]", @@ -6113,10 +7131,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6128,13 +7146,13 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] } ] } @@ -6190,7 +7208,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFMultipleErrorsSource_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFMultipleErrorsSource_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject3').analyticRuleVersion3]", @@ -6218,10 +7236,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6233,13 +7251,13 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] } ] } @@ -6295,7 +7313,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFMultipleUAs_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFMultipleUAs_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject4').analyticRuleVersion4]", @@ -6323,10 +7341,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6338,13 +7356,13 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] } ] } @@ -6400,7 +7418,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFUnexpectedCountry_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFUnexpectedCountry_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject5').analyticRuleVersion5]", @@ -6428,10 +7446,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6443,22 +7461,22 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] }, { + "entityType": "URL", "fieldMappings": [ { "columnName": "CompleteUrl", "identifier": "Url" } - ], - "entityType": "URL" + ] } ] } @@ -6514,7 +7532,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFUnexpectedPost_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFUnexpectedPost_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject6').analyticRuleVersion6]", @@ -6542,10 +7560,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6558,13 +7576,13 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] } ] } @@ -6620,7 +7638,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFUnexpectedRequest_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFUnexpectedRequest_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject7').analyticRuleVersion7]", @@ -6648,10 +7666,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6663,13 +7681,13 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] } ] } @@ -6725,7 +7743,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFUnexpectedUrl_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFUnexpectedUrl_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject8').analyticRuleVersion8]", @@ -6753,10 +7771,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6768,13 +7786,13 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] } ] } @@ -6830,7 +7848,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFWafThreatAllowed_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFWafThreatAllowed_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject9').analyticRuleVersion9]", @@ -6858,10 +7876,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6873,22 +7891,22 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] }, { + "entityType": "URL", "fieldMappings": [ { "columnName": "CompleteUrl", "identifier": "Url" } - ], - "entityType": "URL" + ] } ] } @@ -6944,7 +7962,7 @@ "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]" ], "properties": { - "description": "CloudflareCCFXSSProbingPattern_AnalyticalRules Analytics Rule with template version 3.0.3", + "description": "CloudflareCCFXSSProbingPattern_AnalyticalRules Analytics Rule with template version 3.0.4", "mainTemplate": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "[variables('analyticRuleObject10').analyticRuleVersion10]", @@ -6972,10 +7990,10 @@ "status": "Available", "requiredDataConnectors": [ { - "connectorId": "CloudflareDataConnector", "dataTypes": [ "Cloudflare" - ] + ], + "connectorId": "CloudflareDataConnector" } ], "tactics": [ @@ -6987,22 +8005,22 @@ ], "entityMappings": [ { + "entityType": "IP", "fieldMappings": [ { "columnName": "SrcIpAddr", "identifier": "Address" } - ], - "entityType": "IP" + ] }, { + "entityType": "URL", "fieldMappings": [ { "columnName": "CompleteUrl", "identifier": "Url" } - ], - "entityType": "URL" + ] } ] } @@ -7054,12 +8072,12 @@ "apiVersion": "2023-04-01-preview", "location": "[parameters('workspace-location')]", "properties": { - "version": "3.0.3", + "version": "3.0.4", "kind": "Solution", "contentSchemaVersion": "3.0.0", "displayName": "Cloudflare CCF", "publisherDisplayName": "Cloudflare", - "descriptionHtml": "

Note: Please refer to the following before installing the solution:

\n

• Review the solution Release Notes

\n

• There may be known issues pertaining to this Solution, please refer to them before installing.

\n

The Cloudflare solution provides the capability to ingest Cloudflare logs into Microsoft Sentinel using the Codeless Connector Framework (CCF) and Azure Blob Storage. Refer to Cloudflare documentation for more information.

\n

Underlying Microsoft Technologies used:

\n
    \n
  1. Codeless Connector Framework

    \n
  2. \n
  3. Azure Monitor HTTP Data Collector API (for reference, legacy support)

    \n
  4. \n
\n

Data Connectors: 1, Parsers: 1, Workbooks: 1, Analytic Rules: 10, Hunting Queries: 10

\n

Learn more about Microsoft Sentinel | Learn more about Solutions

\n", + "descriptionHtml": "

Note: Please refer to the following before installing the solution:

\n

• Review the solution Release Notes

\n

• There may be known issues pertaining to this Solution, please refer to them before installing.

\n

The Cloudflare solution provides the capability to ingest Cloudflare logs into Microsoft Sentinel using the Codeless Connector Framework (CCF) and Azure Blob Storage. Refer to Cloudflare documentation for more information.

\n

Underlying Microsoft Technologies used:

\n
    \n
  1. Codeless Connector Framework

    \n
  2. \n
  3. Azure Monitor HTTP Data Collector API (for reference, legacy support)

    \n
  4. \n
\n

Data Connectors: 2, Parsers: 1, Workbooks: 1, Analytic Rules: 10, Hunting Queries: 10

\n

Learn more about Microsoft Sentinel | Learn more about Solutions

\n", "contentKind": "Solution", "contentProductId": "[variables('_solutioncontentProductId')]", "id": "[variables('_solutioncontentProductId')]", @@ -7089,6 +8107,11 @@ "contentId": "[variables('_dataConnectorContentIdConnections1')]", "version": "[variables('dataConnectorCCPVersion')]" }, + { + "kind": "DataConnector", + "contentId": "[variables('_dataConnectorContentIdConnections2')]", + "version": "[variables('dataConnectorCCPVersion')]" + }, { "kind": "Parser", "contentId": "[variables('parserObject1').parserContentId1]", diff --git a/Solutions/Cloudflare CCF/ReleaseNotes.md b/Solutions/Cloudflare CCF/ReleaseNotes.md index 0d24704af4b..15cbef202b2 100644 --- a/Solutions/Cloudflare CCF/ReleaseNotes.md +++ b/Solutions/Cloudflare CCF/ReleaseNotes.md @@ -1,5 +1,6 @@ | **Version** | **Date Modified (DD-MM-YYYY)** | **Change History** | |------------|-------------------------------|--------------------| +| 3.0.4 | 06-06-2026 | Added **CloudflareSecurityEvents** data connector for firewallEventsAdaptive via the Cloudflare GraphQL Analytics API | | 3.0.3 | 11-05-2026 | Modified workbook file and fixed workbook metadata to reference Cloudflare parser and CCF connector; added deployment prerequisites note to connector description | | 3.0.2 | 22-04-2026 | Fixed DCR transformKql for Type field and corrected invalid field data types | | 3.0.1 | 08-12-2025 | Fixed invalid GUIDs, updated analytic rules, aligned URL entity mappings with legacy Cloudflare solution | From a082ad98e052c9c0fd8c1867844fbefcd899a1eb Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 01:38:36 +0000 Subject: [PATCH 3/5] Fix DCR transform: bracket-quote reserved column names The transformKql failed to compile (InvalidTransformQuery) because the incoming column 'datetime' is parsed as the KQL datetime type keyword, and 'source' collides with the transform's implicit input table name. Reference all incoming columns with bracket notation (['datetime'], ['source'], ...) and use a single project to rename to the PascalCase table columns. --- .../CloudflareSecurityEvents_DCR.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json index bde2484e4aa..3ced76ed20a 100644 --- a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json +++ b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json @@ -164,7 +164,7 @@ "destinations": [ "clv2ws1" ], - "transformKql": "source\n| extend TimeGenerated = todatetime(datetime)\n| project-rename Action = action, Source = source, Kind = kind, Description = description, Ref = ref, RuleId = ruleId, RulesetId = rulesetId, MatchIndex = matchIndex, RayName = rayName, OriginatorRayName = originatorRayName, SampleInterval = sampleInterval, ClientIP = clientIP, ClientIPClass = clientIPClass, ClientAsn = clientAsn, ClientASNDescription = clientASNDescription, ClientCountryName = clientCountryName, ClientRequestHTTPHost = clientRequestHTTPHost, ClientRequestHTTPMethodName = clientRequestHTTPMethodName, ClientRequestHTTPProtocol = clientRequestHTTPProtocol, ClientRequestPath = clientRequestPath, ClientRequestQuery = clientRequestQuery, ClientRequestScheme = clientRequestScheme, ClientRefererHost = clientRefererHost, ClientRefererPath = clientRefererPath, ClientRefererQuery = clientRefererQuery, ClientRefererScheme = clientRefererScheme, UserAgent = userAgent, EdgeColoName = edgeColoName, EdgeResponseStatus = edgeResponseStatus, OriginResponseStatus = originResponseStatus, HttpApplicationVersion = httpApplicationVersion, ZoneTag = zoneTag, ZoneVersion = zoneVersion", + "transformKql": "source\n| project TimeGenerated = todatetime(['datetime'])\n , Action = ['action']\n , Source = ['source']\n , Kind = ['kind']\n , Description = ['description']\n , Ref = ['ref']\n , RuleId = ['ruleId']\n , RulesetId = ['rulesetId']\n , MatchIndex = ['matchIndex']\n , RayName = ['rayName']\n , OriginatorRayName = ['originatorRayName']\n , SampleInterval = ['sampleInterval']\n , ClientIP = ['clientIP']\n , ClientIPClass = ['clientIPClass']\n , ClientAsn = ['clientAsn']\n , ClientASNDescription = ['clientASNDescription']\n , ClientCountryName = ['clientCountryName']\n , ClientRequestHTTPHost = ['clientRequestHTTPHost']\n , ClientRequestHTTPMethodName = ['clientRequestHTTPMethodName']\n , ClientRequestHTTPProtocol = ['clientRequestHTTPProtocol']\n , ClientRequestPath = ['clientRequestPath']\n , ClientRequestQuery = ['clientRequestQuery']\n , ClientRequestScheme = ['clientRequestScheme']\n , ClientRefererHost = ['clientRefererHost']\n , ClientRefererPath = ['clientRefererPath']\n , ClientRefererQuery = ['clientRefererQuery']\n , ClientRefererScheme = ['clientRefererScheme']\n , UserAgent = ['userAgent']\n , EdgeColoName = ['edgeColoName']\n , EdgeResponseStatus = ['edgeResponseStatus']\n , OriginResponseStatus = ['originResponseStatus']\n , HttpApplicationVersion = ['httpApplicationVersion']\n , ZoneTag = ['zoneTag']\n , ZoneVersion = ['zoneVersion']", "outputStream": "Custom-CloudflareSecurityEvents_CL" } ] From b527533ee9519636b87072f9384b7c67e8db40fa Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 01:42:24 +0000 Subject: [PATCH 4/5] Fix packaged DCR transform (mainTemplate + 3.0.4.zip) Apply the same bracket-quoted column reference fix to the transformKql embedded in the packaged mainTemplate.json and 3.0.4.zip, so the deployed artifact matches the corrected DCR and the data collection rule compiles. --- Solutions/Cloudflare CCF/Package/3.0.4.zip | Bin 40682 -> 40821 bytes .../Cloudflare CCF/Package/mainTemplate.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Solutions/Cloudflare CCF/Package/3.0.4.zip b/Solutions/Cloudflare CCF/Package/3.0.4.zip index 85abf303c44d72ce4d1df709e4dff99dcaee2541..f5f5b5bb996f4f106a379730ab09b1af993b261e 100644 GIT binary patch delta 38078 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 delta 37968 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

#t2jUT$XajnR~st5$XB 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 Date: Fri, 12 Jun 2026 11:03:56 +0000 Subject: [PATCH 5/5] Clean up Cloudflare Security Events DCR using GraphQL field aliases Align with the project convention (PascalCase columns, simple transform) and remove the brittle bracket-quoted rename. - Do the camelCase->PascalCase mapping in the GraphQL query itself via field aliases (e.g. 'Action: action', 'TimeGenerated: datetime'), so the polled payload already uses the table's column names. - DCR stream now declares PascalCase columns (TimeGenerated typed datetime, which parses the ISO8601 value), so the transform collapses to 'source'. - This also sidesteps the KQL reserved-word collisions ('datetime', 'source') that forced the previous bracket-quoted project. Applied to the source files and the packaged mainTemplate.json / 3.0.4.zip. Verified the full aliased query against the live GraphQL API (HTTP 200, no errors, all 34 PascalCase fields returned). --- .../CloudflareSecurityEvents_DCR.json | 76 ++++++++--------- ...CloudflareSecurityEvents_PollerConfig.json | 2 +- Solutions/Cloudflare CCF/Package/3.0.4.zip | Bin 40821 -> 40659 bytes .../Cloudflare CCF/Package/mainTemplate.json | 80 +++++++++--------- 4 files changed, 79 insertions(+), 79 deletions(-) diff --git a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json index 3ced76ed20a..316900452d1 100644 --- a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json +++ b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_DCR.json @@ -10,140 +10,140 @@ "Custom-CloudflareSecurityEvents_CL": { "columns": [ { - "name": "action", + "name": "TimeGenerated", + "type": "datetime" + }, + { + "name": "Action", "type": "string" }, { - "name": "source", + "name": "Source", "type": "string" }, { - "name": "kind", + "name": "Kind", "type": "string" }, { - "name": "description", + "name": "Description", "type": "string" }, { - "name": "ref", + "name": "Ref", "type": "string" }, { - "name": "ruleId", + "name": "RuleId", "type": "string" }, { - "name": "rulesetId", + "name": "RulesetId", "type": "string" }, { - "name": "matchIndex", + "name": "MatchIndex", "type": "int" }, { - "name": "rayName", + "name": "RayName", "type": "string" }, { - "name": "originatorRayName", + "name": "OriginatorRayName", "type": "string" }, { - "name": "sampleInterval", + "name": "SampleInterval", "type": "int" }, { - "name": "clientIP", + "name": "ClientIP", "type": "string" }, { - "name": "clientIPClass", + "name": "ClientIPClass", "type": "string" }, { - "name": "clientAsn", + "name": "ClientAsn", "type": "string" }, { - "name": "clientASNDescription", + "name": "ClientASNDescription", "type": "string" }, { - "name": "clientCountryName", + "name": "ClientCountryName", "type": "string" }, { - "name": "clientRequestHTTPHost", + "name": "ClientRequestHTTPHost", "type": "string" }, { - "name": "clientRequestHTTPMethodName", + "name": "ClientRequestHTTPMethodName", "type": "string" }, { - "name": "clientRequestHTTPProtocol", + "name": "ClientRequestHTTPProtocol", "type": "string" }, { - "name": "clientRequestPath", + "name": "ClientRequestPath", "type": "string" }, { - "name": "clientRequestQuery", + "name": "ClientRequestQuery", "type": "string" }, { - "name": "clientRequestScheme", + "name": "ClientRequestScheme", "type": "string" }, { - "name": "clientRefererHost", + "name": "ClientRefererHost", "type": "string" }, { - "name": "clientRefererPath", + "name": "ClientRefererPath", "type": "string" }, { - "name": "clientRefererQuery", + "name": "ClientRefererQuery", "type": "string" }, { - "name": "clientRefererScheme", + "name": "ClientRefererScheme", "type": "string" }, { - "name": "userAgent", + "name": "UserAgent", "type": "string" }, { - "name": "edgeColoName", + "name": "EdgeColoName", "type": "string" }, { - "name": "edgeResponseStatus", + "name": "EdgeResponseStatus", "type": "int" }, { - "name": "originResponseStatus", + "name": "OriginResponseStatus", "type": "int" }, { - "name": "httpApplicationVersion", + "name": "HttpApplicationVersion", "type": "long" }, { - "name": "zoneTag", + "name": "ZoneTag", "type": "string" }, { - "name": "zoneVersion", + "name": "ZoneVersion", "type": "long" - }, - { - "name": "datetime", - "type": "string" } ] } @@ -164,7 +164,7 @@ "destinations": [ "clv2ws1" ], - "transformKql": "source\n| project TimeGenerated = todatetime(['datetime'])\n , Action = ['action']\n , Source = ['source']\n , Kind = ['kind']\n , Description = ['description']\n , Ref = ['ref']\n , RuleId = ['ruleId']\n , RulesetId = ['rulesetId']\n , MatchIndex = ['matchIndex']\n , RayName = ['rayName']\n , OriginatorRayName = ['originatorRayName']\n , SampleInterval = ['sampleInterval']\n , ClientIP = ['clientIP']\n , ClientIPClass = ['clientIPClass']\n , ClientAsn = ['clientAsn']\n , ClientASNDescription = ['clientASNDescription']\n , ClientCountryName = ['clientCountryName']\n , ClientRequestHTTPHost = ['clientRequestHTTPHost']\n , ClientRequestHTTPMethodName = ['clientRequestHTTPMethodName']\n , ClientRequestHTTPProtocol = ['clientRequestHTTPProtocol']\n , ClientRequestPath = ['clientRequestPath']\n , ClientRequestQuery = ['clientRequestQuery']\n , ClientRequestScheme = ['clientRequestScheme']\n , ClientRefererHost = ['clientRefererHost']\n , ClientRefererPath = ['clientRefererPath']\n , ClientRefererQuery = ['clientRefererQuery']\n , ClientRefererScheme = ['clientRefererScheme']\n , UserAgent = ['userAgent']\n , EdgeColoName = ['edgeColoName']\n , EdgeResponseStatus = ['edgeResponseStatus']\n , OriginResponseStatus = ['originResponseStatus']\n , HttpApplicationVersion = ['httpApplicationVersion']\n , ZoneTag = ['zoneTag']\n , ZoneVersion = ['zoneVersion']", + "transformKql": "source", "outputStream": "Custom-CloudflareSecurityEvents_CL" } ] diff --git a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json index fea5c770e27..03278ae8297 100644 --- a/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json +++ b/Solutions/Cloudflare CCF/Data Connectors/CloudflareSecurityEvents_CCF/CloudflareSecurityEvents_PollerConfig.json @@ -33,7 +33,7 @@ "User-Agent": "Scuba" }, "isPostPayloadJson": true, - "queryParametersTemplate": "[[concat('{\"query\":\"{ viewer { accounts(filter: {accountTag: \\\"', parameters('accountId'), '\\\"}) { firewallEventsAdaptive(filter: {datetime_geq: \\\"{_QueryWindowStartTime}\\\", datetime_leq: \\\"{_QueryWindowEndTime}\\\"}, limit: 10000, orderBy: [datetime_ASC]) { action source kind description ref ruleId rulesetId matchIndex rayName originatorRayName sampleInterval clientIP clientIPClass clientAsn clientASNDescription clientCountryName clientRequestHTTPHost clientRequestHTTPMethodName clientRequestHTTPProtocol clientRequestPath clientRequestQuery clientRequestScheme clientRefererHost clientRefererPath clientRefererQuery clientRefererScheme userAgent edgeColoName edgeResponseStatus originResponseStatus httpApplicationVersion zoneTag zoneVersion datetime } } } }\"}')]" + "queryParametersTemplate": "[[concat('{\"query\":\"{ viewer { accounts(filter: {accountTag: \\\"', parameters('accountId'), '\\\"}) { firewallEventsAdaptive(filter: {datetime_geq: \\\"{_QueryWindowStartTime}\\\", datetime_leq: \\\"{_QueryWindowEndTime}\\\"}, limit: 10000, orderBy: [datetime_ASC]) { TimeGenerated: datetime, Action: action, Source: source, Kind: kind, Description: description, Ref: ref, RuleId: ruleId, RulesetId: rulesetId, MatchIndex: matchIndex, RayName: rayName, OriginatorRayName: originatorRayName, SampleInterval: sampleInterval, ClientIP: clientIP, ClientIPClass: clientIPClass, ClientAsn: clientAsn, ClientASNDescription: clientASNDescription, ClientCountryName: clientCountryName, ClientRequestHTTPHost: clientRequestHTTPHost, ClientRequestHTTPMethodName: clientRequestHTTPMethodName, ClientRequestHTTPProtocol: clientRequestHTTPProtocol, ClientRequestPath: clientRequestPath, ClientRequestQuery: clientRequestQuery, ClientRequestScheme: clientRequestScheme, ClientRefererHost: clientRefererHost, ClientRefererPath: clientRefererPath, ClientRefererQuery: clientRefererQuery, ClientRefererScheme: clientRefererScheme, UserAgent: userAgent, EdgeColoName: edgeColoName, EdgeResponseStatus: edgeResponseStatus, OriginResponseStatus: originResponseStatus, HttpApplicationVersion: httpApplicationVersion, ZoneTag: zoneTag, ZoneVersion: zoneVersion } } } }\"}')]" }, "response": { "eventsJsonPaths": [ diff --git a/Solutions/Cloudflare CCF/Package/3.0.4.zip b/Solutions/Cloudflare CCF/Package/3.0.4.zip index f5f5b5bb996f4f106a379730ab09b1af993b261e..1bee5b4171b6e1fdb8cdd69fc8b687a4b3f2a1c4 100644 GIT binary patch delta 31855 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 zdNote: Please refer to the following before installing the solution:

\n

• Review the solution Release Notes

\n

• There may be known issues pertaining to this Solution, please refer to them before installing.

\n

The Cloudflare solution provides the capability to ingest Cloudflare logs into Microsoft Sentinel using the Codeless Connector Framework (CCF) and Azure Blob Storage. Refer to Cloudflare documentation for more information.

\n

Underlying Microsoft Technologies used:

\n
    \n
  1. Codeless Connector Framework

    \n
  2. \n
  3. Azure Monitor HTTP Data Collector API (for reference, legacy support)

    \n
  4. \n
\n

Data Connectors: 2, Parsers: 1, Workbooks: 1, Analytic Rules: 10, Hunting Queries: 10

\n

Learn more about Microsoft Sentinel | Learn more about Solutions

\n", + "descriptionHtml": "

Note: Please refer to the following before installing the solution:

\n

\u2022 Review the solution Release Notes

\n

\u2022 There may be known issues pertaining to this Solution, please refer to them before installing.

\n

The Cloudflare solution provides the capability to ingest Cloudflare logs into Microsoft Sentinel using the Codeless Connector Framework (CCF) and Azure Blob Storage. Refer to Cloudflare documentation for more information.

\n

Underlying Microsoft Technologies used:

\n
    \n
  1. Codeless Connector Framework

    \n
  2. \n
  3. Azure Monitor HTTP Data Collector API (for reference, legacy support)

    \n
  4. \n
\n

Data Connectors: 2, Parsers: 1, Workbooks: 1, Analytic Rules: 10, Hunting Queries: 10

\n

Learn more about Microsoft Sentinel | Learn more about Solutions

\n", "contentKind": "Solution", "contentProductId": "[variables('_solutioncontentProductId')]", "id": "[variables('_solutioncontentProductId')]",