Mengamankan File MOF

Berlaku Untuk: Windows PowerShell 4.0, Windows PowerShell 5.0

DSC mengelola konfigurasi node server dengan menerapkan informasi yang disimpan dalam file MOF, di mana Local Configuration Manager (LCM) mengimplementasikan status akhir yang diinginkan. Karena file ini berisi detail konfigurasi, penting untuk menjaganya tetap aman. Artikel ini menjelaskan cara memastikan simpul target telah mengenkripsi file.

Dimulai dengan PowerShell versi 5.0, seluruh file MOF dienkripsi secara default saat diterapkan ke simpul menggunakan Start-DSCConfiguration cmdlet . Proses yang dijelaskan dalam artikel ini diperlukan hanya saat menerapkan solusi menggunakan protokol layanan penarikan jika sertifikat tidak dikelola, untuk memastikan konfigurasi yang diunduh oleh simpul target dapat didekripsi dan dibaca oleh sistem sebelum diterapkan (misalnya, layanan penarikan yang tersedia di Windows Server). Simpul yang terdaftar di Azure Automation DSC akan secara otomatis memiliki sertifikat yang diinstal dan dikelola oleh layanan tanpa memerlukan overhead administratif.

Catatan

Topik ini membahas sertifikat yang digunakan untuk enkripsi. Untuk enkripsi, sertifikat yang ditandatangani sendiri sudah cukup, karena kunci privat selalu dirahasiakan dan enkripsi tidak menyiratkan kepercayaan terhadap dokumen. Sertifikat yang ditandatangani sendiri tidak boleh digunakan untuk tujuan autentikasi. Anda harus menggunakan sertifikat dari Otoritas Sertifikasi (CA) tepercaya untuk tujuan autentikasi apa pun.

Prasyarat

Agar berhasil mengenkripsi kredensial yang digunakan untuk mengamankan konfigurasi DSC, pastikan Anda memiliki hal berikut:

  • Beberapa cara untuk menerbitkan dan mendistribusikan sertifikat. Topik ini dan contohnya mengasumsikan Anda menggunakan Otoritas Sertifikasi Direktori Aktif. Untuk informasi latar belakang selengkapnya tentang Layanan Sertifikat Direktori Aktif, lihat Gambaran Umum Layanan Sertifikat Direktori Aktif.
  • Akses administratif ke simpul atau simpul target.
  • Setiap simpul target memiliki sertifikat berkemampuan enkripsi yang menyimpan Penyimpanan Pribadinya. Dalam Windows PowerShell, jalur ke penyimpanan adalah Cert:\LocalMachine\My. Contoh dalam topik ini menggunakan templat "autentikasi stasiun kerja", yang dapat Anda temukan (bersama dengan templat sertifikat lainnya) di Templat Sertifikat Default.
  • Jika Anda akan menjalankan konfigurasi ini di komputer selain simpul target, ekspor kunci publik sertifikat, lalu impor ke komputer tempat Anda akan menjalankan konfigurasi. Pastikan Anda hanya mengekspor kunci umum ; jaga keamanan kunci privat.

Catatan

Sumber Daya Skrip memiliki batasan dalam hal enkripsi. Untuk informasi selengkapnya, lihat Sumber Daya Skrip

Memproses keseluruhan

  1. Siapkan sertifikat, kunci, dan thumbprint, pastikan bahwa setiap simpul target memiliki salinan sertifikat dan komputer konfigurasi memiliki kunci publik dan thumbprint.
  2. Buat blok data konfigurasi yang berisi jalur dan thumbprint kunci publik.
  3. Buat skrip konfigurasi yang menentukan konfigurasi yang Anda inginkan untuk simpul target dan siapkan dekripsi pada simpul target dengan memerintahkan manajer Konfigurasi Lokal untuk mendekripsi data konfigurasi menggunakan sertifikat dan thumbprint-nya.
  4. Jalankan konfigurasi, yang akan mengatur Pengaturan Configuration Manager lokal dan memulai konfigurasi DSC.

Alur proses untuk enkripsi kredensial

Persyaratan Sertifikat

