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


Настройка шифрования для виртуальной подсети

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

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

Требуется шифрование виртуальной сети:

  • Сертификаты шифрования, установленные на каждом узле Hyper-V с поддержкой SDN.
  • Объект учетных данных в сетевом контроллере, ссылающийся на отпечаток этого сертификата.
  • Конфигурация на каждом из виртуальная сеть содержит подсети, требующие шифрования.

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

Примечание.

При взаимодействии с другой виртуальной машиной в той же подсети, независимо от того, подключен ли он в настоящее время или подключен позже, трафик шифруется автоматически.

Совет

Если необходимо ограничить доступ приложений только к зашифрованной подсети, можно использовать только списки управления доступом контроль доступа (списки ACL), чтобы разрешить обмен данными в текущей подсети. Дополнительные сведения см. в разделе "Использование списков контроль доступа", чтобы управлять потоком сетевого трафика центра обработки данных.

Шаг 1. Создание сертификата шифрования

У каждого узла должен быть установлен сертификат шифрования. Вы можете использовать один и тот же сертификат для всех клиентов или создать уникальный сертификат для каждого клиента.

  1. Создание сертификата

    $subjectName = "EncryptedVirtualNetworks"
    $cryptographicProviderName = "Microsoft Base Cryptographic Provider v1.0";
    [int] $privateKeyLength = 1024;
    $sslServerOidString = "1.3.6.1.5.5.7.3.1";
    $sslClientOidString = "1.3.6.1.5.5.7.3.2";
    [int] $validityPeriodInYear = 5;
    
    $name = new-object -com "X509Enrollment.CX500DistinguishedName.1"
    $name.Encode("CN=" + $SubjectName, 0)
    
    #Generate Key
    $key = new-object -com "X509Enrollment.CX509PrivateKey.1"
    $key.ProviderName = $cryptographicProviderName
    $key.KeySpec = 1 #X509KeySpec.XCN_AT_KEYEXCHANGE
    $key.Length = $privateKeyLength
    $key.MachineContext = 1
    $key.ExportPolicy = 0x2 #X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_FLAG
    $key.Create()
    
    #Configure Eku
    $serverauthoid = new-object -com "X509Enrollment.CObjectId.1"
    $serverauthoid.InitializeFromValue($sslServerOidString)
    $clientauthoid = new-object -com "X509Enrollment.CObjectId.1"
    $clientauthoid.InitializeFromValue($sslClientOidString)
    $ekuoids = new-object -com "X509Enrollment.CObjectIds.1"
    $ekuoids.add($serverauthoid)
    $ekuoids.add($clientauthoid)
    $ekuext = new-object -com "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1"
    $ekuext.InitializeEncode($ekuoids)
    
    # Set the hash algorithm to sha512 instead of the default sha1
    $hashAlgorithmObject = New-Object -ComObject X509Enrollment.CObjectId
    $hashAlgorithmObject.InitializeFromAlgorithmName( $ObjectIdGroupId.XCN_CRYPT_HASH_ALG_OID_GROUP_ID, $ObjectIdPublicKeyFlags.XCN_CRYPT_OID_INFO_PUBKEY_ANY, $AlgorithmFlags.AlgorithmFlagsNone, "SHA512")
    
    
    #Request Certificate
    $cert = new-object -com "X509Enrollment.CX509CertificateRequestCertificate.1"
    
    $cert.InitializeFromPrivateKey(2, $key, "")
    $cert.Subject = $name
    $cert.Issuer = $cert.Subject
    $cert.NotBefore = (get-date).ToUniversalTime()
    $cert.NotAfter = $cert.NotBefore.AddYears($validityPeriodInYear);
    $cert.X509Extensions.Add($ekuext)
    $cert.HashAlgorithm = $hashAlgorithmObject
    $cert.Encode()
    
    $enrollment = new-object -com "X509Enrollment.CX509Enrollment.1"
    $enrollment.InitializeFromRequest($cert)
    $certdata = $enrollment.CreateRequest(0)
    $enrollment.InstallResponse(2, $certdata, 0, "")
    

    После выполнения скрипта новый сертификат появится в магазине "Мой":

    PS D:\> dir cert:\\localmachine\my
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my
    
    Thumbprint                                Subject
    ----------                                -------
    84857CBBE7A1C851A80AE22391EB2C39BF820CE7  CN=MyNetwork
    5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6  CN=EncryptedVirtualNetworks
    
  2. Экспорт сертификата в файл.

    Вам потребуется две копии сертификата, один с закрытым ключом и один без.

    $subjectName = "EncryptedVirtualNetworks"
    $cert = Get-ChildItem cert:\localmachine\my | ? {$_.Subject -eq "CN=$subjectName"}
    [System.io.file]::WriteAllBytes("c:\$subjectName.pfx", $cert.Export("PFX", "secret"))
    Export-Certificate -Type CERT -FilePath "c:\$subjectName.cer" -cert $cert
    
  3. Установка сертификатов на каждом узле Hyper-v

    PS C:\> dir c:\$subjectname.*
    
    Directory: C:\
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----        9/22/2017   4:54 PM            543 EncryptedVirtualNetworks.cer
    -a----        9/22/2017   4:54 PM           1706 EncryptedVirtualNetworks.pfx
    
  4. Установка на узле Hyper-V

    $server = "Server01"
    
    $subjectname = "EncryptedVirtualNetworks"
    copy c:\$SubjectName.* \\$server\c$
    invoke-command -computername $server -ArgumentList $subjectname,"secret" {
        param (
            [string] $SubjectName,
            [string] $Secret
        )
        $certFullPath = "c:\$SubjectName.cer"
    
        # create a representation of the certificate file
        $certificate = new-object System.Security.Cryptography.X509Certificates.X509Certificate2
        $certificate.import($certFullPath)
    
        # import into the store
        $store = new-object System.Security.Cryptography.X509Certificates.X509Store("Root", "LocalMachine")
        $store.open("MaxAllowed")
        $store.add($certificate)
        $store.close()
    
        $certFullPath = "c:\$SubjectName.pfx"
        $certificate = new-object System.Security.Cryptography.X509Certificates.X509Certificate2
        $certificate.import($certFullPath, $Secret, "MachineKeySet,PersistKeySet")
    
        # import into the store
        $store = new-object System.Security.Cryptography.X509Certificates.X509Store("My", "LocalMachine")
        $store.open("MaxAllowed")
        $store.add($certificate)
        $store.close()
    
        # Important: Remove the certificate files when finished
        remove-item C:\$SubjectName.cer
        remove-item C:\$SubjectName.pfx
    }
    
  5. Повторите для каждого сервера в вашей среде.

    После повторения для каждого сервера необходимо установить сертификат в корневом каталоге и хранилище каждого узла Hyper-V.

  6. Проверьте установку сертификата.

    Проверьте сертификаты, проверка содержимое хранилищ моего и корневого сертификатов:

    PS C:\> enter-pssession Server1
    
    [Server1]: PS C:\> get-childitem cert://localmachine/my,cert://localmachine/root | ? {$_.Subject -eq "CN=EncryptedVirtualNetworks"}
    
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my
    
    Thumbprint                                Subject
    ----------                                -------
    5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6  CN=EncryptedVirtualNetworks
    
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\root
    
    Thumbprint                                Subject
    ----------                                -------
    5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6  CN=EncryptedVirtualNetworks
    
  7. Запишите отпечаток.

    Необходимо заметить отпечаток, так как он необходим для создания объекта учетных данных сертификата в сетевом контроллере.

