Partager via


Configurer le chiffrement pour un sous-réseau virtuel

S’applique à : Windows Server 2022, Windows Server 2019, Windows Server 2016, Azure Stack HCI versions 21H2 et 20H2

Le chiffrement des réseaux virtuels permet de chiffrer le trafic de réseau virtuel entre des machines virtuelles qui communiquent entre elles au sein des sous-réseaux marqués comme « Chiffrement activé ». Il utilise aussi le protocole DTLS (Datagram Transport Layer Security) sur le sous-réseau virtuel pour chiffrer les paquets. DTLS protège contre les écoutes clandestines, l’altération et la falsification par toute personne ayant accès au réseau physique.

Le chiffrement de réseau virtuel nécessite :

  • Certificats de chiffrement installés sur chacun des hôtes Hyper-V avec SDN.
  • Objet d’informations d’identification dans le contrôleur de réseau référençant l’empreinte numérique de ce certificat.
  • La configuration sur chacun des réseaux virtuels contient des sous-réseaux qui nécessitent un chiffrement.

Une fois que vous avez activé le chiffrement sur un sous-réseau, tout le trafic réseau au sein de ce sous-réseau est chiffré automatiquement, en plus de tout chiffrement au niveau de l’application qui peut également avoir lieu. Le trafic qui traverse les sous-réseaux, même s’il est marqué comme chiffré, est envoyé automatiquement non chiffré. Tout trafic qui franchit la délimitation du réseau virtuel est également envoyé non chiffré.

Remarque

Lors de la communication avec une autre machine virtuelle sur le même sous-réseau, qu’elle soit actuellement connectée ou connectée ultérieurement, le trafic est chiffré automatiquement.

Conseil

Si vous devez restreindre les applications pour qu’elles communiquent uniquement sur le sous-réseau chiffré, vous pouvez utiliser des listes de contrôle d’accès (ACL) pour autoriser uniquement la communication au sein du sous-réseau actuel. Pour plus d’informations, consultez Utiliser des listes de contrôle d’accès (ACL) pour gérer le flux de trafic réseau du centre de données.

Étape 1 : Créer le certificat de chiffrement

Un certificat de chiffrement doit être installé sur chaque hôte. Vous pouvez utiliser le même certificat pour tous les clients ou en générer un unique pour chaque client.

  1. Générer le certificat

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

    Après l’exécution du script, un nouveau certificat s’affiche dans mon magasin :

    PS D:\> dir cert:\\localmachine\my
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my
    
    Thumbprint                                Subject
    ----------                                -------
    84857CBBE7A1C851A80AE22391EB2C39BF820CE7  CN=MyNetwork
    5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6  CN=EncryptedVirtualNetworks
    
  2. Exportez le certificat vers un fichier.

    Vous avez besoin de deux copies du certificat, l’une avec la clé privée et l’autre sans.

    $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. Installer les certificats sur chacun de vos hôtes 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
    
  4. Installation sur un hôte 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. Répétez cette opération pour chaque serveur de votre environnement.

    Après la répétition pour chaque serveur, vous devez avoir un certificat installé à la racine et dans mon magasin de chaque hôte Hyper-V.

  6. Vérifiez l’installation du certificat.

    Vérifiez les certificats en vérifiant le contenu des magasins de certificats My et 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. Notez l’empreinte numérique.

    Vous devez noter l’empreinte numérique, car vous en avez besoin pour créer l’objet d’informations d’identification de certificat dans le contrôleur de réseau.

Étape 2 : Créer les informations d’identification du certificat

Après avoir installé le certificat sur chacun des hôtes Hyper-V connectés au contrôleur de réseau, vous devez maintenant configurer le contrôleur de réseau pour l’utiliser. Pour ce faire, vous devez créer un objet d’informations d’identification contenant l’empreinte numérique du certificat de l’ordinateur sur lequel les modules PowerShell du contrôleur de réseau sont installés.

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

Conseil

Vous pouvez réutiliser ces informations d’identification pour chaque réseau virtuel chiffré, ou vous pouvez déployer et utiliser un certificat unique pour chaque client.

Étape 3 : Configuration d’un réseau virtuel pour le chiffrement

Cette étape suppose que vous avez déjà créé un nom de réseau virtuel « Mon réseau » et qu’il contient au moins un sous-réseau virtuel. Pour plus d’informations sur la création de réseaux virtuels, consultez Créer, supprimer ou mettre à jour des réseaux virtuels de client.

Notes

Lors de la communication avec une autre machine virtuelle sur le même sous-réseau, qu’elle soit actuellement connectée ou connectée ultérieurement, le trafic est chiffré automatiquement.

  1. Récupérez les objets Réseau virtuel et Informations d’identification à partir du contrôleur de réseau :

    $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork"
    $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
    
  2. Ajoutez une référence aux informations d’identification du certificat et activez le chiffrement sur des sous-réseaux individuels :

    $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. Placez l’objet Réseau virtuel mis à jour dans le contrôleur de réseau :

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

Félicitations !* Vous avez terminé une fois que vous avez effectué ces étapes.