Analytic rule catalog
PCI App with Open Findings Before Audit Window
Back
| Id | 0457b577-3864-42c9-9779-1c9441d86429 |
| Rulename | PCI App with Open Findings Before Audit Window |
| Description | Detects PCI-scoped applications with open Critical/High findings when an upcoming PCI-DSS audit is within 30 days. Correlates PCIApplications and AuditCalendar watchlists to surface compliance risk before audit deadlines. |
| Severity | High |
| Tactics | Impact |
| Techniques | T1485 |
| Required data connectors | StratoSecurePush |
| Kind | Scheduled |
| Query frequency | 1d |
| Query period | 1455m |
| Trigger threshold | 0 |
| Trigger operator | gt |
| Source Uri | https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/StratoSecure/Analytic%20Rules/S11_PCI_AuditWindow.yaml |
| Version | 1.0.0 |
| Arm template | 0457b577-3864-42c9-9779-1c9441d86429.json |
let auditWindowDays = 30;
let PCIApps = _GetWatchlist("PCIApplications")
| project WL_ApplicationId = column_ifexists("ApplicationId", ""),
WL_AppName = column_ifexists("AppName", ""),
WL_AuditDate = column_ifexists("AuditDate", ""),
WL_Owner = column_ifexists("Owner", "");
let AuditCalendar = _GetWatchlist("AuditCalendar")
| where column_ifexists("Framework", "") =~ "PCI-DSS"
| extend UpcomingAudit = todatetime(column_ifexists("AuditDate", ""))
| where UpcomingAudit between (now() .. now() + auditWindowDays * 1d)
| project WL_Cal_ApplicationId = column_ifexists("ApplicationId", ""),
Framework = column_ifexists("Framework", ""), UpcomingAudit;
StratoSecure_Findings_CL
| where FixStatus =~ "open"
| where Severity in ("Critical", "High")
| join kind=inner PCIApps on $left.ApplicationId == $right.WL_ApplicationId
| join kind=inner AuditCalendar on $left.ApplicationId == $right.WL_Cal_ApplicationId
| summarize TotalOpenFindings = count(), MaxSeverityInt = max(SeverityInt),
RuleIds = make_set(RuleId, 20), EndTime = max(TimeGenerated)
by ApplicationId, WL_AppName, WL_Owner, Framework, UpcomingAudit, StraTenantId
| extend MaxSeverity = case(
MaxSeverityInt >= 9, "Critical",
MaxSeverityInt >= 7, "High",
MaxSeverityInt >= 4, "Medium",
"Low")
| project TimeGenerated = EndTime, ApplicationId, AppName = WL_AppName, Owner = WL_Owner,
StraTenantId, Framework, UpcomingAudit, TotalOpenFindings, MaxSeverity, RuleIds
name: PCI App with Open Findings Before Audit Window
triggerOperator: gt
query: |
let auditWindowDays = 30;
let PCIApps = _GetWatchlist("PCIApplications")
| project WL_ApplicationId = column_ifexists("ApplicationId", ""),
WL_AppName = column_ifexists("AppName", ""),
WL_AuditDate = column_ifexists("AuditDate", ""),
WL_Owner = column_ifexists("Owner", "");
let AuditCalendar = _GetWatchlist("AuditCalendar")
| where column_ifexists("Framework", "") =~ "PCI-DSS"
| extend UpcomingAudit = todatetime(column_ifexists("AuditDate", ""))
| where UpcomingAudit between (now() .. now() + auditWindowDays * 1d)
| project WL_Cal_ApplicationId = column_ifexists("ApplicationId", ""),
Framework = column_ifexists("Framework", ""), UpcomingAudit;
StratoSecure_Findings_CL
| where FixStatus =~ "open"
| where Severity in ("Critical", "High")
| join kind=inner PCIApps on $left.ApplicationId == $right.WL_ApplicationId
| join kind=inner AuditCalendar on $left.ApplicationId == $right.WL_Cal_ApplicationId
| summarize TotalOpenFindings = count(), MaxSeverityInt = max(SeverityInt),
RuleIds = make_set(RuleId, 20), EndTime = max(TimeGenerated)
by ApplicationId, WL_AppName, WL_Owner, Framework, UpcomingAudit, StraTenantId
| extend MaxSeverity = case(
MaxSeverityInt >= 9, "Critical",
MaxSeverityInt >= 7, "High",
MaxSeverityInt >= 4, "Medium",
"Low")
| project TimeGenerated = EndTime, ApplicationId, AppName = WL_AppName, Owner = WL_Owner,
StraTenantId, Framework, UpcomingAudit, TotalOpenFindings, MaxSeverity, RuleIds
queryFrequency: 1d
description: |
Detects PCI-scoped applications with open Critical/High findings when an
upcoming PCI-DSS audit is within 30 days. Correlates PCIApplications and
AuditCalendar watchlists to surface compliance risk before audit deadlines.
id: 0457b577-3864-42c9-9779-1c9441d86429
triggerThreshold: 0
queryPeriod: 1455m
version: 1.0.0
kind: Scheduled
status: Available
severity: High
requiredDataConnectors:
- connectorId: StratoSecurePush
dataTypes:
- StratoSecure_Findings_CL
OriginalUri: https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/StratoSecure/Analytic%20Rules/S11_PCI_AuditWindow.yaml
relevantTechniques:
- T1485
tactics:
- Impact
entityMappings:
- fieldMappings:
- identifier: AppId
columnName: ApplicationId
entityType: CloudApplication
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"workspace": {
"type": "String"
}
},
"resources": [
{
"apiVersion": "2024-01-01-preview",
"id": "[concat(resourceId('Microsoft.OperationalInsights/workspaces/providers', parameters('workspace'), 'Microsoft.SecurityInsights'),'/alertRules/0457b577-3864-42c9-9779-1c9441d86429')]",
"kind": "Scheduled",
"name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/0457b577-3864-42c9-9779-1c9441d86429')]",
"properties": {
"alertRuleTemplateName": "0457b577-3864-42c9-9779-1c9441d86429",
"customDetails": null,
"description": "Detects PCI-scoped applications with open Critical/High findings when an\nupcoming PCI-DSS audit is within 30 days. Correlates PCIApplications and\nAuditCalendar watchlists to surface compliance risk before audit deadlines.\n",
"displayName": "PCI App with Open Findings Before Audit Window",
"enabled": true,
"entityMappings": [
{
"entityType": "CloudApplication",
"fieldMappings": [
{
"columnName": "ApplicationId",
"identifier": "AppId"
}
]
}
],
"OriginalUri": "https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/StratoSecure/Analytic%20Rules/S11_PCI_AuditWindow.yaml",
"query": "let auditWindowDays = 30;\nlet PCIApps = _GetWatchlist(\"PCIApplications\")\n | project WL_ApplicationId = column_ifexists(\"ApplicationId\", \"\"),\n WL_AppName = column_ifexists(\"AppName\", \"\"),\n WL_AuditDate = column_ifexists(\"AuditDate\", \"\"),\n WL_Owner = column_ifexists(\"Owner\", \"\");\nlet AuditCalendar = _GetWatchlist(\"AuditCalendar\")\n | where column_ifexists(\"Framework\", \"\") =~ \"PCI-DSS\"\n | extend UpcomingAudit = todatetime(column_ifexists(\"AuditDate\", \"\"))\n | where UpcomingAudit between (now() .. now() + auditWindowDays * 1d)\n | project WL_Cal_ApplicationId = column_ifexists(\"ApplicationId\", \"\"),\n Framework = column_ifexists(\"Framework\", \"\"), UpcomingAudit;\nStratoSecure_Findings_CL\n | where FixStatus =~ \"open\"\n | where Severity in (\"Critical\", \"High\")\n | join kind=inner PCIApps on $left.ApplicationId == $right.WL_ApplicationId\n | join kind=inner AuditCalendar on $left.ApplicationId == $right.WL_Cal_ApplicationId\n | summarize TotalOpenFindings = count(), MaxSeverityInt = max(SeverityInt),\n RuleIds = make_set(RuleId, 20), EndTime = max(TimeGenerated)\n by ApplicationId, WL_AppName, WL_Owner, Framework, UpcomingAudit, StraTenantId\n | extend MaxSeverity = case(\n MaxSeverityInt >= 9, \"Critical\",\n MaxSeverityInt >= 7, \"High\",\n MaxSeverityInt >= 4, \"Medium\",\n \"Low\")\n | project TimeGenerated = EndTime, ApplicationId, AppName = WL_AppName, Owner = WL_Owner,\n StraTenantId, Framework, UpcomingAudit, TotalOpenFindings, MaxSeverity, RuleIds\n",
"queryFrequency": "P1D",
"queryPeriod": "PT1455M",
"severity": "High",
"status": "Available",
"subTechniques": [],
"suppressionDuration": "PT1H",
"suppressionEnabled": false,
"tactics": [
"Impact"
],
"techniques": [
"T1485"
],
"templateVersion": "1.0.0",
"triggerOperator": "GreaterThan",
"triggerThreshold": 0
},
"type": "Microsoft.OperationalInsights/workspaces/providers/alertRules"
}
]
}