Dela via


Konfigurera kryptering för ett virtuellt undernät

Kryptering av virtuella nätverk möjliggör kryptering av trafik i virtuella nätverk mellan virtuella datorer som kommunicerar med varandra i undernät som har markerats som "Kryptering aktiverat". Den använder också Datagram Transport Layer Security (DTLS) i det virtuella undernätet för att kryptera paket. DTLS skyddar mot avlyssning, manipulering och förfalskning av alla som har åtkomst till det fysiska nätverket.

Kryptering av virtuella nätverk kräver:

  • Krypteringscertifikat installerade på var och en av de SDN-aktiverade Hyper-V värdar.
  • Ett autentiseringsobjekt i nätverksstyrenheten som refererar till tumavtrycket för certifikatet.
  • Konfigurationen för vart och ett av de virtuella nätverken innehåller undernät som kräver kryptering.

När du aktiverar kryptering i ett undernät krypteras all nätverkstrafik i undernätet automatiskt, förutom kryptering på programnivå som också kan äga rum. Trafik som korsar mellan undernät, även om den är markerad som krypterad, skickas okrypterad automatiskt. All trafik som korsar gränsen för det virtuella nätverket skickas också okrypterad.

Note

När du kommunicerar med en annan virtuell dator i samma undernät, oavsett om den är ansluten eller ansluten vid ett senare tillfälle, krypteras trafiken automatiskt.

Tip

Om du måste begränsa program till att endast kommunicera i det krypterade undernätet kan du endast använda åtkomstkontrollistor (ACL) för att tillåta kommunikation inom det aktuella undernätet. Mer information finns i Använda åtkomstkontrollistor (ACL: er) för att hantera datacenternätverkstrafikflöde.

Steg 1: Skapa krypteringscertifikatet

Varje värd måste ha ett krypteringscertifikat installerat. Du kan använda samma certifikat för alla hyrande eller generera ett unikt certifikat för varje hyrande.

  1. Generera certifikatet

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

    När du har kört skriptet visas ett nytt certifikat i Min butik.

    PS D:\> dir cert:\\localmachine\my
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my
    
    Thumbprint                                Subject
    ----------                                -------
    84857CBBE7A1C851A80AE22391EB2C39BF820CE7  CN=MyNetwork
    AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00  CN=EncryptedVirtualNetworks
    
  2. Exportera certifikatet till en fil.

    Du behöver två kopior av certifikatet, en med den privata nyckeln och en utan.

    $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. Installera certifikaten på var och en av dina hyper-v-värdar

    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. Installera på en Hyper-V värd

    $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. Upprepa för varje server i din miljö.

    När du har upprepat för varje server bör du ha ett certifikat installerat i roten och mitt lager för varje Hyper-V värd.

  6. Kontrollera installationen av certifikatet.

    Verifiera certifikaten genom att kontrollera innehållet i mina och rotcertifikatarkiven:

    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
    ----------                                -------
    AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00  CN=EncryptedVirtualNetworks
    
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\root
    
    Thumbprint                                Subject
    ----------                                -------
    AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00  CN=EncryptedVirtualNetworks
    
  7. Anteckna tumavtrycket.

    Du måste anteckna tumavtrycket eftersom du behöver det för att skapa certifikatautentiseringsobjektet i nätverksstyrenheten.

Steg 2: Skapa certifikatautentiseringsuppgifterna

När du har installerat certifikatet på var och en av de Hyper-V värdar som är anslutna till nätverksstyrenheten måste du nu konfigurera nätverksstyrenheten så att den används. För att göra detta måste du skapa ett autentiseringsobjekt som innehåller certifikatets tumavtryck från datorn med PowerShell-modulerna för nätverksstyrenhet installerade.

///Replace with the thumbprint from your certificate
$thumbprint = "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"

$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

Tip

Du kan återanvända den här autentiseringsuppgiften för varje krypterat virtuellt nätverk, eller så kan du distribuera och använda ett unikt certifikat för varje klientorganisation.

Steg 3: Konfigurera ett virtuellt nätverk för kryptering

Det här steget förutsätter att du redan har skapat ett virtuellt nätverksnamn "Mitt nätverk" och att det innehåller minst ett virtuellt undernät. Information om hur du skapar virtuella nätverk finns i Skapa, Ta bort eller Uppdatera virtuella klientnätverk.

Note

När du kommunicerar med en annan virtuell dator i samma undernät, oavsett om den är ansluten eller ansluten vid ett senare tillfälle, krypteras trafiken automatiskt.

  1. Hämta objekten Virtual Network och Credential från nätverksstyrenheten:

    $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork"
    $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
    
  2. Lägg till en referens till certifikatautentiseringsuppgifterna och aktivera kryptering i enskilda undernät:

    $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. Placera det uppdaterade virtual network-objektet i nätverksstyrenheten:

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

Grattis!* Du är klar när du har slutfört de här stegen.