PowerShell DSC. Сертификат для шифрования пароля
При использовании учетных записей в PowerShell DSC для обеспечения безопасности необходимо шифровать пароль сертификатом. В это посте о том как получить валидный сертификат, подходящий для этого.
Невалидный сертификат
Если сертификат не удовлетворяет требованиям для шифрования пароля, то при попытке скомпилировать конфигурацию получаем примерно такое исключение:
ConvertTo-MOFInstance : System.ArgumentException error processing property 'Password' OF TYPE 'MSFT_Credential': Certificate
'4B73573487D6017136355FAA9A2AF7F9B59A16F8' cannot be used for encryption. Encryption certificates must contain the Data Encipherment
or Key Encipherment key usage, and include the Document Encryption Enhanced Key Usage (1.3.6.1.4.1.311.80.1).
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PSDesiredStateConfiguration.psm1:303 char:13
+ ConvertTo-MOFInstance MSFT_Credential $newValue
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Write-Error], InvalidOperationException
+ FullyQualifiedErrorId : FailToProcessProperty,ConvertTo-MOFInstance
Генерация сертификата
Для запроса сертификата можно использовать Certreq, который в качестве входного параметра принимает файл-запрос. Для PowerShell DSC достаточно примерно такого запроса:
[Version]
Signature = "$Windows NT$"
[Strings]
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_DOCUMENT_ENCRYPTION = "1.3.6.1.4.1.311.80.1"
[NewRequest]
Subject = "CN=COMPUTER_NAME"
KeyLength = 2048
MachineKeySet = true
RequestType = Cert
KeySpec = AT_KEYEXCHANGE
KeyUsage = CERT_KEY_ENCIPHERMENT_KEY_USAGE
[Extensions]
%szOID_ENHANCED_KEY_USAGE% = "{text}%szOID_DOCUMENT_ENCRYPTION%"
Теперь простой PowerShell генерирует сертификат:
certreq -new PathCertificateToRequest.inf PathToCertificate.cer
Полученный файл можно использовать для шифрования пароля в PowerShell DSC.
Конфигурация
Указанный сертификат необходимо указать в конфигурации Local Configuration Manager для каждого сервера, где это применимо. В противном случае получаем исключение при, например, вызове Start-DscConfiguration:
The Local Configuration Manager is not configured with a certificate.
Чтобы указать сертификат, который необходимо использовать, достаточно добавить блок LocalConfigurationManager в конфигурацию. Примерно так:
Configuration CertConfigurationDemo {
param(
[Parameter(Mandatory=$true)] [ValidateNotNullorEmpty()] [PSCredential] $InstallAccount
)
Node SP2016SRV
{
<strong>LocalConfigurationManager {</strong>
<strong>CertificateID = $Node.Thumbprint</strong>
<strong>}</strong>
#Someting resource using #InstallAccount
}
}
$ConfigData = @{
AllNodes = @(
@{
NodeName = 'SP2016SRV'
CertificateFile = 'C:\sp\localhost.cer'
Thumbprint = '35024c5060014373e768b900b762f6793c5575d9'
PSDscAllowDomainUser = $true
}
)
}
Ссылки
Немного полезных ссылок по теме:
Use a certificate with PowerShell DSC to add a server to Active Directory without hard coding a password - этот способ у меня не сработал.
Encryption certificates must contain Data Encipherment or Key Encipherment
Пользуемся.