Aprender a configurar un certificado autofirmado para la Configuración de Estado Deseado de Windows (DSC) es una obligación para los administradores. Y, afortunadamente, se puede hacer en sólo unos pocos pasos… aquí está cómo.
Administrador de Configuración Local (LCM)
El uso continuado de PowerShell DSC significa que eventualmente tendrás que usar un nombre de usuario y contraseña diferentes dentro de una configuración. Cuando el Administrador de Configuración Local (LCM) confirma una configuración a un ordenador siempre se ejecuta como la cuenta del SISTEMA local. Aunque la cuenta del SISTEMA tiene acceso total a la computadora en la que se está ejecutando, no tiene ningún derecho a otros recursos de la red.
Para resolver el problema de los derechos del SISTEMA local, puedes usar un objeto PSCredential que representa un nombre de usuario y una contraseña diferentes para usar en su lugar. Esto se hace ya sea usando una propiedad Credential (si se ha definido una para el recurso) o usando el PowerShell v5 PsDscRunAsCredential, que cambia el contexto de usuario como el que el LCM ejecuta la configuración. De cualquier manera, es necesaria una credencial separada.
Para demostrarlo, usemos el recurso de Archivo incorporado y la propiedad Credencial. Nuestra configuración de demostración se ve así:
Configuration CopyFile{ param( [Parámetro(Obligatorio)] [ValidateNotNullOrEmpty()] [pscredential]$Credential ) Import-DscResource -Módulo PSDesiredStateConfiguration Node $env:COMPUTERNAME { File $0027FileCopy$0027 { Ensure = $0027Present$0027 SourcePath = $0027\MEMBERSRV1c$RemoteFile. txt$0027 DestinationPath = $0027C:RemoteFile.txt$0027 Credential = $Credential } }}CopyFile -OutputPath $PSScriptRoot -Credential (Get-Credential)
Cuando se intente ejecutar CopyFile, pronto encontrará este mensaje de error esperándole:
La razón es que cuando se compila una configuración en un MOF, la credencial tiene que ser almacenada dentro del MOF. Por defecto, el LCM está configurado para no aceptar esto. Algunos administradores perezosos pueden optar por ignorar este útil mensaje de error y simplemente poner el equivalente de «Lo que sea». Just do it» con la configuración, permitiendo que la contraseña en texto plano se almacene dentro del archivo MOF.
En vez de eso, hagámoslo de la manera correcta encriptando la credencial dentro del archivo MOF con un certificado. Para ello, necesitarás un certificado instalado en el ordenador donde generas el MOF y en el nodo DSC que consumirá el MOF. Esto permitirá a la computadora que genera la configuración encriptar la credencial y al nodo DSC desencriptarla dentro del MOF. No importa cómo se crea un certificado. Lo que realmente importa es que estás usando un certificado.
Generación de un certificado autofirmado
Uno de los métodos más fáciles (con la mayor carga de gestión) es generar un certificado autofirmado y utilizarlo. Aunque usar una PKI como los Servicios de Certificados de Directorio Activo es mejor a largo plazo, los certificados autofirmados le permiten ponerse en marcha rápidamente en un entorno de prueba. Usando la técnica que estoy a punto de mostrarte te permitirá crear un certificado rápidamente y conseguir que se instale tanto en el nodo DSC como en el ordenador que genera el archivo MOF.
La primera tarea es crear el certificado y asegurarse de que tanto la clave privada como la pública existen en el nodo DSC. La forma más fácil de hacer que esto suceda es construir el certificado directamente en el nodo DSC. De lo contrario, tendrás que añadir un paso más para exportar la clave privada de tu estación de trabajo de administración al propio nodo DSC. Esto requiere la ayuda de una función pre-construida llamada New-SelfSignedCertificateEx. Esta función nos permite crear un certificado particular con todos los atributos necesarios para un certificado DSC, y funciona muy bien en ordenadores locales. Pero, tened en cuenta que nuestro nodo DSC es remoto, lo que significa que tendremos que crear algo de magia para que eso suceda usando el control remoto de PowerShell.
Usaremos Invoke-Command aquí, así que tendremos que construir un bloque de guiones para pasar al ordenador remoto. Pero primero, necesitaremos crear una definición de función. Lo haremos asignándola a la variable $funciónDef.
$functionDef = "function New-SelfSignedCertificateEx { ${function:New-SelfSignedCertificateEx}}"
Una vez que esto ocurra podemos construir el bloque de scripts con un solo parámetro para pasar la definición de la función, y una línea para crear la función New-SelfSignedCertificateEx dentro de la sesión remota. La función puede entonces ser llamada como normal.
$ScriptBlock = { param ($functionDef) . ([ScriptBlock]::Create($functionDef)) $signedCertParams = @{ $0027Subject$0027 = "CN=$env:COMPUTERNAME" $0027SAN$0027 = $env: COMPUTERNAME $0027EnhancedKeyUsage$0027 = $0027Cifrado de documentos$0027 $0027KeyUsage$0027 = $0027KeyEncipherment$0027, $0027DataEncipherment$0027 $0027FriendlyName$0027 = $0027DSC Encryption Certififificate$0027 $0027StoreLocation$0027 = $0027LocalMachine$0027 $0027StoreName$0027 = $0027My$0027 $0027ProviderName$0027 = $0027Microsoft Enhanced Cryptographic Provider v1. 0$0027 $0027PassThru$0027 = $true $0027KeyLength$0027 = 2048 $0027AlgorithmName$0027 = $0027RSA$0027 $0027SignatureAlgorithm$0027 = $0027SHA256$0027 } New-SelfSignedCertificateEx @signedCertParams}
Mirando los parámetros de $signedCertParams de arriba, puedes ver las muchas opciones necesarias para crear un certificado DSC con éxito.
Una vez creado el bloque de scripts, ahora puede pasarse a Invoke-Command junto con el parámetro ArgumentList, que contiene la definición de la función creada anteriormente.
Invoke-Command -ComputerName RemoteComputer -ScriptBlock $ScriptBlock -ArgumentList $functionDef
Confirmando el certificado autofirmado
En este punto, se ha creado el certificado autofirmado. Podemos confirmar que se ha creado con éxito enumerando todos los certificados en el almacén de certificados de la computadora local buscando el nombre del sujeto del certificado que se acaba de crear.
$cert = Invoke-Command -ComputerName REMOTECOMPUTER -ScriptBlock {Get-Childitem -Path Cert:LocalMachineMy | where {$_.Subject -eq $0027CN=REMOTECOMPUTER$0027}}
Si tiene éxito, debería ver el certificado.
Importación del certificado
El paso final es importar el certificado a la computadora que generará el archivo MOF. Primero, tendremos que meter el certificado en un archivo. Para ello, vamos a utilizar el cmdlet del Certificado de Exportación.
$cert | Export-Certificate -FilePath $0027C:DscCert.cer$0027
Como el certificado que se creó en el nodo DSC está ahora almacenado en un archivo en nuestro ordenador local, puedo ahora importar el certificado al almacén de certificados de mi máquina local. Esto me permitirá encriptar la credencial dentro del archivo MOF.
Certificado de importación -FilePath C:DscCert.cer -CertStoreLocation $0027Cert:NLocalMachineN-My$0027
¡Éxito! Finalmente hemos creado un certificado autofirmado en un nodo DSC remoto, hemos exportado ese certificado a nuestro ordenador local como un archivo y hemos importado el certificado a la tienda de certificados local apropiada. En este punto, si decide ejecutar la configuración previamente discutida, ahora creará el archivo MOF sin ninguna queja. Adelante, inténtalo y dinos lo que piensas.
Una vez que hayas manejado esto, mira mis otros consejos y tutoriales de PowerShell. ¿Recién comienza con PowerShell? Intente comenzar con este camino.
COMPARTIR: