Оптимизировать скрипт Powershell для Azure NSG - PullRequest
1 голос
/ 13 апреля 2020

У меня есть скрипт для поиска всех входящих, разрешить правила в Azure NSG, источник которого любой. Он выполняет свою работу, но требуется огромное количество времени, чтобы перебрать каждое правило в каждом доступном NSG в Azure.

Вопрос в том, есть ли способ его оптимизировать, поэтому это может работать быстрее? Спасибо!

function nsg {

# List of default rules which are skipped

$array =
'Default rules'

# Get all RG with NSG

$RGS = (Get-AzureRmResource -ODataQuery "`$filter=resourcetype eq 'Microsoft.Network/networkSecurityGroups'").ResourceGroupName | Sort-Object -Unique

foreach ($RG in $RGS) { 

# List of all NSG names

$NSG_Names = (Get-AzureRmNetworkSecurityGroup -ResourceGroupName $RG).Name

# Get NSG rules

foreach ($NSG_Name in $NSG_Names){

$Rules = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG | Get-AzureRmNetworkSecurityRuleConfig | Select-Object -ExpandProperty Name

# Check if rule is not default

foreach ($Rule in $Rules){

    if ($array.contains($Rule)){

    Write-Verbose "$Rule excluded because it is default!"

    }
else {

    Write-Verbose "$NSG_Name - $Rule"

    #$DestinationAddressPrefix = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG | Get-AzureRmNetworkSecurityRuleConfig -Name $Rule | Select-Object -ExpandProperty DestinationAddressPrefix
    $DestinationPortRange = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG | Get-AzureRmNetworkSecurityRuleConfig -Name $Rule | Select-Object -ExpandProperty DestinationPortRange
    $SourceAddrPref = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG | Get-AzureRmNetworkSecurityRuleConfig -Name $Rule | Select-Object -ExpandProperty SourceAddressPrefix
    $SourcePortRange = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG | Get-AzureRmNetworkSecurityRuleConfig -Name $Rule | Select-Object -ExpandProperty SourcePortRange
    $Access = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG | Get-AzureRmNetworkSecurityRuleConfig -Name $Rule | Select-Object -ExpandProperty Access
    $Direction = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG | Get-AzureRmNetworkSecurityRuleConfig -Name $Rule | Select-Object -ExpandProperty Direction

# Chek rule for every criterion, access type, etc.

    if ($Direction -eq "Inbound" -and $SourceAddrPref -eq "*" -and $Access -eq "Allow"){ #-and $DestinationAddressPrefix -eq "*" -and $DestinationPortRange -eq "*") {

       $message = "Warning! RG: $RG; NSG: $NSG_Name has SOURCE ANY Rule: $Rule to Destionation Port: $DestinationPortRange"
       $message

}}}}}}

1 Ответ

1 голос
/ 13 апреля 2020

Я не думаю, что вам нужно повторять все эти данные. Все эти вложенные циклы + сортировка - вот что вызывает замедление.

Мне кажется, что вы просто хотите вывести все ваши NSG с направлением Inbound, и доступ равен Allow, а префикс адреса источника - *. Если это так, вы можете сделать это:

$nsgs = Get-AzureRmNetworkSecurityGroup

foreach ($nsg in $nsgs.SecurityRules)
{
    if ($nsg.Direction -eq "Inbound" -and $nsg.Access -eq "Allow" -and $nsg.SourceAddressPrefix -eq "*")
    {
        $nsg
    }
}

Здесь мы просто повторяем правила безопасности, которые вы сделали из $nsgs.SecurityRules. Значения по умолчанию $nsgs.DefaultSecurityRules. Вы можете направить трубку к Get-Member, чтобы найти эти свойства.

...