SourceAddressPrefix существующих правил группы безопасности сети ARM является логическим?

Я пытаюсь прочитать существующие правила в группе сетевой безопасности в режиме ARM, но, как ни странно, свойство SourceAddressPrefix - то, которое содержит информацию о диапазоне IP-адресов в белом списке, - сообщает как логическое значение (например, «True» или «False» ) в строковой форме.

Я попытался получить группу с помощью Get-AzureRmNetworkSecurityGroup и прочитать свойство ::SecurityRules, а также пробовал $nsg | Get-AzureRmNetworkSecurityRuleConfig, а также $nsg | Get-AzureRmNetworkSecurityRuleConfig -Name MyRule. В каждом случае SourceAddressPrefix возвращенных правил либо «Истина», либо «Ложь».

Без этого значения я не могу сказать, существует ли уже правило для проверяемого IP-адреса. Система позволяет мне устанавливать несколько правил с одними и теми же деталями, если их имя и приоритет разные, поэтому сейчас я создаю дубликаты.

Полагаю, это какая-то «функция» безопасности? Есть ли способ получить фактические диапазоны IP CIDR, отображаемые на портале?

ИЗМЕНИТЬ - В связи с этим я публикую полный код

Код захватывает IP-адреса, назначенные всем сетевым адаптерам в $proxyResGrp, и пытается занести их в белый список в исходных группах ресурсов для портов 80 и 443.

proxyResGrp = "arr"
originResGrps = "int", "uat", "auth", "live"

