Share via


MOF Dosyasının Güvenliğini Sağlama

Şunlar için geçerlidir: Windows PowerShell 4.0, Windows PowerShell 5.0

DSC, yerel Configuration Manager (LCM) istenen bitiş durumunu uyguladığı bir MOF dosyasında depolanan bilgileri uygulayarak sunucu düğümlerinin yapılandırmasını yönetir. Bu dosya yapılandırmanın ayrıntılarını içerdiğinden, güvenli tutulması önemlidir. Bu makalede, hedef düğümün dosyayı şifrelediğinden nasıl emin olunması açıklanır.

PowerShell sürüm 5.0'dan başlayarak, cmdlet'i kullanılarak Start-DSCConfiguration düğüme uygulandığında MOF dosyasının tamamı varsayılan olarak şifrelenir. Bu makalede açıklanan işlem, yalnızca sertifikalar yönetilmediğinde çekme hizmeti protokolünü kullanan bir çözüm uygulanırken, hedef düğüm tarafından indirilen yapılandırmaların uygulanmadan önce sistem tarafından şifrelerinin çözülmesini ve okunabilmesini sağlamak için gereklidir (örneğin, Windows Server'da kullanılabilen çekme hizmeti). Azure Otomasyonu DSC'ye kayıtlı düğümlerde otomatik olarak sertifikalar yüklenir ve yönetim yükü gerekmeyen hizmet tarafından yönetilir.

Not

Bu konuda şifreleme için kullanılan sertifikalar açıklanmaktadır. Şifreleme için otomatik olarak imzalanan bir sertifika yeterlidir çünkü özel anahtar her zaman gizli tutulur ve şifreleme belgenin güveni anlamına gelmez. Kimlik doğrulaması amacıyla otomatik olarak imzalanan sertifikalar kullanılmamalıdır. Herhangi bir kimlik doğrulaması amacıyla güvenilen bir Sertifika Yetkilisi'nden (CA) sertifika kullanmanız gerekir.

Önkoşullar

DSC yapılandırmasını güvenli hale getirmek için kullanılan kimlik bilgilerini başarıyla şifrelemek için aşağıdakilere sahip olduğunuzdan emin olun:

  • Sertifikaları verme ve dağıtmanın bazı yöntemleri. Bu konu başlığı ve örnekleri, Active Directory Sertifika Yetkilisi kullandığınızı varsayar. Active Directory Sertifika Hizmetleri hakkında daha fazla arka plan bilgisi için bkz. Active Directory Sertifika Hizmetlerine Genel Bakış.
  • Hedef düğüme veya düğümlere yönetim erişimi.
  • Her hedef düğümün Kişisel Deposunu kaydeden şifreleme özellikli bir sertifikası vardır. Windows PowerShell'da, deponun yolu Cert:\LocalMachine\My şeklindedir. Bu konudaki örneklerde , Varsayılan Sertifika Şablonları'nda bulabileceğiniz (diğer sertifika şablonlarıyla birlikte) "iş istasyonu kimlik doğrulaması" şablonu kullanılır.
  • Bu yapılandırmayı hedef düğüm dışındaki bir bilgisayarda çalıştıracaksanız sertifikanın ortak anahtarını dışarı aktarın ve ardından yapılandırmayı çalıştıracağınız bilgisayara aktarın. Yalnızca ortak anahtarı dışarı aktardığınızdan emin olun; özel anahtarı güvenli tutun.

Not

Betik Kaynaklarının şifreleme konusunda sınırlamaları vardır. Daha fazla bilgi için bkz . Betik Kaynağı

Genel işlem

  1. Sertifikaları, anahtarları ve parmak izlerini ayarlayın; her hedef düğümün sertifikanın kopyalarını ve yapılandırma bilgisayarında ortak anahtar ve parmak izi olduğundan emin olun.
  2. Ortak anahtarın yolunu ve parmak izini içeren bir yapılandırma veri bloğu oluşturun.
  3. Sertifikayı ve parmak izini kullanarak yapılandırma verilerinin şifresini çözmek için Yerel Yapılandırma yöneticisine komut vererek hedef düğümler için istediğiniz yapılandırmayı tanımlayan ve hedef düğümlerde şifre çözmeyi ayarlayan bir yapılandırma betiği oluşturun.
  4. Yerel Configuration Manager ayarlarını ayarlayıp DSC yapılandırmasını başlatan yapılandırmayı çalıştırın.

Kimlik bilgisi şifrelemesi için işlem akışı

Sertifika Gereksinimleri

Kimlik bilgisi şifrelemesini uygulamak için, DSC yapılandırmasını yazmak için kullanılan bilgisayar tarafından güvenilenHedef Düğümde bir ortak anahtar sertifikası bulunmalıdır. Bu ortak anahtar sertifikasının DSC kimlik bilgisi şifrelemesi için kullanılması için belirli gereksinimleri vardır:

  1. Anahtar Kullanımı:
    • Şu bilgileri içermelidir: 'KeyEncipherment' ve 'DataEncipherment'.
    • İçermemelidir: 'Dijital İmza'.
  2. Gelişmiş Anahtar Kullanımı:
    • İçermelidir: Belge Şifrelemesi (1.3.6.1.4.1.311.80.1).
    • İçermemelidir: İstemci Kimlik Doğrulaması (1.3.6.1.5.5.7.3.2) ve Sunucu Kimlik Doğrulaması (1.3.6.1.5.5.7.3.1).
  3. Sertifikanın Özel Anahtarı * Hedef Node_ kullanılabilir.
  4. Sertifikanın Sağlayıcısı "Microsoft RSA SChannel Şifreleme Sağlayıcısı" olmalıdır.

Önemli

Anahtar Kullanımı 'Dijital İmza' veya Kimlik Doğrulaması EKU'larından birini içeren bir sertifika kullanabilirsiniz ancak bu, şifreleme anahtarının daha kolay kötüye kullanılmasını ve saldırılara karşı savunmasız olmasını sağlar. Bu nedenle, bu Anahtar Kullanımı ve EKU'ları atlayan DSC kimlik bilgilerinin güvenliğini sağlamak amacıyla özel olarak oluşturulmuş bir sertifika kullanmak en iyi yöntemdir.

Hedef Düğümde bu ölçütleri karşılayan tüm mevcut sertifikalar, DSC kimlik bilgilerinin güvenliğini sağlamak için kullanılabilir.

Sertifika oluşturma

Gerekli Şifreleme Sertifikasını (ortak-özel anahtar çifti) oluşturmak ve kullanmak için kullanabileceğiniz iki yaklaşım vardır.

  1. Hedef Düğümde oluşturun ve yalnızca ortak anahtarı Yazma Düğümüne dışarı aktarın
  2. Yazma Düğümünde oluşturun ve anahtar çiftinin tamamını Hedef Düğüme aktarın

Yöntem 1 önerilir çünkü MOF'daki kimlik bilgilerinin şifresini çözmek için kullanılan özel anahtar her zaman Hedef Düğümde kalır.

Hedef Düğümde Sertifika Oluşturma

Özel anahtar gizli tutulmalıdır, çünkü Hedef Düğümdeki MOF'nin şifresini çözmek için kullanılır Bunu yapmanın en kolay yolu , Hedef Düğümde özel anahtar sertifikası oluşturmak ve ortak anahtar sertifikasını DSC yapılandırmasını bir MOF dosyasına yazmak için kullanılan bilgisayara kopyalamaktır. Aşağıdaki örnek:

  1. Hedef düğümde bir sertifika oluşturur
  2. Hedef düğümde ortak anahtar sertifikasını dışarı aktarır.
  3. ortak anahtar sertifikasını Yazma düğümündeki sertifika depoma aktarır.

Hedef Düğümde: sertifikayı oluşturma ve dışarı aktarma

Hedef Düğüm: Windows Server 2016 ve Windows 10

# note: These steps need to be performed in an Administrator PowerShell session
$cert = New-SelfSignedCertificate -Type DocumentEncryptionCertLegacyCsp -DnsName 'DscEncryptionCert' -HashAlgorithm SHA256
# export the public key certificate
$cert | Export-Certificate -FilePath "$env:temp\DscPublicKey.cer" -Force

Dışarı aktarıldıktan sonra yazma DscPublicKey.cerdüğümüne kopyalanması gerekir.

Yazma Düğümünde: sertifikanın ortak anahtarını içeri aktarma

# Import to the my store
Import-Certificate -FilePath "$env:temp\DscPublicKey.cer" -CertStoreLocation Cert:\LocalMachine\My

Yazma Düğümünde Sertifika Oluşturma

Alternatif olarak, şifreleme sertifikası Yazma Düğümünde oluşturulabilir, özel anahtarla PFX dosyası olarak dışarı aktarılabilir ve ardından Hedef Düğüme aktarılabilir. Bu, Nano Sunucu'da DSC kimlik bilgisi şifrelemesi uygulamak için geçerli yöntemdir. PFX'in güvenliği bir parolayla sağlansa da aktarım sırasında güvenli tutulmalıdır. Aşağıdaki örnek:

  1. Yazma düğümünde bir sertifika oluşturur.
  2. , Yazma düğümündeki özel anahtar dahil olmak üzere sertifikayı dışarı aktarır.
  3. Özel anahtarı Yazma düğümünden kaldırır, ancak ortak anahtar sertifikasını depomda tutar.
  4. özel anahtar sertifikasını Hedef düğümdeki My(Personal) sertifika deposuna aktarır.
    • Hedef düğüm tarafından güvenilir olması için kök depoya eklenmesi gerekir.

Yazma Düğümünde: sertifikayı oluşturma ve dışarı aktarma

Hedef Düğüm: Windows Server 2016 ve Windows 10

# note: These steps need to be performed in an Administrator PowerShell session
$cert = New-SelfSignedCertificate -Type DocumentEncryptionCertLegacyCsp -DnsName 'DscEncryptionCert' -HashAlgorithm SHA256
# export the private key certificate
$mypwd = ConvertTo-SecureString -String "YOUR_PFX_PASSWD" -Force -AsPlainText
$cert | Export-PfxCertificate -FilePath "$env:temp\DscPrivateKey.pfx" -Password $mypwd -Force
# remove the private key certificate from the node but keep the public key certificate
$cert | Export-Certificate -FilePath "$env:temp\DscPublicKey.cer" -Force
$cert | Remove-Item -Force
Import-Certificate -FilePath "$env:temp\DscPublicKey.cer" -CertStoreLocation Cert:\LocalMachine\My

Dışarı aktarıldıktan sonra hedef DscPrivateKey.pfxdüğüme kopyalanması gerekir.

Hedef Düğümde: sertifikanın özel anahtarını güvenilen kök olarak içeri aktarın

# Import to the root store so that it is trusted
$mypwd = ConvertTo-SecureString -String "YOUR_PFX_PASSWD" -Force -AsPlainText
Import-PfxCertificate -FilePath "$env:temp\DscPrivateKey.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password $mypwd > $null

Yapılandırma verileri

Yapılandırma veri bloğu kimlik bilgilerinin, şifreleme araçlarının ve diğer bilgilerin şifrelenip şifrelenmediğini, hangi hedef düğümlerde çalışılıp çalıştırılmayacağını tanımlar. Yapılandırma veri bloğu hakkında daha fazla bilgi için bkz. Yapılandırma ve Ortam Verilerini Ayırma.

Kimlik bilgisi şifrelemesi ile ilgili her düğüm için yapılandırılabilir öğeler şunlardır:

  • NodeName - Kimlik bilgisi şifrelemesinin yapılandırıldığı hedef düğümün adı.
  • PsDscAllowPlainTextPassword - Şifrelenmemiş kimlik bilgilerinin bu düğüme geçirilmesine izin verilip verilmeyeceği. Bu önerilmez.
  • Parmak izi - Hedef Düğümdeki DSC Yapılandırmasında kimlik bilgilerinin şifresini çözmek için kullanılacak sertifikanın parmak izi. Bu sertifika Hedef Düğümdeki Yerel Makine sertifika deposunda bulunmalıdır.
  • CertificateFile - Hedef Düğümün kimlik bilgilerini şifrelemek için kullanılması gereken sertifika dosyası (yalnızca ortak anahtarı içerir). Bu, DER ile kodlanmış ikili X.509 veya Base-64 ile kodlanmış X.509 biçimli bir sertifika dosyası olmalıdır.

Bu örnekte, adlandırılmış targetNode üzerinde işlem yapmak üzere bir hedef düğümü, ortak anahtar sertifika dosyasının yolunu (targetNode.cer adlı) ve ortak anahtarın parmak izini belirten bir yapılandırma veri bloğu gösterilmektedir.

$ConfigData = @{
    AllNodes = @(
        @{
            # The name of the node we are describing
            NodeName        = "targetNode"

            # The path to the .cer file containing the
            # public key of the Encryption Certificate
            # used to encrypt credentials for this node
            CertificateFile = "C:\publicKeys\targetNode.cer"


            # The thumbprint of the Encryption Certificate
            # used to decrypt the credentials on target node
            Thumbprint      = "AC23EA3A9E291A75757A556D0B71CBBF8C4F6FD8"
        }
    )
}

Yapılandırma betiği

Yapılandırma betiğinin kendisinde, kimlik bilgilerinin mümkün olan en kısa süre boyunca depolandığından emin olmak için parametresini kullanın PsCredential . Sağlanan örneği çalıştırdığınızda, DSC sizden kimlik bilgilerini ister ve ardından MOF dosyasını yapılandırma veri bloğundaki hedef düğümle ilişkili CertificateFile kullanarak şifreler. Bu kod örneği, güvenli bir paylaşımdan bir dosyayı kullanıcıya kopyalar.

configuration CredentialEncryptionExample
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PsCredential] $credential
    )

    Node $AllNodes.NodeName
    {
        File exampleFile
        {
            SourcePath = "\\Server\share\path\file.ext"
            DestinationPath = "C:\destinationPath"
            Credential = $credential
        }
    }
}

Şifre çözmeyi ayarlama

Start-DscConfiguration çalışmadan önce, sertifikanın parmak izini doğrulamak için CertificateID kaynağını kullanarak her hedef düğümdeki Yerel Configuration Manager kimlik bilgilerinin şifresini çözmek için hangi sertifikanın kullanılacağını söylemeniz gerekir. Bu örnek işlev uygun yerel sertifikayı bulur (kullanmak istediğiniz sertifikayı tam olarak bulabilmesi için özelleştirmeniz gerekebilir):

# Get the certificate that works for encryption
function Get-LocalEncryptionCertificateThumbprint
{
    (dir Cert:\LocalMachine\my) | %{
        # Verify the certificate is for Encryption and valid
        if ($_.PrivateKey.KeyExchangeAlgorithm -and $_.Verify())
        {
            return $_.Thumbprint
        }
    }
}

Sertifika parmak iziyle tanımlanarak yapılandırma betiği şu değeri kullanacak şekilde güncelleştirilebilir:

configuration CredentialEncryptionExample
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PsCredential] $credential
    )

    Node $AllNodes.NodeName
    {
        File exampleFile
        {
            SourcePath = "\\Server\share\path\file.ext"
            DestinationPath = "C:\destinationPath"
            Credential = $credential
        }

        LocalConfigurationManager
        {
             CertificateId = $node.Thumbprint
        }
    }
}

Yapılandırmayı çalıştırma

Bu noktada, iki dosya çıkışı veren yapılandırmayı çalıştırabilirsiniz:

  • *.meta.mof Yerel makine deposunda depolanan ve parmak iziyle tanımlanan sertifikayı kullanarak kimlik bilgilerinin şifresini çözmek için Yerel Configuration Manager yapılandıran bir dosya. Set-DscLocalConfigurationManager dosyayı uygular *.meta.mof .
  • Yapılandırmayı gerçekten uygulayan bir MOF dosyası. Start-DscConfiguration yapılandırmayı uygular.

Bu komutlar şu adımları gerçekleştirir:

Write-Host "Generate DSC Configuration..."
CredentialEncryptionExample -ConfigurationData $ConfigData -OutputPath .\CredentialEncryptionExample

Write-Host "Setting up LCM to decrypt credentials..."
Set-DscLocalConfigurationManager .\CredentialEncryptionExample -Verbose

Write-Host "Starting Configuration..."
Start-DscConfiguration .\CredentialEncryptionExample -wait -Verbose

Bu örnek, DSC yapılandırmasını hedef düğüme iter. DSC yapılandırması, varsa bir DSC Çekme Sunucusu kullanılarak da uygulanabilir.

DSC Çekme Sunucusu kullanarak DSC yapılandırmalarını uygulama hakkında daha fazla bilgi için bkz. DSC çekme istemcisi ayarlama.