Untuk memberlakukan enkripsi kredensial, sertifikat kunci publik harus tersedia pada Simpul Target yang dipercaya oleh komputer yang digunakan untuk menulis konfigurasi DSC. Sertifikat kunci publik ini memiliki persyaratan khusus untuk digunakan untuk enkripsi kredensial DSC:

  1. Penggunaan Kunci:
    • Harus berisi: 'KeyEncipherment' dan 'DataEncipherment'.
    • Tidak boleh berisi: 'Tanda Tangan Digital'.
  2. Penggunaan Kunci yang Ditingkatkan:
    • Harus berisi: Enkripsi Dokumen (1.3.6.1.4.1.311.80.1).
    • Tidak boleh berisi: Autentikasi Klien (1.3.6.1.5.5.7.3.2) dan Autentikasi Server (1.3.6.1.5.5.7.3.1).
  3. Kunci Privat untuk sertifikat tersedia di *Node_ Target.
  4. Penyedia untuk sertifikat harus "Penyedia Kriptografi Microsoft RSA SChannel".

Penting

Meskipun Anda dapat menggunakan sertifikat yang berisi Penggunaan Kunci 'Tanda Tangan Digital' atau salah satu EKU Autentikasi, ini akan memungkinkan kunci enkripsi untuk lebih mudah disalahgunakan dan rentan terhadap serangan. Jadi praktik terbaik adalah menggunakan sertifikat yang dibuat khusus untuk tujuan mengamankan kredensial DSC yang menghilangkan Penggunaan Kunci dan EKUs ini.

Sertifikat yang ada pada Simpul Target yang memenuhi kriteria ini dapat digunakan untuk mengamankan kredensial DSC.

Pembuatan sertifikat

Ada dua pendekatan yang dapat Anda ambil untuk membuat dan menggunakan Sertifikat Enkripsi yang diperlukan (pasangan kunci publik-privat).

  1. Buat di Simpul Target dan ekspor hanya kunci publik ke Node Penulisan
  2. Buat di Node Penulisan dan ekspor seluruh pasangan kunci ke Simpul Target

Metode 1 direkomendasikan karena kunci privat yang digunakan untuk mendekripsi kredensial di MOF tetap berada di Simpul Target setiap saat.

Membuat Sertifikat pada Simpul Target

Kunci privat harus dirahasiakan, karena digunakan untuk mendekripsi MOF pada Simpul Target Cara termampu untuk melakukannya adalah dengan membuat sertifikat kunci privat pada Simpul Target, dan menyalin sertifikat kunci publik ke komputer yang digunakan untuk menulis konfigurasi DSC ke dalam file MOF. Lihat contoh berikut:

  1. membuat sertifikat pada simpul Target
  2. mengekspor sertifikat kunci publik pada simpul Target.
  3. mengimpor sertifikat kunci publik ke penyimpanan sertifikat saya pada simpul Penulisan.

Pada Simpul Target: buat dan ekspor sertifikat

Simpul Target: Windows Server 2016 dan 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

Setelah diekspor, DscPublicKey.cer perlu disalin ke Node Penulisan.

Pada Node Penulisan: impor kunci publik sertifikasi

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

Membuat Sertifikat pada Node Penulisan

Secara bergantian, sertifikat enkripsi dapat dibuat pada Node Penulisan, diekspor dengan kunci privat sebagai file PFX dan kemudian diimpor pada Simpul Target. Ini adalah metode saat ini untuk menerapkan enkripsi kredensial DSC di Nano Server. Meskipun PFX diamankan dengan kata sandi, PFX harus tetap aman selama transit. Lihat contoh berikut:

  1. membuat sertifikat pada simpul Penulisan.
  2. mengekspor sertifikat termasuk kunci privat pada simpul Penulisan.
  3. menghapus kunci privat dari simpul Penulisan, tetapi menyimpan sertifikat kunci publik di penyimpanan saya .
  4. mengimpor sertifikat kunci privat ke penyimpanan sertifikat My(Personal) pada simpul Target.
    • harus ditambahkan ke penyimpanan akar sehingga akan dipercaya oleh simpul Target.

Pada Node Penulisan: buat dan ekspor sertifikat

Simpul Target: Windows Server 2016 dan 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

