Share via


가상 서브넷에 대한 암호화 구성

적용 대상: Windows Server 2022, Windows Server 2019, Windows Server 2016, Azure Stack HCI, 버전 21H2 및 20H2

가상 네트워크 암호화를 사용하면 '암호화 사용'으로 표시된 서브넷 내에서 서로 통신하는 VM 간에 가상 네트워크 트래픽을 암호화할 수 있습니다. 또한 가상 서브넷의 DTLS(데이터그램 전송 계층 보안)를 활용하여 패킷을 암호화합니다. DTLS는 실제 네트워크에 액세스하는 누군가에 의한 도청, 변조 및 위조를 방지합니다.

가상 네트워크 암호화에는 다음이 필요합니다.

  • 각 SDN 지원 Hyper-V 호스트에 설치된 암호화 인증서입니다.
  • 해당 인증서의 지문을 참조하는 네트워크 컨트롤러의 자격 증명 개체입니다.
  • 각 Virtual Network의 구성에는 암호화가 필요한 서브넷이 포함됩니다.

서브넷에서 암호화를 사용하도록 설정하면 해당 서브넷 내의 모든 네트워크 트래픽은 애플리케이션 수준 암호화 외에도 자동으로 암호화됩니다. 암호화된 것으로 표시되더라도 서브넷 간에 교차하는 트래픽은 자동으로 암호화되지 않은 상태로 전송됩니다. 가상 네트워크 경계를 넘어가는 모든 트래픽도 암호화되지 않은 상태로 전송됩니다.

참고 항목

동일한 서브넷에서 다른 VM과 통신할 때 현재 연결되었든 나중에 연결되었든 간에 트래픽은 자동으로 암호화됩니다.

암호화된 서브넷에서만 통신하도록 애플리케이션을 제한해야 하는 경우 ACL(액세스 제어 목록)을 사용하여 현재 서브넷 내에서 통신을 허용할 수 있습니다. 자세한 내용은 ACL(액세스 제어 목록)을 사용하여 데이터 센터 네트워크 트래픽 흐름을 관리합니다.

1단계: 암호화 인증서 만들기

각 호스트에는 암호화 인증서가 설치되어 있어야 합니다. 모든 테넌트에 대해 동일한 인증서를 사용하거나 각 테넌트에 대해 고유한 인증서를 생성할 수 있습니다.

  1. 인증서 생성

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

    스크립트를 실행하면 내 저장소에 새 인증서가 나타납니다.

    PS D:\> dir cert:\\localmachine\my
    PSParentPath: Microsoft.PowerShell.Security\Certificate::localmachine\my
    
    Thumbprint                                Subject
    ----------                                -------
    84857CBBE7A1C851A80AE22391EB2C39BF820CE7  CN=MyNetwork
    5EFF2CE51EACA82408572A56AE1A9BCC7E0843C6  CN=EncryptedVirtualNetworks
    
  2. 인증서를 파일로 내보냅니다.

    인증서 복사본 2개가 필요합니다. 하나는 프라이빗 키가 있고 다른 하나는 없는 복사본입니다.

    $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. 각 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. 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. 사용자 환경의 각 서버에 대해 반복합니다.

    각 서버에 대해 반복한 후에는 각 Hyper-V 호스트의 루트 및 내 저장소에 인증서가 설치되어 있어야 합니다.

  6. 인증서 설치를 확인합니다.

    My 및 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. 지문을 기록해 둡니다.

    네트워크 컨트롤러에서 인증서 자격 증명 개체를 만들어야 하므로 지문을 기록해야 합니다.

2단계: 인증서 자격 증명 만들기

네트워크 컨트롤러에 연결된 각 Hyper-V 호스트에 인증서를 설치한 후에는 해당 인증서를 사용하도록 네트워크 컨트롤러를 구성해야 합니다. 이렇게 하려면 네트워크 컨트롤러 PowerShell 모듈이 설치된 컴퓨터의 인증서 지문이 포함된 자격 증명 개체를 만들어야 합니다.

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

암호화된 각 가상 네트워크에 대해 이 자격 증명을 다시 사용하거나 각 테넌트에 고유한 인증서를 배포하고 사용할 수 있습니다.

3단계: 암호화를 위한 Virtual Network 구성

이 단계에서는 이미 가상 네트워크 이름 "내 네트워크"를 만들었으며 하나 이상의 가상 서브넷이 포함되어 있다고 가정합니다. 가상 네트워크를 만드는 방법에 대한 자세한 내용은 테넌트 가상 네트워크 만들기, 삭제 또는 업데이트를 참조 하세요.

참고 항목

동일한 서브넷에서 다른 VM과 통신할 때 현재 연결되었든 나중에 연결되었든 간에 트래픽은 자동으로 암호화됩니다.

  1. 네트워크 컨트롤러에서 Virtual Network 및 자격 증명 개체를 검색합니다.

    $vnet = Get-NetworkControllerVirtualNetwork -ConnectionUri $uri -ResourceId "MyNetwork"
    $certcred = Get-NetworkControllerCredential -ConnectionUri $uri -ResourceId "EncryptedNetworkCertificate"
    
  2. 인증서 자격 증명에 대한 참조를 추가하고 개별 서브넷에서 암호화를 사용하도록 설정합니다.

    $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. 업데이트된 Virtual Network 개체를 네트워크 컨트롤러에 넣습니다.

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

축!* 이 단계를 완료하면 완료됩니다.