Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: Windows PowerShell 4.0, Windows PowerShell 5.0
DSC управляет конфигурацией серверных узлов с помощью информации, хранящейся в MOF-файле, в котором Local Configuration Manager (LCM) реализует требуемое конечное состояние. Поскольку этот файл содержит сведения о конфигурации, важно обеспечить его безопасность. В этой статье описывается, как убедиться, что целевой узел зашифровал файл.
Начиная с PowerShell версии 5.0, весь файл MOF шифруется по умолчанию при его применении к узлу с помощью Start-DSCConfiguration командлета. Процесс, описанный в этой статье, требуется только при реализации решения с использованием протокола службы pull, если сертификаты не управляются, чтобы гарантировать, что конфигурации, загруженные целевым узлом, могут быть расшифрованы и прочитаны системой до их применения (например, служба pull, доступная в Windows Server). На узлах, зарегистрированных в DSC службы автоматизации Azure , будут автоматически установлены сертификаты и управляться службой без административных затрат.
Замечание
В этом разделе обсуждаются сертификаты, используемые для шифрования. Для шифрования достаточно самоподписанного сертификата, так как закрытый ключ всегда держится в секрете и шифрование не предполагает доверия к документу. Самозаверяющие сертификаты не должны использоваться для проверки подлинности. Для любых целей проверки подлинности следует использовать сертификат от доверенного центра сертификации (ЦС).
Предпосылки
Чтобы успешно зашифровать учетные данные, используемые для защиты конфигурации DSC, убедитесь, что у вас есть следующее:
- Некоторые способы выпуска и распространения сертификатов. В этом разделе и его примерах предполагается, что используется центр сертификации Active Directory. Дополнительные сведения о службах сертификации Active Directory см. в разделе Общие сведения о службах сертификации Active Directory.
- Административный доступ к целевому узлу или узлам.
- У каждого целевого узла есть сертификат с поддержкой шифрования, сохраненный в личном хранилище. В Windows PowerShell путь к хранилищу — Cert:\LocalMachine\My. В примерах в этом разделе используется шаблон "проверка подлинности рабочей станции", который можно найти (наряду с другими шаблонами сертификатов) в разделе Шаблоны сертификатов по умолчанию.
- Если вы будете запускать эту конфигурацию на компьютере, отличном от целевого узла, экспортируйте открытый ключ сертификата, а затем импортируйте его на компьютер, с которого вы будете запускать конфигурацию. Убедитесь, что вы экспортируете только открытый ключ; Храните закрытый ключ в безопасности.
Замечание
Ресурсы скриптов имеют ограничения, когда дело доходит до шифрования. Дополнительные сведения см. в разделе Ресурс скриптов
Общий процесс
- Настройте сертификаты, ключи и отпечатки, убедившись, что каждый целевой узел имеет копии сертификата, а компьютер конфигурации — открытый ключ и отпечаток.
- Создайте блок конфигурационных данных, содержащий путь и отпечаток открытого ключа.
- Создайте сценарий конфигурации, который определяет желаемую конфигурацию для целевого узла и настраивает расшифровку на целевых узлах, дав команду диспетчеру локальных конфигураций расшифровать данные конфигурации с помощью сертификата и его отпечатка.
- Запустите конфигурацию, которая установит параметры локального диспетчера конфигураций и запустит настройку DSC.
Требования к сертификату
Чтобы внедрить шифрование учетных данных, сертификат открытого ключа должен быть доступен на целевом узле , которому доверяет компьютер, используемый для создания конфигурации DSC. Этот сертификат открытого ключа имеет определенные требования для использования для шифрования учетных данных DSC:
-
Использование ключа:
- Должен содержать: 'KeyEncipherment' и 'DataEncipherment'.
- Не должен содержать: 'Цифровую подпись'.
-
Улучшенное использование клавиш:
- Должен содержать: Шифрование документа (1.3.6.1.4.1.311.80.1).
- Не должен содержать: Аутентификацию клиента (1.3.6.1.5.5.7.3.2) и Аутентификацию сервера (1.3.6.1.5.5.7.3.1).
- Закрытый ключ для сертификата доступен на Node_ *Target.
- Поставщиком сертификата должен быть "Microsoft RSA SChannel Cryptographic Provider".
Это важно
Несмотря на то, что вы можете использовать сертификат, содержащий «цифровую подпись» или один из EKU аутентификации, это позволит упростить злоупотребление ключом шифрования и сделать его уязвимым для атак. Поэтому рекомендуется использовать сертификат, созданный специально для защиты учетных данных DSC, в котором отсутствуют эти данные об использовании ключей и EKU.
Для защиты учетных данных DSC можно использовать любой существующий сертификат на целевом узле , который соответствует этим критериям.
Создание сертификата
Существует два подхода к созданию и использованию необходимого сертификата шифрования (пара открытый-закрытый ключ).
- Создайте его на целевом узле и экспортируйте только открытый ключ на исходный узел
- Создайте его на исходном узле и экспортируйте всю пару ключей на целевой узел
Метод 1 рекомендуется, поскольку закрытый ключ, используемый для расшифровки учетных данных в MOF, всегда остается на целевом узле.
Создание сертификата на целевом узле
Самый простой способ сделать это — создать сертификат закрытого ключа на целевом узле и скопировать сертификат открытого ключа на компьютер, используемый для создания конфигурации DSC, в файл MOF. Следующий пример:
- создает сертификат на целевом узле
- экспортирует сертификат открытого ключа на целевом узле.
- импортирует сертификат открытого ключа в хранилище my certificate на узле Authoring.
На целевом узле: создание и экспорт сертификата
Целевой узел: Windows Server 2016 и 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
После экспорта их DscPublicKey.cer необходимо будет скопировать на исходный узел.
На узле разработки: импортируйте открытый ключ сертификата
# Import to the my store
Import-Certificate -FilePath "$env:temp\DscPublicKey.cer" -CertStoreLocation Cert:\LocalMachine\My
Создание сертификата на исходном узле
Кроме того, сертификат шифрования может быть создан на исходном узле, экспортирован с закрытым ключом в виде файла PFX, а затем импортирован на целевой узел. Это текущий метод реализации шифрования учетных данных DSC на сервере Nano Server. Несмотря на то, что PFX защищен паролем, он должен быть надежно защищен во время транспортировки. Следующий пример:
- создает сертификат на узле Authoring.
- экспортирует сертификат, включая закрытый ключ, на исходном узле.
- удаляет закрытый ключ из узла Authoring, но сохраняет сертификат открытого ключа в моем хранилище.
- импортирует сертификат закрытого ключа в хранилище сертификатов My(Personal) на целевом узле.
- он должен быть добавлен в корневое хранилище, чтобы ему доверял узел Target.
На исходном узле: создание и экспорт сертификата
Целевой узел: Windows Server 2016 и 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
После экспорта их DscPrivateKey.pfx необходимо будет скопировать на целевой узел.
На целевом узле: импортируйте закрытый ключ сертификата в качестве доверенного корня
# 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
данные конфигурации;
Блок конфигурационных данных определяет, с какими целевыми узлами следует работать, следует ли шифровать учетные данные, средства шифрования и другую информацию. Дополнительные сведения о блоке данных конфигурации см. в разделе Разделение данных конфигурации и среды.
Для каждого узла, связанного с шифрованием учетных данных, можно настроить следующие элементы:
- NodeName - имя целевого узла, для которого настраивается шифрование учетных данных.
- PsDscAllowPlainTextPassword - будет ли разрешено передавать незашифрованные учетные данные на этот узел. Делать это не рекомендуется.
- Thumbprint - отпечаток сертификата, который будет использоваться для расшифровки учетных данных в конфигурации DSC на целевом узле. Этот сертификат должен существовать в хранилище сертификатов локального компьютера на целевом узле.
- CertificateFile - файл сертификата (содержащий только открытый ключ), который должен использоваться для шифрования учетных данных для целевого узла. Это должен быть двоичный файл сертификата формата X.509 в кодировке DER или X.509 в кодировке Base-64.
В этом примере показан блок данных конфигурации, который указывает целевой узел с именем targetNode, путь к файлу сертификата открытого ключа (с именем targetNode.cer) и отпечаток открытого ключа.
$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"
}
)
}
Конфигурационный скрипт
В самом конфигурационном скрипте используйте параметр, PsCredential чтобы гарантировать, что учетные данные хранятся в течение максимально короткого времени. При запуске предоставленного примера DSC запросит у вас учетные данные, а затем зашифрует MOF-файл с помощью CertificateFile, связанного с целевым узлом в блоке данных конфигурации. В этом примере кода копируется файл из общей папки, которая защищена для пользователя.
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
}
}
}
Настройка расшифровки
Прежде чем Start-DscConfiguration сможет заработать, необходимо сообщить локальному диспетчеру конфигураций на каждом целевом узле, какой сертификат следует использовать для расшифровки учетных данных, используя ресурс CertificateID для проверки отпечатка сертификата. Этот пример функции найдет подходящий локальный сертификат (возможно, вам придется настроить его так, чтобы он нашел именно тот сертификат, который вы хотите использовать):
# 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
}
}
}
Если сертификат идентифицирован по отпечатку его эскиза, сценарий конфигурации может быть обновлен для использования значения:
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
}
}
}
Запуск конфигурации
На этом этапе вы можете запустить конфигурацию, которая выведет два файла:
- Файл
*.meta.mof, который настраивает локальный диспетчер конфигураций для расшифровки учетных данных с помощью сертификата, хранящегося в локальном хранилище компьютера и идентифицируемого по его отпечатку. Set-DscLocalConfigurationManager применяет*.meta.mofфайл. - Файл MOF, который фактически применяет конфигурацию. Start-DscConfiguration применяет конфигурацию.
Эти команды выполнят следующие шаги:
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
В этом примере конфигурация DSC будет отправлена на целевой узел. Конфигурацию DSC также можно применить с помощью DSC Pull Server, если таковой доступен.
Дополнительные сведения о применении конфигураций DSC с помощью сервера DSC Pull см. в разделе Настройка опрашивающего клиента DSC .
Пример модуля шифрования учетных данных
Ниже приведен полный пример, который включает в себя все эти шаги, а также вспомогательный командлет, который экспортирует и копирует открытые ключи.
# 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