Шаг 2. Создание учетных данных сертификата

После установки сертификата на каждом узле Hyper-V, подключенном к сетевому контроллеру, необходимо настроить сетевой контроллер для его использования. Для этого необходимо создать объект учетных данных, содержащий отпечаток сертификата на компьютере с установленными модулями PowerShell сетевого контроллера.

///Replace with the thumbprint from your certificate
$thumbprint = "5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6"

$uri = "https://nc.contoso.com"

///Replace with your Network Controller URI
Import-module networkcontroller

$credproperties = new-object Microsoft.Windows.NetworkController.CredentialProperties
$credproperties.Type = "X509Certificate"
$credproperties.Value = $thumbprint
New-networkcontrollercredential -connectionuri $uri -resourceid "EncryptedNetworkCertificate" -properties $credproperties -force

Совет

Вы можете повторно использовать эти учетные данные для каждой зашифрованной виртуальной сети или развернуть и использовать уникальный сертификат для каждого клиента.

Шаг 3. Настройка виртуальная сеть для шифрования

На этом шаге предполагается, что вы уже создали имя виртуальной сети "Моя сеть" и содержит по крайней мере одну виртуальную подсеть. Сведения о создании виртуальных сетей см. в разделе "Создание, удаление" или "Обновление" виртуальная сеть клиента.

Примечание.

При взаимодействии с другой виртуальной машиной в той же подсети, независимо от того, подключен ли он в настоящее время или подключен позже, трафик шифруется автоматически.

  1. Получение объектов виртуальная сеть и учетных данных из сетевого контроллера:

    $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork"
    $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
    
  2. Добавьте ссылку на учетные данные сертификата и включите шифрование в отдельных подсетях:

    $vnet.properties.EncryptionCredential = $certcred
    
    # Replace the Subnets index with the value corresponding to the subnet you want encrypted.
    # Repeat for each subnet where encryption is needed
    $vnet.properties.Subnets[0].properties.EncryptionEnabled = $true
    
  3. Поместите обновленный объект виртуальная сеть в сетевой контроллер:

    New-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId $vnet.ResourceId -Properties $vnet.Properties -force
    

Поздравляю!* После выполнения этих действий вы завершите работу.