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


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

Применимо к: Azure Local 2311.2 и более поздних версий; 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. В этом примере используйте командлет 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 * Все * * Входящий трафик Разрешить 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. Назначьте свойству AccessControlList объекта ipConfiguration значение $null.

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

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

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

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

Ниже приведен пример скрипта для включения аудита брандмауэра на хост-компьютерах. Обновите переменные в начале и запустите его в локальном экземпляре 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
                                       }
                                   ]
                   }
}

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

Для получения дополнительной информации, см.: