Поделиться через


Настройка групп безопасности сети в локальной среде Azure с помощью PowerShell

Применимо к: Локальные версии Azure, версии 23H2 и 22H2; Windows Server 2022, Windows Server 2019, Windows Server 2016

В этой статье приведены инструкции по настройке групп безопасности сети (NSG) для управления потоком трафика с помощью брандмауэра центра обработки данных для программно-определяемой сети (SDN) в Azure Local с помощью Windows PowerShell. Включите и настройте брандмауэр центра обработки данных, создав группы безопасности сети, которые применяются к подсети или сетевому интерфейсу.

В примерах скриптов в этой статье используются команды Windows PowerShell, экспортированные из модуля NetworkController . Вы также можете использовать Windows Admin Center для настройки групп безопасности сети и управления ими.

Настройка брандмауэра центра обработки данных для разрешения всего трафика

После развертывания SDN необходимо проверить базовое сетевое подключение в новой среде. Для этого создайте правило для брандмауэра Центра обработки данных, которое разрешает весь сетевой трафик без ограничений.

Используйте записи в следующей таблице, чтобы создать набор правил, разрешающих весь входящий и исходящий сетевой трафик.

Исходный IP-адрес IP-адрес назначения Протокол Исходный порт Конечный порт Направление Действие Приоритет
* * Все * * Входящий трафик Разрешить 100
* * Все * * Исходящие Разрешить 110

В этом примере создается группа безопасности сети с двумя правилами:

  1. AllowAll_Inbound — позволяет передавать весь сетевой трафик в сетевой интерфейс, в котором настроена эта группа безопасности сети.
  2. AllowAllOutbound — позволяет передавать весь трафик из сетевого интерфейса. Эта группа безопасности сети, определяемая идентификатором ресурса AllowAll-1, теперь готова к использованию в виртуальных подсетях и сетевых интерфейсах.

Эту команду можно выполнить с любого компьютера, имеющего доступ к конечной точке REST сетевого контроллера. Сначала откройте сеанс PowerShell. В этом примере используйте командлет ВВОД-PSSession и замените <computer-name> на имя компьютера с конечной точкой REST сетевого контроллера.

Enter-PSSession <computer-name>

Затем выполните следующий сценарий, чтобы создать группу безопасности сети:

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "100"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"
$aclrule1 = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule1.Properties = $ruleproperties
$aclrule1.ResourceId = "AllowAll_Inbound"
$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "110"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"
$aclrule2 = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule2.Properties = $ruleproperties
$aclrule2.ResourceId = "AllowAll_Outbound"
$acllistproperties = new-object Microsoft.Windows.NetworkController.AccessControlListProperties
$acllistproperties.AclRules = @($aclrule1, $aclrule2)
New-NetworkControllerAccessControlList -ResourceId "AllowAll" -Properties $acllistproperties -ConnectionUri <NC REST FQDN>

Примечание.

Ссылка на команду Windows PowerShell для сетевого контроллера находится в командлетах сетевого контроллера.

Использование групп безопасности сети для ограничения трафика в подсети

В этом примере создается группа безопасности сети, которая предотвращает взаимодействие виртуальных машин в подсети 192.168.0.0/24. Этот тип группы безопасности сети полезен для ограничения возможности злоумышленника распространяться в подсети по-прежнему, позволяя виртуальным машинам получать запросы из-за пределов подсети и взаимодействовать с другими службами в других подсетях.

Исходный IP-адрес IP-адрес назначения Протокол Исходный порт Конечный порт Направление Действие Приоритет
192.168.0.1 * Все * * Входящий трафик Разрешить 100
* 192.168.0.1 Все * * Исходящие Разрешить 101
192.168.0.0/24 * Все * * Входящий трафик Блокировка 102
* 192.168.0.0/24 Все * * Исходящие Блокировка 103
* * Все * * Входящий трафик Разрешить 104
* * Все * * Исходящие Разрешить 105

Группа безопасности сети, созданная приведенным ниже скриптом, идентифицируемая подсетью идентификатора ресурса-192-168-0-0, теперь может применяться к подсети виртуальной сети, которая использует адрес подсети "192.168.0.0/24". Любой сетевой интерфейс, подключенный к этой подсети виртуальной сети, автоматически получает указанные выше правила группы безопасности сети.

Ниже приведен пример скрипта для создания этой группы безопасности сети с помощью REST API сетевого контроллера:

