manifests/collectors/Networking/AzureFirewall.psd1

#
# GENERATED by scripts/ConvertTo-ScoutCollectorDefinition.ps1 from Modules/Public/InventoryModules/Networking/AzureFirewall.ps1 (AB#5660).
# Field expressions are copied verbatim from the original collector and evaluate in an
# equivalent scope -- see docs/design/decisions/declarative-collectors.md.
# Review before trusting; regenerate rather than hand-patch if the source collector changes.
#
@{
    ResourceTypes = @(
        'microsoft.network/azurefirewalls'
    )

    ResourceTypeMatching = 'Grouped'

    AdditionalFilter = $null

    FilterPreamble = ''

    RowLoopVariable = '1'

    SetupPreamble = @'
$AzureFirewall = $Resources | Where-Object { $_.TYPE -eq 'microsoft.network/azurefirewalls' }
    $AzureFWPolicies = $Resources | Where-Object { $_.TYPE -eq 'microsoft.network/firewallpolicies' }
    $AzureFWPoliciesRules = $Resources | Where-Object { $_.TYPE -eq 'microsoft.network/firewallpolicies/rulecollectiongroups' }
    $AzureIPGroups = $Resources | Where-Object { $_.TYPE -eq 'microsoft.network/ipgroups' }
'@


    SetupVariables = @(
        'AzureFirewall'
        'AzureFWPolicies'
        'AzureFWPoliciesRules'
        'AzureIPGroups'
    )

    Preamble = @'
$sub1 = $SUB | Where-Object { $_.Id -eq $1.subscriptionId }
                    $data = $1.PROPERTIES
                    if ($1.zones) { $Zones = $1.zones } Else { $Zones = "Not Configured" }
                    $Retired = Foreach ($Retirement in $Retirements)
                    {
                        if ($Retirement.id -eq $1.id) { $Retirement }
                    }
                    if ($Retired)
                        {
                            $RetiredFeature = foreach ($Retire in $Retired)
                                {
                                    $RetiredServiceID = $Unsupported | Where-Object {$_.Id -eq $Retired.ServiceID}
                                    $tmp0 = [pscustomobject]@{
                                            'RetiredFeature' = $RetiredServiceID.RetiringFeature
                                            'RetiredDate' = $RetiredServiceID.RetirementDate
                                        }
                                    $tmp0
                                }
                            $RetiringFeature = if (@($RetiredFeature.RetiredFeature).count -gt 1) { $RetiredFeature.RetiredFeature | ForEach-Object { $_ + ' ,' } }else { $RetiredFeature.RetiredFeature}
                            $RetiringFeature = [string]$RetiringFeature
                            $RetiringFeature = if ($RetiringFeature -like '* ,*') { $RetiringFeature -replace ".$" }else { $RetiringFeature }
 
                            $RetiringDate = if (@($RetiredFeature.RetiredDate).count -gt 1) { $RetiredFeature.RetiredDate | ForEach-Object { $_ + ' ,' } }else { $RetiredFeature.RetiredDate}
                            $RetiringDate = [string]$RetiringDate
                            $RetiringDate = if ($RetiringDate -like '* ,*') { $RetiringDate -replace ".$" }else { $RetiringDate }
                        }
                    else
                        {
                            $RetiringFeature = $null
                            $RetiringDate = $null
                        }
                    $Threat = if($data.threatintelmode -eq 'deny'){'Alert and deny'}elseif($data.threatintelmode -eq 'alert'){'Alert only'}else{'Off'}
                    $Tags = if(![string]::IsNullOrEmpty($1.tags.psobject.properties)){$1.tags.psobject.properties}else{'0'}
                     
                    $VNETs = @()
                    $PIPs = @()
                    $PrivIPs = @()
                    Foreach($2 in $data.ipConfigurations)
                        {
                            $PIPs += $2.name
                            $VNETs += if(![string]::IsNullOrEmpty($2.properties.subnet.id)){$2.properties.subnet.id.split('/')[8]}else{$null}
                            $PrivIPs += $2.properties.privateIPAddress
                        }
                     
                    $Policy = $AzureFWPolicies | Where-Object {$_.id -eq $data.firewallpolicy.id}
                    $Policy = if(![string]::IsNullOrEmpty($Policy)){$Policy}else{'0'}
                    $Rules = $AzureFWPoliciesRules | Where-Object {$_.id -eq $Policy.properties.rulecollectiongroups.id}
                    $Rules = if(![string]::IsNullOrEmpty($Rules)){$Rules}else{'0'}
                    $FinalPIP = if ($PIPs.count -gt 1) { $PIPs | ForEach-Object { $_ + ' ,' } }else { $PIPs }
                    $FinalPIP = [string]$FinalPIP
                    $FinalPIP = if ($FinalPIP -like '* ,*') { $FinalPIP -replace ".$" }else { $FinalPIP }
                    $FinalVNET = if ($VNETs.count -gt 1) { $VNETs | ForEach-Object { $_ + ' ,' } }else { $VNETs }
                    $FinalVNET = [string]$FinalVNET
                    $FinalVNET = if ($FinalVNET -like '* ,*') { $FinalVNET -replace ".$" }else { $FinalVNET }
                    $FinalPrivIP = if ($PrivIPs.count -gt 1) { $PrivIPs | ForEach-Object { $_ + ' ,' } }else { $PrivIPs }
                    $FinalPrivIP = [string]$FinalPrivIP
                    $FinalPrivIP = if ($FinalPrivIP -like '* ,*') { $FinalPrivIP -replace ".$" }else { $FinalPrivIP }
                    $FinalDNSServers = if (@($Policy.properties.dnssettings.servers).count -gt 1) { $Policy.properties.dnssettings.servers | ForEach-Object { $_ + ' ,' } }else { $Policy.properties.dnssettings.servers }
                    $FinalDNSServers = [string]$FinalDNSServers
                    $FinalDNSServers = if ($FinalDNSServers -like '* ,*') { $FinalDNSServers -replace ".$" }else { $FinalDNSServers }
'@


    AdditionalRowLoops = @(
        @{
            Variable = 'CoreRule'
            Source = '$Rules'
            Preamble = @'
$CoreCollections = $CoreRule.properties.rulecollections
                            $CoreCollections = if(![string]::IsNullOrEmpty($CoreCollections)){$CoreCollections}else{'0'}
'@

        }
        @{
            Variable = 'RuleCollection'
            Source = '$CoreCollections'
            Preamble = @'
$RuleCoreCollections = $RuleCollection.rules
                                    $RuleCoreCollections = if(![string]::IsNullOrEmpty($RuleCoreCollections)){$RuleCoreCollections}else{'0'}
'@

        }
        @{
            Variable = 'Rule'
            Source = '$RuleCoreCollections'
            Preamble = @'
$FinalProtocol = if (@($Rule.ipprotocols).count -gt 1) { $Rule.ipprotocols | ForEach-Object { $_ + ' ,' } }else { $Rule.ipprotocols}
                                            $FinalProtocol = [string]$FinalProtocol
                                            $FinalProtocol = if ($FinalProtocol -like '* ,*') { $FinalProtocol -replace ".$" }else { $FinalProtocol }
 
                                            $FinalPort = if (@($Rule.destinationports).count -gt 1) { $Rule.destinationports | ForEach-Object { $_ + ' ,' } }else { $Rule.destinationports}
                                            $FinalPort = [string]$FinalPort
                                            $FinalPort = if ($FinalPort -like '* ,*') { $FinalPort -replace ".$" }else { $FinalPort }
 
                                            if(![string]::IsNullOrEmpty($Rule.sourceipgroups))
                                                {
                                                    $SourceIpGroup = ($AzureIPGroups | Where-Object {$_.id -eq $Rule.sourceipgroups}).properties.ipaddresses
                                                    $SourceIP = if (@($SourceIpGroup).count -gt 1) { $SourceIpGroup | ForEach-Object { $_ + ' ,' } }else { $SourceIpGroup }
                                                    $SourceIP = [string]$SourceIP
                                                    $SourceIP = if ($SourceIP -like '* ,*') { $SourceIP -replace ".$" }else { $SourceIP }
                                                    $SourceType = 'IP Group'
                                                }
                                            else
                                                {
                                                    $SourceIP = [string]$Rule.sourceaddresses
                                                    $SourceType = 'IP Address'
                                                }
 
                                            if(![string]::IsNullOrEmpty($Rule.destinationipgroups))
                                                {
                                                    $DestinationIpGroup = ($AzureIPGroups | Where-Object {$_.id -eq $Rule.destinationipgroups}).properties.ipaddresses
                                                    $DestinationIP = if (@($DestinationIpGroup).count -gt 1) { $DestinationIpGroup | ForEach-Object { $_ + ' ,' } }else { $DestinationIpGroup }
                                                    $DestinationIP = [string]$DestinationIP
                                                    $DestinationIP = if ($DestinationIP -like '* ,*') { $DestinationIP -replace ".$" }else { $DestinationIP }
                                                    $DestionationType = 'IP Group'
                                                }
                                            elseif(![string]::IsNullOrEmpty($Rule.destinationfqdns))
                                                {
                                                    $DestinationIP = [string]$Rule.destinationfqdns
                                                    $DestionationType = 'FQDN'
                                                }
                                            else
                                                {
                                                    $DestinationIP = [string]$Rule.destinationaddresses
                                                    $DestionationType = 'IP Address'
                                                }
'@

        }
    )

    TagLoop = @{
        Variable = 'Tag'
        Source = '$Tags'
        Preamble = ''
    }

    Fields = @(
        @{
            Name = 'ID'
            Expression = '$1.id'
        }
        @{
            Name = 'Subscription'
            Expression = '$sub1.Name'
        }
        @{
            Name = 'Resource Group'
            Expression = '$1.RESOURCEGROUP'
        }
        @{
            Name = 'Name'
            Expression = '$1.NAME'
        }
        @{
            Name = 'Location'
            Expression = '$1.LOCATION'
        }
        @{
            Name = 'SKU'
            Expression = '$data.sku.tier'
        }
        @{
            Name = 'Retiring Feature'
            Expression = '$RetiringFeature'
        }
        @{
            Name = 'Retiring Date'
            Expression = '$RetiringDate'
        }
        @{
            Name = 'Threat Intel Mode'
            Expression = '$Threat'
        }
        @{
            Name = 'Zone'
            Expression = '[string]$Zones'
        }
        @{
            Name = 'Public IP Name'
            Expression = '$FinalPIP'
        }
        @{
            Name = 'Firewall VNET'
            Expression = '$FinalVNET'
        }
        @{
            Name = 'Firewall Private IP'
            Expression = '$FinalPrivIP'
        }
        @{
            Name = 'Policy Name'
            Expression = '$Policy.name'
        }
        @{
            Name = 'DNS Proxy'
            Expression = '$Policy.properties.dnssettings.enableproxy'
        }
        @{
            Name = 'DNS Servers'
            Expression = '$FinalDNSServers'
        }
        @{
            Name = 'Rule Collection Group'
            Expression = '$CoreRule.name'
        }
        @{
            Name = 'Rule Collection Group Priority'
            Expression = '$CoreRule.properties.priority'
        }
        @{
            Name = 'Rule Collection'
            Expression = '$RuleCollection.name'
        }
        @{
            Name = 'Rule Action'
            Expression = '$RuleCollection.action.type'
        }
        @{
            Name = 'Rule Priority'
            Expression = '$RuleCollection.priority'
        }
        @{
            Name = 'Rule Type'
            Expression = '$Rule.ruletype'
        }
        @{
            Name = 'Rule Name'
            Expression = '$Rule.name'
        }
        @{
            Name = 'Source Type'
            Expression = '$SourceType'
        }
        @{
            Name = 'Source'
            Expression = '$SourceIP'
        }
        @{
            Name = 'Protocol'
            Expression = '$FinalProtocol'
        }
        @{
            Name = 'Destination Port'
            Expression = '$FinalPort'
        }
        @{
            Name = 'Destination Type'
            Expression = '$DestionationType'
        }
        @{
            Name = 'Destination'
            Expression = '$DestinationIP'
        }
        @{
            Name = 'Resource U'
            Expression = '$ResUCount'
        }
        @{
            Name = 'Tag Name'
            Expression = '[string]$Tag.Name'
        }
        @{
            Name = 'Tag Value'
            Expression = '[string]$Tag.Value'
        }
    )

    Export = @{
        WorksheetName = 'Azure Firewall'
        TableNamePrefix = 'AzFirewallTable_'
        Columns = @(
            'Subscription'
            'Resource Group'
            'Name'
            'Location'
            'SKU'
            'Retiring Feature'
            'Retiring Date'
            'Threat Intel Mode'
            'Zone'
            'Public IP Name'
            'Firewall VNET'
            'Firewall Private IP'
            'Policy Name'
            'DNS Proxy'
            'DNS Servers'
            'Rule Collection Group'
            'Rule Collection Group Priority'
            'Rule Collection'
            'Rule Action'
            'Rule Priority'
            'Rule Type'
            'Rule Name'
            'Source Type'
            'Source'
            'Protocol'
            'Destination Port'
            'Destination Type'
            'Destination'
            'Resource U'
        )
        TagColumns = @(
            'Tag Name'
            'Tag Value'
        )
        TagColumnsBefore = 'Resource U'
        NumberFormat = '0'
        ConditionalText = @(
            'New-ConditionalText -Range F2:F100 -ConditionalType ContainsText'
        )
    }

    SourceCollector = 'Modules/Public/InventoryModules/Networking/AzureFirewall.ps1'
}