elect-AzureRmSubscription -SubscriptionID $subscriptionId -ErrorAction SilentlyContinue -ErrorVariable err | Out-Null
f ( $err ) {
    Login-AzureRmAccount
    Select-AzureRmSubscription -SubscriptionID $subscriptionId -ErrorAction Stop | Out-Null



 get the source IPs for the arr
proxyIPs =  Get-AzureRmNetworkInterface -ResourceGroupName $proxyResGrp | % {
                $_.IpConfigurations | % {
                    if ( $_.PublicIpAddress.Id -like '*Microsoft.Network/publicIPAddresses*' )
                    {
                        $ipAddress = Get-AzureRmResource -ResourceId ($_.PublicIpAddress.Id)
                        $ip = Get-AzureRmPublicIpAddress -ResourceGroupName $ipAddress.ResourceGroupName -Name $ipAddress.Name
                        return @{ IPAddress = $ip.IpAddress; Name = $_.Name }
                    }
                }
            }

 get NSG for each source resourceGroup and add the inbound rules
originResGrps | % {
    $originResGrp = $_
    Get-AzureRmNetworkSecurityGroup -ResourceGroupName $originResGrp | % {
        # have to re-get the NSG for some reason
        $nsg = $_

        $nsg.SecurityRules | ? { $_.SourceAddressPrefix = $arrIP.IPAddress -and $_.DestinationPortRange -eq "80" }
        $rules = $nsg.SecurityRules

        $maxPriority = $rules | Sort Priority -Descending | select Priority -First 1 | % { $_.Priority }

        $isChanged = $false
        foreach ( $proxyIP in $proxyIPs )
        {
            # HTTP
            # $rule = $rules | ? { $_.Name -eq "HTTP-$($arrIP.Name.ToUpper())" }
            $rule = $rules | ? { $_.SourceAddressPrefix -eq $proxyIP.IPAddress -and $_.DestinationPortRange -eq "80" }
            if ( ! $rule )
            {
                $maxPriority += 100
                Write-Host "Creating a rule for HTTP-$($proxyIP.Name.ToUpper()) in nsg '$($nsg.Name)'" -ForegroundColor DarkGreen

                # have to re-get the NSG for some reason
                #Get-AzureRmNetworkSecurityGroup -ResourceGroupName $originResGrp -Name $nsg.Name |
                $nsg |
                    Add-AzureRmNetworkSecurityRuleConfig `
                            -Name "HTTP-$($proxyIP.Name.ToUpper())" `
                            -Protocol Tcp `
                            -SourceAddressPrefix $proxyIP.IPAddress `
                            -SourcePortRange "*" `
                            -DestinationAddressPrefix "*" `
                            -DestinationPortRange "80" `
                            -Access Allow `
                            -Direction Inbound `
                            -Priority $maxPriority
                #   Set-AzureRmNetworkSecurityGroup | 
                #   Out-Null
                $isChanged = $true
            }
            else
            {
                Write-Host "Rule for HTTP-$($proxyIP.Name.ToUpper()) already exists in nsg '$($nsg.Name)'" -ForegroundColor DarkYellow
            }

            # HTTPS
            # $rule = $rules | ? { $_.Name -eq "HTTPS-$($arrIP.Name.ToUpper())" }
            $rule = $rules | ? { $_.SourceAddressPrefix -eq $proxyIP.IPAddress -and $_.DestinationPortRange -eq "443" }
            if ( ! $rule )
            {
                $maxPriority += 100
                Write-Host "Creating a rule for HTTPS-$($proxyIP.Name.ToUpper()) in nsg '$($nsg.Name)'" -ForegroundColor DarkGreen

                # have to re-get the NSG for some reason
                #Get-AzureRmNetworkSecurityGroup -ResourceGroupName $originResGrp -Name $nsg.Name |
                $nsg |
                    Add-AzureRmNetworkSecurityRuleConfig `
                            -Name "HTTPS-$($proxyIP.Name.ToUpper())" `
                            -Protocol Tcp `
                            -SourceAddressPrefix $proxyIP.IPAddress `
                            -SourcePortRange "*" `
                            -DestinationAddressPrefix "*" `
                            -DestinationPortRange "443" `
                            -Access Allow `
                            -Direction Inbound `
                            -Priority $maxPriority
                #   Set-AzureRmNetworkSecurityGroup | 
                #   Out-Null
                $isChanged = $true
            }
            else
            {
                Write-Host "Rule for HTTPS-$($proxyIP.Name.ToUppeR()) already exists in nsg '$($proxyIP.Name)'" -ForegroundColor DarkYellow
            }
        }

        if ( $isChanged )
        {
            Write-Host "Updating $($nsg.Name)" -ForegroundColor Green
            $nsg | Set-AzureRmNetworkSecurityGroup
        }

    }

person Richard Hauer    schedule 09.11.2016    source источник


Ответы (1)


Так что это работает для меня:

$a = Get-AzureRmNetworkSecurityGroup -Name $NSG_Name -ResourceGroupName $RG_Name
PS C:\WINDOWS\system32> $a.SecurityRules[1].sourceaddressprefix
10.0.0.0/23
PS C:\WINDOWS\system32> $a.SecurityRules[0].sourceaddressprefix
*

Я предлагаю вам обновить модули PowerShell.

person 4c74356b41    schedule 09.11.2016
comment
Интересно, что это сработало и у меня, и после этого старый код (который возвращал True / False) тоже начал работать. #smh - person Richard Hauer; 09.11.2016
comment
Честно говоря, я понятия не имею, что происходит сейчас. Я повторял этот код как минимум 2 часа, пытаясь понять, что я делаю не так. Теперь всегда возвращается правильно. Есть карма, но я думаю, что это временная проблема на стороне Azure. Мой модуль AzureRm.Network - v3.0.0 - person Richard Hauer; 09.11.2016
comment
ну, не знаю, рад, что вы разобрались с этим. - person 4c74356b41; 09.11.2016
comment
Слишком рано заговорил - теперь вернусь к True / False :( - person Richard Hauer; 09.11.2016
comment
что ж, вам обязательно стоит попробовать все обновить. инсталляционный модуль лазурный; установить модуль azurerm - person 4c74356b41; 09.11.2016
comment
Сюжет сгущается - попытался обновить модуль с 3.0.0.0 до 3.1.0.0, но теперь я получаю сообщение об ошибке «Невозможно обработать преобразование аргумента для параметра InstalledModuleInfo». Я мог бы просто перезагрузить и переустановить модуль AzureRM и посмотреть, нет ли где-нибудь случайного повреждения - person Richard Hauer; 09.11.2016