import-module networkcontroller
$ncURI = "https://mync.contoso.local"
$aclrules = @()

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "192.168.0.1"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "100"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowRouter_Inbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "192.168.0.1"
$ruleproperties.Priority = "101"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowRouter_Outbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Deny"
$ruleproperties.SourceAddressPrefix = "192.168.0.0/24"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "102"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "DenySubnet_Inbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Deny"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "192.168.0.0/24"
$ruleproperties.Priority = "103"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "DenySubnet_Outbound"

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "104"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowAll_Inbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "105"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowAll_Outbound"
$aclrules += $aclrule

$acllistproperties = new-object Microsoft.Windows.NetworkController.AccessControlListProperties
$acllistproperties.AclRules = $aclrules

New-NetworkControllerAccessControlList -ResourceId "Subnet-192-168-0-0" -Properties $acllistproperties -ConnectionUri $ncURI

Добавление группы безопасности сети в сетевой интерфейс

Создав группу безопасности сети и назначив ее виртуальной подсети, может потребоваться переопределить группу безопасности сети по умолчанию в виртуальной подсети с определенной группой безопасности сети для отдельного сетевого интерфейса. Начиная с Windows Server 2019 Datacenter, вы можете применять определенные группы безопасности сети непосредственно к сетевым интерфейсам, подключенным к логическим сетям SDN, помимо виртуальных сетей SDN. Если у вас есть группы безопасности сети, установленные в виртуальной подсети, подключенной к сетевому интерфейсу, применяются обе группы безопасности сети, а группы безопасности сети сетевого интерфейса являются приоритетными над группами безопасности сети виртуальной подсети.

В этом примере показано, как добавить группу безопасности сети в виртуальную сеть.

Совет

Кроме того, можно добавить группу безопасности сети одновременно, когда вы создаете сетевой интерфейс.

  1. Получите или создайте сетевой интерфейс, в который вы добавите группу безопасности сети.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Получите или создайте группу безопасности сети, которую вы добавите в сетевой интерфейс.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. Назначьте группу безопасности сети свойству AccessControlList сетевого интерфейса.

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. Добавьте сетевой интерфейс в сетевой контроллер.

    new-networkcontrollernetworkinterface -ConnectionUri $uri -Properties $nic.properties -ResourceId $nic.resourceid
    

Удаление группы безопасности сети из сетевого интерфейса

В этом примере показано, как удалить группу безопасности сети из сетевого интерфейса. Удаление группы безопасности сети применяет набор правил по умолчанию к сетевому интерфейсу. Набор правил по умолчанию разрешает весь исходящий трафик, но блокирует весь входящий трафик. Если вы хотите разрешить весь входящий трафик, необходимо следовать предыдущему примеру , чтобы добавить группу безопасности сети, которая разрешает весь входящий и весь исходящий трафик.

  1. Получите сетевой интерфейс, из которого вы удалите группу безопасности сети.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Назначьте $null свойству AccessControlList ipConfiguration.

    $nic.properties.ipconfigurations[0].properties.AccessControlList = $null
    
  3. Добавьте объект сетевого интерфейса в сетевой контроллер.

    new-networkcontrollernetworkinterface -ConnectionUri $uri -Properties $nic.properties -ResourceId $nic.resourceid
    

Аудит брандмауэра

Возможность аудита брандмауэра для брандмауэра центра обработки данных записывает любой поток, обработанный правилами брандмауэра SDN. Записываются все группы безопасности сети с включенным ведением журнала. Файлы журналов должны находиться в синтаксисе, который соответствует журналам потоков Azure Наблюдатель за сетями. Эти журналы можно использовать для диагностика или архивирования для последующего анализа.

Ниже приведен пример скрипта для включения аудита брандмауэра на хост-компьютерах. Обновите переменные в начале и запустите его в локальном экземпляре Azure с развернутым сетевым контроллером :

$logpath = "C:\test\log1"
$servers = @("sa18n22-2", "sa18n22-3", "sa18n22-4")
$uri = "https://sa18n22sdn.sa18.nttest.microsoft.com"

# Create log directories on the hosts
invoke-command -Computername $servers  {
    param(
        $Path
    )
    mkdir $path    -force
} -argumentlist $LogPath

# Set firewall auditing settings on Network Controller
$AuditProperties = new-object Microsoft.Windows.NetworkController.AuditingSettingsProperties
$AuditProperties.OutputDirectory = $logpath
set-networkcontrollerauditingsettingsconfiguration -connectionuri $uri -properties $AuditProperties -force  | out-null

# Enable logging on each server
$servers = get-networkcontrollerserver -connectionuri $uri
foreach ($s in $servers) {
    $s.properties.AuditingEnabled = @("Firewall")
    new-networkcontrollerserver -connectionuri $uri -resourceid $s.resourceid -properties $s.properties -force | out-null
}

