Настройка шифрования для виртуальной подсети
Шифрование виртуальной сети позволяет шифрование трафика виртуальной сети между виртуальными машинами, которые взаимодействуют друг с другом в подсетях, помеченных как "Включено шифрование". Для шифрования пакетов с помощью этой возможности также используется протокол DTLS в виртуальной подсети. Протокол DTLS обеспечивает защиту от перехвата, несанкционированных изменений и подделки со стороны любых лиц, имеющих доступ к физической сети.
Требуется шифрование виртуальной сети:
- Сертификаты шифрования, установленные на каждом узле Hyper-V с поддержкой SDN.
- Объект учетных данных в сетевом контроллере, ссылающийся на отпечаток этого сертификата.
- Конфигурация на каждом из виртуальная сеть содержит подсети, требующие шифрования.
После включения шифрования в подсети все сетевые трафики в этой подсети шифруются автоматически, помимо любого шифрования на уровне приложения, который также может произойти. Трафик, который пересекается между подсетями, даже если помечен как зашифрованный, автоматически отправляется незашифрованный. Любой трафик, пересекающий границу виртуальной сети, также отправляется незашифрованным.
Примечание.
При взаимодействии с другой виртуальной машиной в той же подсети, независимо от того, подключен ли он в настоящее время или подключен позже, трафик шифруется автоматически.
Совет
Если необходимо ограничить доступ приложений только к зашифрованной подсети, можно использовать только списки управления доступом контроль доступа (списки ACL), чтобы разрешить обмен данными в текущей подсети. Дополнительные сведения см. в разделе "Использование списков контроль доступа", чтобы управлять потоком сетевого трафика центра обработки данных.
Шаг 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
Экспорт сертификата в файл.
Вам потребуется две копии сертификата, один с закрытым ключом и один без.
$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
Установка сертификатов на каждом узле 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
Установка на узле 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 }
Повторите для каждого сервера в вашей среде.
После повторения для каждого сервера необходимо установить сертификат в корневом каталоге и хранилище каждого узла Hyper-V.
Проверьте установку сертификата.
Проверьте сертификаты, проверив содержимое хранилищ моих и корневых сертификатов:
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
Запишите отпечаток.
Необходимо заметить отпечаток, так как он необходим для создания объекта учетных данных сертификата в сетевом контроллере.
Шаг 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. Настройка виртуальная сеть для шифрования
На этом шаге предполагается, что вы уже создали имя виртуальной сети "Моя сеть" и содержит по крайней мере одну виртуальную подсеть. Сведения о создании виртуальных сетей см. в разделе "Создание, удаление" или "Обновление" виртуальная сеть клиента.
Примечание.
При взаимодействии с другой виртуальной машиной в той же подсети, независимо от того, подключен ли он в настоящее время или подключен позже, трафик шифруется автоматически.
Получение объектов виртуальная сеть и учетных данных из сетевого контроллера:
$vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork" $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
Добавьте ссылку на учетные данные сертификата и включите шифрование в отдельных подсетях:
$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
Поместите обновленный объект виртуальная сеть в сетевой контроллер:
New-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId $vnet.ResourceId -Properties $vnet.Properties -force
Поздравляю!* После выполнения этих действий вы завершите работу.