Я пытаюсь прочитать существующие правила в группе сетевой безопасности в режиме ARM, но, как ни странно, свойство SourceAddressPrefix, содержащее информацию о белом диапазоне IP, сообщает в виде логического значения (например, «True» или «True», False ") в строковой форме.SourceAddressПреимущество существующих правил группы безопасности сети ARM является логическим?
Я попытался извлекая группу с помощью Get-AzureRmNetworkSecurityGroup
и читает ::SecurityRules
собственности и также пытался $nsg | Get-AzureRmNetworkSecurityRuleConfig
, а также $nsg | Get-AzureRmNetworkSecurityRuleConfig -Name MyRule
. В каждом случае возвращаемые правила SourceAddressPrefix
являются либо «True», либо «False».
Без этого значения я не могу определить, существует ли уже существующее правило для IP-адреса, который я проверяю. Система позволяет мне устанавливать несколько правил с теми же подробностями, пока имя и приоритет разные, поэтому я создаю дубликаты.
Я предполагаю, что это своего рода функция безопасности? Есть ли способ получить фактические диапазоны IP CIDR, отображаемые на портале?
EDIT - В связи с этим приходит и уходит, я отправляю полный код
Код выхватывает 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
}
}
Интересно, что это сработало и для меня, и после этого начал работать старый код (возвращающий True/False). #smh –
Я честно понятия не имею, что происходит сейчас. Я зацикливал этот код как минимум на 2 часа, пытаясь понять, что я делаю неправильно. Теперь он всегда возвращается правильно. Имейте карму, но я думаю, что это была временная проблема на стороне Лазури. Мой AzureRm.Network модуль v3.0.0 –
ну, не знаю, рад, что вы разобрали это. – 4c74356b41