Delen via


Versleuteling configureren voor een virtueel subnet

Met versleuteling van virtueel netwerk kunt u versleuteling van virtueel netwerkverkeer tussen VM's die met elkaar communiceren binnen subnetten die zijn gemarkeerd als 'Versleuteling ingeschakeld'. Het maakt ook gebruik van Datagram Transport Layer Security (DTLS) op het virtuele subnet om pakketten te versleutelen. DTLS beschermt tegen afluisteren, knoeien en vervalsing door iedereen met toegang tot het fysieke netwerk.

Voor versleuteling van virtuele netwerken is het volgende vereist:

  • Versleutelingscertificaten die zijn geïnstalleerd op elk van de SDN-Hyper-V hosts.
  • Een referentieobject in de netwerkcontroller verwijst naar de vingerafdruk van dat certificaat.
  • Configuratie voor elk van de virtuele netwerken bevat subnetten waarvoor versleuteling is vereist.

Zodra u versleuteling voor een subnet inschakelt, wordt al het netwerkverkeer binnen dat subnet automatisch versleuteld, naast versleuteling op toepassingsniveau die ook kan plaatsvinden. Verkeer dat tussen subnetten wordt gekruist, zelfs als ze zijn gemarkeerd als versleuteld, wordt automatisch niet-versleuteld verzonden. Verkeer dat de grens van het virtuele netwerk overschrijdt, wordt ook niet-versleuteld verzonden.

Opmerking

Wanneer u communiceert met een andere VIRTUELE machine in hetzelfde subnet, ongeacht of het momenteel is verbonden of op een later tijdstip is verbonden, wordt het verkeer automatisch versleuteld.

Aanbeveling

Als u toepassingen alleen moet beperken tot communicatie op het versleutelde subnet, kunt u alleen toegangsbeheerlijsten (ACL's) gebruiken om communicatie binnen het huidige subnet toe te staan. Zie Toegangsbeheerlijsten (ACL's) gebruiken voor het beheren van de netwerkverkeersstroom van datacenters voor meer informatie.

Stap 1: Het versleutelingscertificaat maken

Op elke host moet een versleutelingscertificaat zijn geïnstalleerd. U kunt hetzelfde certificaat gebruiken voor alle tenants of een unieke voor elke tenant genereren.

  1. Het certificaat genereren

    $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, "")
    

    Nadat het script is uitgevoerd, wordt er een nieuw certificaat weergegeven in Mijn opslag:

    PS D:\> dir cert:\\localmachine\my
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my
    
    Thumbprint                                Subject
    ----------                                -------
    84857CBBE7A1C851A80AE22391EB2C39BF820CE7  CN=MyNetwork
    5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6  CN=EncryptedVirtualNetworks
    
  2. Exporteer het certificaat naar een bestand.

    U hebt twee kopieën van het certificaat nodig, één met de persoonlijke sleutel en één zonder.

    $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. Installeer de certificaten op elk van uw 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
    
  4. Installeren op een 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
    }
    
  5. Herhaal dit voor elke server in uw omgeving.

    Nadat u voor elke server hebt herhaald, moet er een certificaat zijn geïnstalleerd in de hoofdmap en mijn archief van elke Hyper-V host.

  6. Controleer de installatie van het certificaat.

    Controleer de certificaten door de inhoud van de Mijn- en Root-certificaatarchieven te controleren:

    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. Noteer de vingerafdruk.

    U moet een notitie maken van de vingerafdruk omdat u deze nodig hebt om het certificaatreferentieobject in de netwerkcontroller te maken.

Stap 2: de certificaatreferentie maken

Nadat u het certificaat hebt geïnstalleerd op elk van de Hyper-V hosts die zijn verbonden met de netwerkcontroller, moet u nu de netwerkcontroller configureren om het te gebruiken. Hiervoor moet u een referentieobject maken met de vingerafdruk van het certificaat van de computer waarop de PowerShell-modules van de netwerkcontroller zijn geïnstalleerd.

///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

Aanbeveling

U kunt deze referentie opnieuw gebruiken voor elk versleuteld virtueel netwerk of u kunt een uniek certificaat voor elke tenant implementeren en gebruiken.

Stap 3: een virtueel netwerk configureren voor versleuteling

In deze stap wordt ervan uitgegaan dat u al een virtuele netwerknaam 'Mijn netwerk' hebt gemaakt en dat deze ten minste één virtueel subnet bevat. Raadpleeg Virtuele netwerken voor tenants maken, verwijderen of bijwerken voor meer informatie over het maken van virtuele netwerken.

Opmerking

Wanneer u communiceert met een andere VIRTUELE machine in hetzelfde subnet, ongeacht of het momenteel is verbonden of op een later tijdstip is verbonden, wordt het verkeer automatisch versleuteld.

  1. Haal het virtuele netwerk en referentieobjecten op van de netwerkcontroller:

    $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork"
    $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
    
  2. Voeg een verwijzing naar de certificaatreferentie toe en schakel versleuteling in voor afzonderlijke subnetten:

    $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. Plaats het bijgewerkte virtual network-object in de netwerkcontroller:

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

Gefeliciteerd!* U bent klaar zodra u deze stappen hebt voltooid.