diff --git a/Detections/Sample/RareOperations.json b/Detections/Sample/RareOperations.json new file mode 100644 index 000000000..6c3e94402 --- /dev/null +++ b/Detections/Sample/RareOperations.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "workspace": { + "type": "String" + }, + "analytic-id": { + "type": "string", + "defaultValue": "e6d09bf2-68fb-43b4-9782-e9af11b30675", + "minLength": 1, + "metadata": { + "description": "Unique id for the scheduled alert rule" + } + } + }, + "resources": [ + { + "type": "Microsoft.OperationalInsights/workspaces/providers/alertRules", + "name": "[concat(parameters(\u0027workspace\u0027),\u0027/Microsoft.SecurityInsights/\u0027,parameters(\u0027analytic-id\u0027))]", + "apiVersion": "2020-01-01", + "kind": "Scheduled", + "location": "[resourceGroup().location]", + "properties": { + "description": "This query looks for a few sensitive subscription-level events based on Azure Activity Logs.\n For example this monitors for the operation name \u0027Create or Update Snapshot\u0027 which is used for creating backups but could be misused by attackers\n to dump hashes or extract sensitive information from the disk.", + "displayName": "Rare subscription-level operations in Azure", + "enabled": false, + "query": "let starttime = 14d;\nlet endtime = 1d;\n// The number of operations below which an IP address is considered an unusual source of role assignment operations\nlet alertOperationThreshold = 5;\nlet SensitiveOperationList = dynamic([\"microsoft.compute/snapshots/write\", \"microsoft.network/networksecuritygroups/write\", \"microsoft.storage/storageaccounts/listkeys/action\"]);\nlet SensitiveActivity = AzureActivity\n| where OperationNameValue in~ (SensitiveOperationList) or OperationNameValue hassuffix \"listkeys/action\"\n| where ActivityStatusValue =~ \"Success\";\nSensitiveActivity\n| where TimeGenerated between (ago(starttime) .. ago(endtime))\n| summarize count() by CallerIpAddress, Caller, OperationNameValue\n| where count_ \u003e= alertOperationThreshold\n| join kind = rightanti (\nSensitiveActivity\n| where TimeGenerated \u003e= ago(endtime)\n| summarize StartTimeUtc = min(TimeGenerated), EndTimeUtc = max(TimeGenerated), ActivityTimeStamp = makelist(TimeGenerated), ActivityStatusValue = makelist(ActivityStatusValue),\nOperationIds = makelist(OperationId), CorrelationIds = makelist(CorrelationId), Resources = makelist(Resource), ResourceGroups = makelist(ResourceGroup), ResourceIds = makelist(ResourceId), ActivityCountByCallerIPAddress = count()\nby CallerIpAddress, Caller, OperationNameValue\n) on CallerIpAddress, Caller, OperationNameValue\n| extend timestamp = StartTimeUtc, AccountCustomEntity = Caller, IPCustomEntity = CallerIpAddress\n", + "queryFrequency": "P1D", + "queryPeriod": "P14D", + "severity": "Low", + "suppressionDuration": "PT1H", + "suppressionEnabled": false, + "triggerOperator": "GreaterThan", + "triggerThreshold": 0, + "tactics": [ + "CredentialAccess", + "Persistence" + ] + } + } + ] +}