Bagikan melalui


Mengonfigurasi Enkripsi untuk Subnet Virtual

Berlaku untuk: Windows Server 2022, Windows Server 2019, Windows Server 2016, Azure Stack HCI, versi 21H2 dan 20H2

Enkripsi jaringan virtual memungkinkan enkripsi lalu lintas jaringan virtual antara VM yang berkomunikasi satu sama lain dalam subnet yang ditandai sebagai 'Enkripsi Diaktifkan.' Ini juga menggunakan Datagram Transport Layer Security (DTLS) pada subnet virtual untuk mengenkripsi paket. DTLS melindungi dari penyadapan, perubah, dan pemalsuan oleh siapa pun yang memiliki akses ke jaringan fisik.

Enkripsi jaringan virtual memerlukan:

  • Sertifikat enkripsi yang diinstal pada setiap host Hyper-V dengan dukungan SDN.
  • Objek kredensial di Pengontrol Jaringan yang merujuk pada thumbprint sertifikat tersebut.
  • Konfigurasi pada setiap Virtual Network berisi subnet yang memerlukan enkripsi.

Setelah Anda mengaktifkan enkripsi pada subnet, semua lalu lintas jaringan dalam subnet tersebut dienkripsi secara otomatis, selain enkripsi tingkat aplikasi apa pun yang mungkin juga terjadi. Lalu lintas yang melintasi antar subnet, bahkan jika ditandai sebagai terenkripsi, dikirim tanpa terenkripsi secara otomatis. Setiap lalu lintas yang melintasi batas jaringan virtual juga akan dikirim tanpa terenkripsi.

Catatan

Saat berkomunikasi dengan VM lain pada subnet yang sama, apakah saat ini terhubung atau terhubung di lain waktu, lalu lintas akan dienkripsi secara otomatis.

Tip

Jika Anda harus membatasi aplikasi untuk hanya berkomunikasi pada subnet terenkripsi, Anda dapat menggunakan Daftar Kontrol Akses (ACL) hanya untuk mengizinkan komunikasi dalam subnet saat ini. Untuk informasi selengkapnya, lihat Menggunakan Daftar Kontrol Akses (ACL) untuk Mengelola Arus Lalu Lintas Jaringan Pusat Data.

Langkah 1: Buat Sertifikat Enkripsi

Setiap host harus memiliki sertifikat enkripsi yang terinstal. Anda dapat menggunakan sertifikat yang sama untuk semua penyewa atau menghasilkan yang unik untuk setiap penyewa.

  1. Buat sertifikat

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

    Setelah menjalankan skrip, sertifikat baru muncul di Penyimpanan saya:

    PS D:\> dir cert:\\localmachine\my
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my
    
    Thumbprint                                Subject
    ----------                                -------
    84857CBBE7A1C851A80AE22391EB2C39BF820CE7  CN=MyNetwork
    5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6  CN=EncryptedVirtualNetworks
    
  2. Ekspor sertifikat ke file.

    Anda memerlukan dua salinan sertifikat, satu dengan kunci privat dan satu tanpa.

    $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. Instal sertifikat pada setiap host hyper-v Anda

    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. Menginstal pada host 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. Ulangi untuk setiap server di lingkungan Anda.

    Setelah mengulangi untuk setiap server, Anda harus memiliki sertifikat yang diinstal di root dan penyimpanan saya dari setiap host Hyper-V.

  6. Verifikasi penginstalan sertifikat.

    Verifikasi sertifikat dengan memeriksa konten penyimpanan sertifikat Saya dan Root:

    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. Catat Thumbprint.

    Anda harus mencatat thumbprint karena Anda membutuhkannya untuk membuat objek kredensial sertifikat di pengontrol jaringan.

Langkah 2: Buat Kredensial Sertifikat

Setelah Anda menginstal sertifikat pada setiap host Hyper-V yang terhubung ke pengontrol jaringan, Anda sekarang harus mengonfigurasi pengontrol jaringan untuk menggunakannya. Untuk melakukan ini, Anda harus membuat objek kredensial yang berisi thumbprint sertifikat dari komputer dengan modul PowerShell Pengontrol Jaringan terinstal.

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

Tip

Anda dapat menggunakan kembali kredensial ini untuk setiap jaringan virtual terenkripsi, atau Anda dapat menyebarkan dan menggunakan sertifikat unik untuk setiap penyewa.

Langkah 3: Mengonfigurasi Virtual Network untuk Enkripsi

Langkah ini mengasumsikan Anda telah membuat nama jaringan virtual "Jaringan Saya" dan berisi setidaknya satu subnet virtual. Untuk informasi tentang membuat jaringan virtual, lihat Membuat, Menghapus, atau Memperbarui Jaringan Virtual Penyewa.

Catatan

Saat berkomunikasi dengan VM lain pada subnet yang sama, apakah saat ini terhubung atau terhubung di lain waktu, lalu lintas akan dienkripsi secara otomatis.

  1. Ambil objek Virtual Network dan Kredensial dari pengontrol jaringan:

    $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork"
    $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
    
  2. Tambahkan referensi ke kredensial sertifikat dan aktifkan enkripsi pada subnet individual:

    $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. Masukkan objek Virtual Network yang diperbarui ke dalam pengontrol jaringan:

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

Selamat!* Anda selesai setelah menyelesaikan langkah-langkah ini.