PowerShell DSC. Сертификат для шифрования пароля

30 марта 2016 г.

При использовании учетных записей в PowerShell DSC для обеспечения безопасности необходимо шифровать пароль сертификатом. В это посте о том как получить валидный сертификат, подходящий для этого.

PowerShell Desired State Configuration

Невалидный сертификат

Если сертификат не удовлетворяет требованиям для шифрования пароля, то при попытке скомпилировать конфигурацию получаем примерно такое исключение:

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 генерирует сертификат:

  1. certreq -new PathCertificateToRequest.inf PathToCertificate.cer

Полученный файл можно использовать для шифрования пароля в PowerShell DSC.

Конфигурация

Указанный сертификат необходимо указать в конфигурации Local Configuration Manager для каждого сервера, где это применимо. В противном случае получаем исключение при, например, вызове Start-DscConfiguration:

The Local Configuration Manager is not configured with a certificate.

Чтобы указать сертификат, который необходимо использовать, достаточно добавить блок LocalConfigurationManager в конфигурацию. Примерно так:

  1. Configuration CertConfigurationDemo {
  2.     param(
  3.         [Parameter(Mandatory=$true)] [ValidateNotNullorEmpty()] [PSCredential] $InstallAccount
  4.     )
  5.  
  6.     Node SP2016SRV
  7.     {
  8.         LocalConfigurationManager {
  9.             CertificateID = $Node.Thumbprint
  10.         }
  11.         #Someting resource using #InstallAccount
  12.     }
  13. }
  14. $ConfigData = @{
  15.     AllNodes = @(
  16.         @{
  17.             NodeName = 'SP2016SRV'
  18.             CertificateFile = 'C:\sp\localhost.cer'
  19.             Thumbprint = '‎35024c5060014373e768b900b762f6793c5575d9'
  20.             PSDscAllowDomainUser = $true
  21.         }
  22.     )
  23. }

Ссылки

Немного полезных ссылок по теме:

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

Пользуемся.

Поделиться

Комментарии