Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/powershell/tests/Test-Assessment.25537.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Azure Firewall Threat intelligence-based filtering alerts and denies traffic from/to known malicious IP addresses, FQDNs, and URLs. The IP addresses, domains, and URLs are sourced from the Microsoft Threat Intelligence feed, which includes multiple sources including the Microsoft Cyber Security team. When threat intelligence-based filtering is enabled, Azure Firewall evaluates traffic against the threat intelligence rules before applying NAT, network, or application rules.

This check verifies that Threat Intelligence feature is enabled in “Alert and Deny” mode in the Azure Firewall policy configuration. The check will fail if Threat Intelligence is either “Disabled” or if it is not configured in “Alert and Deny” mode, in the firewall policy attached to the firewall.

**Remediation action**

Please check this article for guidance on how to enable Threat Intelligence in “Alert and Deny” mode in the Azure Firewall Policy:
- [Azure Firewall threat intelligence configuration | Microsoft Learn](https://learn.microsoft.com/en-us/azure/firewall-manager/threat-intelligence-settings)

<!--- Results --->
%TestResult%
140 changes: 140 additions & 0 deletions src/powershell/tests/Test-Assessment.25537.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
<#
.SYNOPSIS
Validates Threat intelligence is Enabled in Deny Mode on Azure Firewall.
.DESCRIPTION
This test validates that Azure Firewall Policies have Threat Intelligence enabled in Deny mode.
Checks all firewall policies in the subscription and reports their threat intelligence status.
.NOTES
Test ID: 25537
Category: Azure Network Security
Required API: Azure Firewall Policies
#>

function Test-Assessment-25537 {
[ZtTest(
Category = 'Azure Network Security',
ImplementationCost = 'Low',
MinimumLicense = ('Azure_Firewall_Standard', 'Azure_Firewall_Premium'),
Pillar = 'Network',
RiskLevel = 'High',
SfiPillar = 'Protect networks',
TenantType = ('Workforce'),
TestId = 25537,
Title = 'Threat intelligence is Enabled in Deny Mode on Azure Firewall',
UserImpact = 'Low'
)]
[CmdletBinding()]
param()

Write-PSFMessage '🟦 Start' -Tag Test -Level VeryVerbose

#region Data Collection
Write-ZtProgress `
-Activity 'Azure Firewall Threat Intelligence' `
-Status 'Enumerating Firewall Policies'

$subscriptions = Get-AzSubscription
$results = @()
foreach ($sub in $subscriptions) {
Set-AzContext -SubscriptionId $sub.Id | Out-Null
# Get all firewall policies in the subscription
$policies = Get-AzResource -ResourceType 'Microsoft.Network/firewallPolicies' -ErrorAction Stop

if (-not $policies) {
continue
}

#endregion Data Collection
#region Assessment Logic

foreach ($policyResource in $policies) {
$policy = Get-AzFirewallPolicy `
-Name $policyResource.Name `
-ResourceGroupName $policyResource.ResourceGroupName `
-ErrorAction SilentlyContinue

if (-not $policy) {
continue
}

$subContext = Get-AzContext
$status = if ($policy.ThreatIntelMode -eq 'Deny') {
'Pass'
}
else {
'Fail'
}

$results += [PSCustomObject]@{
CheckName = 'Threat intelligence is Enabled in Deny Mode on Azure Firewall'
PolicyName = $policy.Name
ResourceGroup = $policy.ResourceGroupName
SubscriptionName = $subContext.Subscription.Name
SubscriptionId = $subContext.Subscription.Id
ThreatIntelMode = $policy.ThreatIntelMode
Status = $status
}
}
}
#endregion Assessment Logic

#region Assessment Logic Evaluation
if (-not $results) {
Write-PSFMessage 'No Azure Firewall policies found. Skipping test.' -Tag Firewall -Level Verbose
return
}
else {
$allModes = $results.ThreatIntelMode
$uniqueModes = $allModes | Select-Object -Unique

if ($uniqueModes.Count -eq 1 -and $uniqueModes -eq 'Deny') {

$passed = $true
$testResultMarkdown = 'Threat Intel is enabled in **Alert and Deny** mode.'

}
else {

$passed = $false

if ($uniqueModes.Count -eq 1) {

switch ($uniqueModes) {
'Alert' {
$testResultMarkdown = 'Threat Intel is enabled in **Alert** mode.'
}
'Off' {
$testResultMarkdown = 'Threat Intel is **disabled**.'
}
default {
$testResultMarkdown = 'Threat Intel is not enabled in **Alert and Deny** mode for all Firewall policies.'
}
}
}
else {
$testResultMarkdown = 'Threat Intel is not enabled in **Alert and Deny** mode for all Firewall policies.'
}
}

# --- Markdown Table ---
$mdInfo = "`n`n## Firewall Policies`n`n"
$mdInfo += "| Check name | Policy name | Subscription name | Subscription id | Threat Intel Mode |`n"
$mdInfo += "| :--- | :--- | :--- | :--- | :---: |`n"

foreach ($item in $results | Sort-Object PolicyName) {
$mdInfo += "| $($item.CheckName) | $($item.PolicyName) | $($item.SubscriptionName) | $($item.SubscriptionId) | $($item.ThreatIntelMode) |`n"
}

$testResultMarkdown += $mdInfo

#endregion Assessment Logic Evaluation

#region Report Generation
Add-ZtTestResultDetail `
-TestId '25537' `
-Title 'Azure Firewall Threat Intelligence is enabled in Alert and Deny mode' `
-Status $passed `
-Result $testResultMarkdown
#endregion Report Generation
}
}