После включения новый файл появится в указанном каталоге на каждом узле примерно один раз в час. Эти файлы следует периодически обрабатывать и удалять из узлов. Текущий файл имеет нулевую длину и блокируется до очистки на следующей часовой отметке:

PS C:\test\log1> dir

    Directory: C:\test\log1

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        7/19/2018   6:28 AM          17055 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL122803093.json
-a----        7/19/2018   7:28 AM           7880 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL132803173.json
-a----        7/19/2018   8:28 AM           7867 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL142803264.json
-a----        7/19/2018   9:28 AM          10949 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL152803360.json
-a----        7/19/2018   9:28 AM              0 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL162803464.json

Эти файлы содержат последовательность событий потока, например:

{
    "records": [
        {
            "properties":{
                "Version":"1.0",
                "flows":[
                    {
                        "flows":[
                            {
                                "flowTuples":["1531963580,192.122.0.22,192.122.255.255,138,138,U,I,A"],
                                "portId":"9",
                                "portName":"7290436D-0422-498A-8EB8-C6CF5115DACE"
                            }
                        ],
                        "rule":"Allow_Inbound"
                    }
                ]
            },
            "operationName":"NetworkSecurityGroupFlowEvents",
            "resourceId":"a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1",
            "time":"20180719:L012620622",
            "category":"NetworkSecurityGroupFlowEvent",
            "systemId":"d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a"
            },

Обратите внимание, что ведение журнала выполняется только для правил, для которых задано значение "Включено", например:

{
    "Tags":  null,
    "ResourceRef":  "/accessControlLists/AllowAll",
    "InstanceId":  "4a63e1a5-3264-4986-9a59-4e77a8b107fa",
    "Etag":  "W/\"1535a780-0fc8-4bba-a15a-093ecac9b88b\"",
    "ResourceMetadata":  null,
    "ResourceId":  "AllowAll",
    "Properties":  {
                       "ConfigurationState":  null,
                       "ProvisioningState":  "Succeeded",
                       "AclRules":  [
                                        {
                                            "ResourceMetadata":  null,
                                            "ResourceRef":  "/accessControlLists/AllowAll/aclRules/AllowAll_Inbound",
                                            "InstanceId":  "ba8710a8-0f01-422b-9038-d1f2390645d7",
                                            "Etag":  "W/\"1535a780-0fc8-4bba-a15a-093ecac9b88b\"",
                                            "ResourceId":  "AllowAll_Inbound",
                                            "Properties":  {
                                                               "Protocol":  "All",
                                                               "SourcePortRange":  "0-65535",
                                                               "DestinationPortRange":  "0-65535",
                                                               "Action":  "Allow",
                                                               "SourceAddressPrefix":  "*",
                                                               "DestinationAddressPrefix":  "*",
                                                               "Priority":  "101",
                                                               "Description":  null,
                                                               "Type":  "Inbound",
                                                               "Logging":  "Enabled",
                                                               "ProvisioningState":  "Succeeded"
                                                           }
                                        },
                                        {
                                            "ResourceMetadata":  null,
                                            "ResourceRef":  "/accessControlLists/AllowAll/aclRules/AllowAll_Outbound",
                                            "InstanceId":  "068264c6-2186-4dbc-bbe7-f504c6f47fa8",
                                            "Etag":  "W/\"1535a780-0fc8-4bba-a15a-093ecac9b88b\"",
                                            "ResourceId":  "AllowAll_Outbound",
                                            "Properties":  {
                                                               "Protocol":  "All",
                                                               "SourcePortRange":  "0-65535",
                                                               "DestinationPortRange":  "0-65535",
                                                               "Action":  "Allow",
                                                               "SourceAddressPrefix":  "*",
                                                               "DestinationAddressPrefix":  "*",
                                                               "Priority":  "110",
                                                               "Description":  null,
                                                               "Type":  "Outbound",
                                                               "Logging":  "Enabled",
                                                               "ProvisioningState":  "Succeeded"
                                                           }
                                        }
                                    ],
                       "IpConfigurations":  [

                                            ],
                       "Subnets":  [
                                       {
                                           "ResourceMetadata":  null,
                                           "ResourceRef":  "/virtualNetworks/10_0_1_0/subnets/Subnet1",
                                           "InstanceId":  "00000000-0000-0000-0000-000000000000",
                                           "Etag":  null,
                                           "ResourceId":  null,
                                           "Properties":  null
                                       }
                                   ]
                   }
}

Следующие шаги

Связанные сведения: