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


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

Область применения: Azure Stack HCI версий 23H2 и 22H2; Windows Server 2022, Windows Server 2019, Windows Server 2016

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

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

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

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

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

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

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

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

Эту команду можно выполнить с любого компьютера, который имеет доступ к конечной точке REST сетевого контроллера. Сначала откройте сеанс PowerShell. В этом примере используйте командлет Enter-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 * Все * * Входящий трафик Allow 100
* 192.168.0.1 Все * * Исходящие Allow 101
192.168.0.0/24 * Все * * Входящий трафик Block 102
* 192.168.0.0/24 Все * * Исходящие Блокировать 103
* * Все * * Входящий трафик Allow 104
* * Все * * Исходящие Allow 105

Группу безопасности сети, созданную с помощью приведенного ниже сценария, идентифицируемую идентификатором ресурса Subnet-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 Stack HCI с развернутым сетевым контроллером :

$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":"394f647d-2ed0-4c31-87c5-389b8c0c8132",
            "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
                                       }
                                   ]
                   }
}

Дальнейшие действия

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