Configurare la crittografia per una subnet virtuale
La crittografia di rete virtuale consente la crittografia del traffico di rete virtuale tra le macchine virtuali che comunicano tra loro all'interno di subnet contrassegnate come 'Crittografia abilitata'. Viene inoltre utilizzato Datagram Transport Layer Security (DTLS) nella subnet virtuale per crittografare i pacchetti. DTLS impedisce intercettazioni, manomissioni e contraffazioni da parte di chiunque abbia accesso alla rete fisica.
Crittografia di rete virtuale richiede:
- Certificati di crittografia installati in ogni host Hyper-V abilitato per SDN.
- Un oggetto credenziali nel Controller di rete che faccia riferimento all'identificazione personale di tale certificato.
- La configurazione in ognuna delle reti virtuali contiene subnet che richiedono la crittografia.
Una volta abilitata la crittografia su una subnet, tutto il traffico di rete in tale subnet viene crittografato automaticamente, oltre a qualsiasi crittografia a livello di applicazione che può verificarsi. Il traffico che transita tra le subnet, anche se contrassegnate come crittografate, viene inviato automaticamente non crittografato. Anche il traffico interno ai confini della rete virtuale viene inviato non crittografato.
Nota
Durante la comunicazione con un'altra macchina virtuale nella stessa subnet, che sia attualmente connessa o connessa in un secondo momento, il traffico viene crittografato automaticamente.
Suggerimento
Se occorre limitare le applicazioni affinché comunichino solo nella subnet crittografata, è possibile usare gli elenchi di controllo di accesso (ACL) per consentire le comunicazioni solo nella subnet corrente. Per alte informazioni, vedere Usare elenchi di controllo di accesso (ACL) per gestire il flusso del traffico di rete del data center.
Passaggio 1: Creare il certificato di crittografia
In ogni host deve essere installato un certificato di crittografia. È possibile usare lo stesso certificato per tutti i tenant o generarne uno univoco per ogni tenant.
Generare il certificato
$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, "")
Dopo aver eseguito lo script, viene visualizzato un nuovo certificato nell'archivio personale:
PS D:\> dir cert:\\localmachine\my PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my Thumbprint Subject ---------- ------- 84857CBBE7A1C851A80AE22391EB2C39BF820CE7 CN=MyNetwork 5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6 CN=EncryptedVirtualNetworks
Esportare il certificato in un file.
Sono necessarie due copie del certificato, una con la chiave privata e una senza.
$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
Installare i certificati in ognuno degli host 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
Installazione in un 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 }
Ripetere la procedura per ogni server nell'ambiente.
Dopo aver ripetuto la procedura per ogni server, dovrebbe essere presente un certificato installato nella radice e nell'archivio personale di ogni host Hyper-V.
Verificare l'installazione del certificato.
Verificare i certificati controllando il contenuto negli archivi certificati personale e radice:
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
Prendere nota dell'identificazione personale.
È necessario prendere nota dell'identificazione personale perché è necessaria per creare l'oggetto credenziali del certificato nel controller di rete.
Passaggio 2: Creare le credenziali del certificato
Dopo aver installato il certificato in ognuno degli host Hyper-V connessi al controller di rete, è necessario configurare il controller di rete per usarlo. A tale scopo, è necessario creare un oggetto credenziali contenente l'identificazione personale del certificato dal computer con i moduli PowerShell del controller di rete installati.
///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
Suggerimento
È possibile riutilizzare queste credenziali per ogni rete virtuale crittografata oppure distribuire e usare un certificato univoco per ogni tenant.
Passaggio 3: Configurazione di una rete virtuale per la crittografia
Questo passaggio presuppone che sia già stato creato un nome di rete virtuale "My Network" e che contenga almeno una subnet virtuale. Per informazioni su come creare le reti virtuali, vedere Creare, eliminare o aggiornare le reti virtuali del tenant.
Nota
Durante la comunicazione con un'altra macchina virtuale nella stessa subnet, che sia attualmente connessa o connessa in un secondo momento, il traffico viene crittografato automaticamente.
Recuperare gli oggetti rete virtuale e credenziali dal controller di rete:
$vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork" $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
Aggiungere un riferimento alle credenziali del certificato e abilitare la crittografia nelle singole subnet:
$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
Posizionare l'oggetto rete virtuale aggiornato nel controller di rete:
New-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId $vnet.ResourceId -Properties $vnet.Properties -force
Congratulazioni!* Dopo aver completato questi passaggi la procedura è terminata.