Setelah diekspor, DscPrivateKey.pfx perlu disalin ke Simpul Target.

Pada Simpul Target: impor kunci privat sertifikasi sebagai akar tepercaya

# 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

Data konfigurasi

Blok data konfigurasi menentukan simpul target mana yang akan dioperasikan, apakah akan mengenkripsi kredensial, sarana enkripsi, dan informasi lainnya atau tidak. Untuk informasi selengkapnya tentang blok data konfigurasi, lihat Memisahkan Konfigurasi dan Data Lingkungan.

Elemen yang dapat dikonfigurasi untuk setiap simpul yang terkait dengan enkripsi kredensial adalah:

  • NodeName - nama simpul target tempat enkripsi kredensial sedang dikonfigurasi.
  • PsDscAllowPlainTextPassword - apakah kredensial yang tidak terenkripsi akan diizinkan untuk diteruskan ke simpul ini. Ini tidak disarankan.
  • Thumbprint - thumbprint sertifikat yang akan digunakan untuk mendekripsi kredensial dalam Konfigurasi DSC pada Simpul Target. Sertifikat ini harus ada di penyimpanan sertifikat Komputer Lokal pada Simpul Target.
  • CertificateFile - file sertifikat (hanya berisi kunci umum) yang harus digunakan untuk mengenkripsi kredensial untuk Simpul Target. Ini harus berupa biner yang dikodekan DER X.509 atau file sertifikat format X.509 yang dikodekan Base-64.

Contoh ini menunjukkan blok data konfigurasi yang menentukan simpul target untuk bertindak pada targetNode bernama, jalur ke file sertifikat kunci publik (bernama targetNode.cer), dan thumbprint untuk kunci umum.

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

Skrip konfigurasi

Dalam skrip konfigurasi itu sendiri, gunakan PsCredential parameter untuk memastikan bahwa kredensial disimpan untuk waktu sesingkat mungkin. Saat Anda menjalankan contoh yang disediakan, DSC akan meminta kredensial kepada Anda lalu mengenkripsi file MOF menggunakan CertificateFile yang terkait dengan simpul target di blok data konfigurasi. Contoh kode ini menyalin file dari berbagi yang diamankan ke pengguna.

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

Menyiapkan dekripsi

Sebelum Start-DscConfiguration dapat berfungsi, Anda harus memberi tahu Configuration Manager Lokal pada setiap simpul target sertifikat mana yang akan digunakan untuk mendekripsi kredensial, menggunakan sumber daya CertificateID untuk memverifikasi thumbprint sertifikat. Contoh fungsi ini akan menemukan sertifikat lokal yang sesuai (Anda mungkin harus menyesuaikannya sehingga akan menemukan sertifikat yang tepat yang ingin Anda gunakan):

# 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
        }
    }
}

Dengan sertifikat yang diidentifikasi oleh thumbprint-nya, skrip konfigurasi dapat diperbarui untuk menggunakan nilai :

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

Menjalankan konfigurasi

Pada titik ini, Anda dapat menjalankan konfigurasi, yang akan menghasilkan dua file:

  • File *.meta.mof yang mengonfigurasi Configuration Manager Lokal untuk mendekripsi kredensial menggunakan sertifikat yang disimpan di penyimpanan komputer lokal dan diidentifikasi oleh thumbprint-nya. Set-DscLocalConfigurationManager menerapkan *.meta.mof file .
  • File MOF yang benar-benar menerapkan konfigurasi. Start-DscConfiguration menerapkan konfigurasi.

Perintah ini akan menyelesaikan langkah-langkah tersebut:

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

Contoh ini akan mendorong konfigurasi DSC ke simpul target. Konfigurasi DSC juga dapat diterapkan menggunakan DSC Pull Server jika tersedia.

Lihat Menyiapkan klien penarikan DSC untuk informasi selengkapnya tentang menerapkan konfigurasi DSC menggunakan DSC Pull Server.

Contoh Modul Enkripsi Kredensial

Berikut adalah contoh lengkap yang menggabungkan semua langkah ini, ditambah cmdlet pembantu yang mengekspor dan menyalin kunci publik:

# 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