Konfigurieren von Verschlüsselung für ein virtuelles Subnetz
Durch Verschlüsselung virtueller Netzwerke kann der virtuelle Netzwerkdatenverkehr zwischen VMs verschlüsselt werden, die miteinander in Subnetzen kommunizieren, die als „Verschlüsselung aktiviert“ markiert sind. Sie nutzt auch Datagram Transport Layer Security (DTLS) im virtuellen Subnetz, um Pakete zu verschlüsseln. DTLS schützt vor Abhörversuchen, Manipulation und Fälschung durch jeden, der Zugriff auf das physische Netzwerk hat.
Die Verschlüsselung virtueller Netzwerke erfordert Folgendes:
- Verschlüsselungszertifikate, die auf jedem der SDN-fähigen Hyper-V-Hosts installiert sind.
- Ein Anmeldeinformationsobjekt im Netzwerkcontroller, das auf den Fingerabdruck dieses Zertifikats verweist.
- Die Konfiguration für jedes der virtuellen Netzwerke enthält Subnetze, die Verschlüsselung erfordern.
Nachdem Sie Verschlüsselung für ein Subnetz aktiviert haben, wird der gesamte Netzwerkdatenverkehr innerhalb dieses Subnetzes automatisch verschlüsselt, zusätzlich zu Verschlüsselung auf Anwendungsebene, die möglicherweise ebenfalls stattfindet. Datenverkehr, der zwischen Subnetzen stattfindet, wird automatisch unverschlüsselt gesendet, auch wenn er als verschlüsselt markiert ist. Datenverkehr, der die Grenze des virtuellen Netzwerks überschreitet, wird ebenfalls unverschlüsselt gesendet.
Hinweis
Bei der Kommunikation mit einer anderen VM im selben Subnetz wird Datenverkehr automatisch verschlüsselt, unabhängig davon, ob er aktuell oder zu einem späteren Zeitpunkt verbunden ist.
Tipp
Wenn Sie Anwendungen auf die Kommunikation im verschlüsselten Subnetz beschränken müssen, können Sie nur Zugriffssteuerungslisten (Access Control Lists, ACLs) verwenden, um die Kommunikation innerhalb des aktuellen Subnetzes zuzulassen. Weitere Informationen finden Sie unter Verwenden von Zugriffssteuerungslisten zum Verwalten von Netzwerkdatenverkehr im Rechenzentrum.
Schritt 1: Erstellen des Verschlüsselungszertifikats
Auf jedem Host muss ein Verschlüsselungszertifikat installiert sein. Sie können dasselbe Zertifikat für alle Mandanten verwenden oder für jeden Mandanten ein eindeutiges Zertifikat generieren.
Generieren des Zertifikats
$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, "")
Nach dem Ausführen des Skripts wird ein neues Zertifikat in „Mein Speicher“ angezeigt:
PS D:\> dir cert:\\localmachine\my PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my Thumbprint Subject ---------- ------- 84857CBBE7A1C851A80AE22391EB2C39BF820CE7 CN=MyNetwork 5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6 CN=EncryptedVirtualNetworks
Exportieren Sie das Zertifikat in eine Datei.
Sie benötigen zwei Kopien des Zertifikats: eine mit dem privaten Schlüssel und eine ohne.
$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
Installieren der Zertifikate auf jedem Ihrer Hyper-V-Hosts
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
Installieren auf einem Hyper-V-Host
$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 }
Wiederholen Sie diese Schritte für jeden Server in Ihrer Umgebung.
Nach dem Wiederholen dieser Schritte für jeden Server sollte im Stammverzeichnis und in Ihrem Speicher jedes Hyper-V-Hosts ein Zertifikat installiert sein.
Überprüfen Sie die Installation des Zertifikats.
Überprüfen Sie die Zertifikate, indem Sie den Inhalt des Stammzertifikatspeichers und Ihres Zertifikatspeichers überprüfen:
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
Notieren Sie sich den Fingerabdruck.
Sie müssen sich den Fingerabdruck notieren, weil Sie ihn zum Erstellen des Zertifikatanmeldeinformationenobjekts im Netzwerkcontroller benötigen.
Schritt 2: Erstellen der Zertifikatanmeldeinformationen
Nachdem Sie das Zertifikat auf jedem Hyper-V-Host installiert haben, der mit dem Netzwerkcontroller verbunden ist, müssen Sie nun den Netzwerkcontroller so konfigurieren, dass er verwendet wird. Dazu müssen Sie ein Anmeldeinformationenobjekt erstellen, das den Zertifikatfingerabdruck von dem Computer enthält, auf dem die PowerShell-Module des Netzwerkcontrollers installiert sind.
///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
Tipp
Sie können diese Anmeldeinformationen für jedes verschlüsselte virtuelle Netzwerk wiederverwenden oder ein eindeutiges Zertifikat für jeden Mandanten bereitstellen und nutzen.
Schritt 3: Konfigurieren eines virtuellen Netzwerks für Verschlüsselung
In diesem Schritt wird davon ausgegangen, dass Sie bereits ein virtuelles Netzwerk namens „My Network“ erstellt haben, das mindestens ein virtuelles Subnetz enthält. Informationen zum Erstellen virtueller Netzwerke finden Sie unter Erstellen, Löschen oder Aktualisieren von virtuellen Mandantennetzwerken.
Hinweis
Bei der Kommunikation mit einer anderen VM im selben Subnetz wird Datenverkehr automatisch verschlüsselt, unabhängig davon, ob er aktuell oder zu einem späteren Zeitpunkt verbunden ist.
Rufen Sie die virtuellen Netzwerk- und Anmeldeinformationenobjekte vom Netzwerkcontroller ab:
$vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork" $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
Fügen Sie einen Verweis auf die Zertifikatanmeldeinformationen hinzu, und aktivieren Sie Verschlüsselung für einzelne Subnetze:
$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
Fügen Sie das aktualisierte virtuelle Netzwerkobjekt in den Netzwerkcontroller ein:
New-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId $vnet.ResourceId -Properties $vnet.Properties -force
Herzlichen Glückwunsch!* Sie haben es geschafft, sobald Sie diese Schritte ausgeführt haben.