Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: Windows PowerShell 4.0, Windows PowerShell 5.0
DSC mengelola konfigurasi simpul server dengan menerapkan informasi yang disimpan dalam file MOF, di mana Manajer Konfigurasi Lokal (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 hanya diperlukan saat menerapkan solusi menggunakan protokol layanan tarik jika sertifikat tidak dikelola, untuk memastikan konfigurasi yang diunduh oleh simpul target dapat didekripsi dan dibaca oleh sistem sebelum diterapkan (misalnya, layanan tarik yang tersedia di Windows Server). Node yang terdaftar ke Azure Automation DSC akan secara otomatis memiliki sertifikat yang diinstal dan dikelola oleh layanan tanpa memerlukan overhead administratif.
Nota
Topik ini membahas sertifikat yang digunakan untuk enkripsi. Untuk enkripsi, sertifikat yang ditandatangani sendiri sudah cukup, karena kunci pribadi 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
Untuk berhasil mengenkripsi kredensial yang digunakan untuk mengamankan konfigurasi DSC, pastikan Anda memiliki hal berikut:
- Beberapa cara penerbitan dan distribusi 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 disimpan di Penyimpanan Pribadinya. Di 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 publik ; Jaga keamanan kunci pribadi.
Nota
Sumber daya Skrip memiliki keterbatasan dalam hal enkripsi. Untuk informasi selengkapnya, lihat Sumber Daya Skrip
Proses keseluruhan
- Siapkan sertifikat, kunci, dan sidik jari, pastikan bahwa setiap simpul target memiliki salinan sertifikat dan komputer konfigurasi memiliki kunci publik dan sidik jari.
- Buat blok data konfigurasi yang berisi jalur dan sidik jari kunci publik.
- Buat skrip konfigurasi yang menentukan konfigurasi yang Anda inginkan untuk simpul target dan menyiapkan dekripsi pada simpul target dengan memerintahkan manajer Konfigurasi Lokal untuk mendekripsi data konfigurasi menggunakan sertifikat dan sidik jarinya.
- Jalankan konfigurasi, yang akan mengatur pengaturan Manajer Konfigurasi Lokal dan memulai konfigurasi DSC.
Persyaratan Sertifikat
Untuk memberlakukan enkripsi kredensial, sertifikat kunci publik harus tersedia pada Node Target yang dipercaya oleh komputer yang digunakan untuk menulis konfigurasi DSC. Sertifikat kunci publik ini memiliki persyaratan khusus untuk digunakan untuk enkripsi kredensial DSC:
-
Penggunaan Kunci:
- Harus berisi: 'KeyEnkripsi' dan 'DataEnkripsi'.
- Seharusnya tidak berisi: 'Tanda Tangan Digital'.
-
Penggunaan Kunci yang Ditingkatkan:
- Harus berisi: Enkripsi Dokumen (1.3.6.1.4.1.311.80.1).
- Seharusnya tidak berisi: Autentikasi Klien (1.3.6.1.5.5.7.3.2) dan Autentikasi Server (1.3.6.1.5.5.7.3.1).
- Kunci Pribadi untuk sertifikat tersedia di Node_ *Target.
- 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 Otentikasi, ini akan memungkinkan kunci enkripsi 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 EKU ini.
Setiap sertifikat yang ada pada Node 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-pribadi).
- Buat di Node Target dan ekspor hanya kunci publik ke Node Authoring
- Buat pada Node Penulisan dan ekspor seluruh pasangan kunci ke Node Target
Metode 1 direkomendasikan karena kunci pribadi yang digunakan untuk mendekripsi kredensial di MOF tetap berada di Node Target setiap saat.
Membuat Sertifikat pada Node Target
Kunci pribadi harus dirahasiakan, karena digunakan untuk mendekripsi MOF pada Node Target Cara termudah untuk melakukannya adalah dengan membuat sertifikat kunci pribadi pada Node Target, dan menyalin sertifikat kunci publik ke komputer yang digunakan untuk menulis konfigurasi DSC ke dalam file MOF. Contoh berikut:
- membuat sertifikat pada simpul Target
- mengekspor sertifikat kunci publik pada simpul Target.
- mengimpor sertifikat kunci publik ke penyimpanan sertifikat saya pada simpul Penulisan.
Pada Node Target: buat dan ekspor sertifikat
Node 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, perlu DscPublicKey.cer disalin ke Node Penulis.
Pada Node Penulisan: impor kunci publik sertifikat
# Import to the my store
Import-Certificate -FilePath "$env:temp\DscPublicKey.cer" -CertStoreLocation Cert:\LocalMachine\My
Membuat Sertifikat pada Node Penulisan
Sebagai alternatif, sertifikat enkripsi dapat dibuat pada Node Penulisan, diekspor dengan kunci pribadi sebagai file PFX dan kemudian diimpor pada Node Target. Ini adalah metode saat ini untuk menerapkan enkripsi kredensial DSC di Nano Server. Meskipun PFX diamankan dengan kata sandi, itu harus tetap aman selama transit. Contoh berikut:
- membuat sertifikat pada simpul Penulisan.
- mengekspor sertifikat termasuk kunci pribadi pada simpul Penulisan.
- menghapus kunci pribadi dari simpul Penulisan, tetapi menyimpan sertifikat kunci publik di toko saya .
- mengimpor sertifikat kunci privat ke penyimpanan sertifikat My(Personal) pada simpul Target.
- itu harus ditambahkan ke penyimpanan akar sehingga akan dipercaya oleh simpul Target.
Pada Node Penulisan: buat dan ekspor sertifikat
Node 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, perlu DscPrivateKey.pfx disalin ke Node Target.
Pada Node Target: impor kunci pribadi sertifikat sebagai root 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 Data Konfigurasi dan 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.
- Sidik jari - sidik jari sertifikat yang akan digunakan untuk mendekripsi kredensial dalam Konfigurasi DSC pada Node Target. Sertifikat ini harus ada di penyimpanan sertifikat Mesin Lokal pada Node Target.
- CertificateFile - file sertifikat (hanya berisi kunci publik) yang harus digunakan untuk mengenkripsi kredensial untuk Node Target. Ini harus berupa file sertifikat format X.509 biner yang dikodekan DER atau 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 sidik jari untuk kunci publik.
$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 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 Manajer Konfigurasi Lokal pada setiap simpul target sertifikat mana yang akan digunakan untuk mendekripsi kredensial, menggunakan sumber daya CertificateID untuk memverifikasi sidik jari sertifikat. Contoh fungsi ini akan menemukan sertifikat lokal yang sesuai (Anda mungkin harus menyesuaikannya sehingga akan menemukan sertifikat 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 dengan sidik jarinya, 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.mofyang mengonfigurasi Manajer Konfigurasi Lokal untuk mendekripsi kredensial menggunakan sertifikat yang disimpan di penyimpanan komputer lokal dan diidentifikasi dengan sidik jarinya. Set-DscLocalConfigurationManager menerapkan*.meta.moffile. - File MOF yang benar-benar menerapkan konfigurasi. Start-DscConfiguration menerapkan konfigurasi.
Perintah-perintah ini akan menyelesaikan langkah-langkah berikut:
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 tarik DSC untuk informasi selengkapnya tentang menerapkan konfigurasi DSC menggunakan Server Tarik DSC.
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