Kimlik Bilgisi Şifreleme Modülü Örneği

Bu adımların tümünü bir araya getiren ve ortak anahtarları dışarı aktaran ve kopyalayan bir yardımcı cmdlet'i içeren tam bir örnek aşağıda verilmiştir:

# A simple example of using credentials
configuration CredentialEncryptionExample
{
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullorEmpty()]
        [PsCredential] $credential
    )

    Node $AllNodes.NodeName
    {
        File exampleFile
        {
            SourcePath = "\\server\share\file.txt"
            DestinationPath = "C:\Users\user"
            Credential = $credential
        }

        LocalConfigurationManager
        {
            CertificateId = $node.Thumbprint
        }
    }
}

# A Helper to invoke the configuration, with the correct public key
# To encrypt the configuration credentials
function Start-CredentialEncryptionExample
{
    [CmdletBinding()]
    param ($computerName)

    [string] $thumbprint = Get-EncryptionCertificate -computerName $computerName -Verbose
    Write-Verbose "using cert: $thumbprint"

    $certificatePath = join-path -Path "$env:SystemDrive\$script:publicKeyFolder" -childPath "$computername.EncryptionCertificate.cer"

    $ConfigData=    @{
        AllNodes = @(
                        @{
                            # The name of the node we are describing
                            NodeName = "$computerName"

                            # The path to the .cer file containing the
                            # public key of the Encryption Certificate
                            CertificateFile = "$certificatePath"

                            # The thumbprint of the Encryption Certificate
                            # used to decrypt the credentials
                            Thumbprint = $thumbprint
                        };
                    );
    }

    Write-Verbose "Generate DSC Configuration..."
    CredentialEncryptionExample -ConfigurationData $ConfigData -OutputPath .\CredentialEncryptionExample `
        -credential (Get-Credential -UserName "$env:USERDOMAIN\$env:USERNAME" -Message "Enter credentials for configuration")

    Write-Verbose "Setting up LCM to decrypt credentials..."
    Set-DscLocalConfigurationManager .\CredentialEncryptionExample -Verbose

    Write-Verbose "Starting Configuration..."
    Start-DscConfiguration .\CredentialEncryptionExample -wait -Verbose
}

#region HelperFunctions

# The folder name for the exported public keys
$script:publicKeyFolder = "publicKeys"

# Get the certificate that works for encryptions
function Get-EncryptionCertificate
{
    [CmdletBinding()]
    param ($computerName)

    $returnValue= Invoke-Command -ComputerName $computerName -ScriptBlock {
        $certificates = dir Cert:\LocalMachine\my

        $certificates | %{
                    # Verify the certificate is for Encryption and valid
            if ($_.PrivateKey.KeyExchangeAlgorithm -and $_.Verify())
            {
                # Create the folder to hold the exported public key
                $folder= Join-Path -Path $env:SystemDrive\ -ChildPath $using:publicKeyFolder
                if (! (Test-Path $folder))
                {
                    md $folder | Out-Null
                }

                # Export the public key to a well known location
                $certPath = Export-Certificate -Cert $_ -FilePath (Join-Path -path $folder -childPath "EncryptionCertificate.cer")

                # Return the thumbprint, and exported certificate path
                return @($_.Thumbprint,$certPath);
            }
        }
    }

    Write-Verbose "Identified and exported cert..."
    # Copy the exported certificate locally
    $destinationPath = join-path -Path "$env:SystemDrive\$script:publicKeyFolder" -childPath "$computername.EncryptionCertificate.cer"
    Copy-Item -Path (join-path -path \\$computername -childPath $returnValue[1].FullName.Replace(":","$"))  $destinationPath | Out-Null

    # Return the thumbprint
    return $returnValue[0]
}

Start-CredentialEncryptionExample