Proteger el archivo MOFSecuring the MOF File

Se aplica a: Windows PowerShell 4.0, Windows PowerShell 5.0Applies To: Windows PowerShell 4.0, Windows PowerShell 5.0

DSC administra la configuración de nodos de servidor aplicando la información almacenada en un archivo MOF, donde el administrador de configuración local (LCM) implementa el estado final que quiere.DSC manages the configuration of server nodes by applying information stored in a MOF file, where the Local Configuration Manager (LCM) implements the desired end state. Como este archivo contiene los detalles de la configuración, es importante que esté protegido.Because this file contains the details of the configuration, it's important to keep it secure. En este artículo se describe cómo asegurarse de que el nodo de destino ha cifrado el archivo.This article describes how to ensure the target node has encrypted the file.

Desde PowerShell 5.0, el archivo MOF completo se cifra de forma predeterminada cuando se aplica al nodo por medio del cmdlet Start-DSCConfiguration.Beginning with PowerShell version 5.0, the entire MOF file is encrypted by default when it is applied to the node using the Start-DSCConfiguration cmdlet. El proceso descrito en este artículo únicamente es necesario si se implementa una solución a través del protocolo de servicio de incorporación de cambios cuando los certificados no se administran. De este modo, se garantiza que el sistema puede descifrar y leer las configuraciones descargadas por el nodo de destino antes de que se apliquen (por ejemplo, el servicio de incorporación de cambios disponible en Windows Server).The process described in this article is required only when implementing a solution using the pull service protocol if certificates are not managed, to ensure configurations downloaded by the target node can be decrypted and read by the system before they are applied (for example, the pull service available in Windows Server). El servicio instalará y administrará automáticamente los certificados relativos a los nodos registrados en DSC de Azure Automation, sin que ello suponga ninguna sobrecarga administrativa.Nodes registered to Azure Automation DSC will automatically have certificates installed and managed by the service with no administrative overhead required.

Nota

En este tema se describen los certificados usados para el cifrado.This topic discusses certificates used for encryption. Para el cifrado, un certificado autofirmado es suficiente, porque la clave privada se mantiene siempre secreta y el cifrado no implica la confianza del documento.For encryption, a self-signed certificate is sufficient, because the private key is always kept secret and encryption does not imply trust of the document. Los certificados autofirmados no deben usarse con fines de autenticación.Self-signed certificates should not be used for authentication purposes. Debe usar un certificado de una entidad de certificación de confianza (CA) para fines de autenticación.You should use a certificate from a trusted Certification Authority (CA) for any authentication purposes.

PrerrequisitosPrerequisites

Para cifrar correctamente las credenciales utilizadas para proteger una configuración DSC, asegúrese de que disponer de lo siguiente:To successfully encrypt the credentials used to secure a DSC configuration, make sure you have the following:

  • Algún medio de emisión y distribución de certificados.Some means of issuing and distributing certificates. En este tema y en sus ejemplos se supone que usa la entidad de certificación de Active Directory.This topic and its examples assume you are using Active Directory Certification Authority. Para obtener información más en profundidad sobre los Servicios de certificados de Active Directory, vea Información general de Servicios de certificados de Active Directory y Servicios de certificados de Active Directory.For more background information on Active Directory Certificate Services, see Active Directory Certificate Services Overview and Active Directory Certificate Services in Windows Server 2008.
  • Acceso administrativo a los nodos de destino.Administrative access to the target node or nodes.
  • Cada uno de los nodos de destino tiene un certificado de cifrado guardado en su almacén personal.Each target node has an encryption-capable certificate saved its Personal Store. En Windows PowerShell, la ruta de acceso al almacén es Cert:\LocalMachine\My.In Windows PowerShell, the path to the store is Cert:\LocalMachine\My. En los ejemplos de este tema se usa la plantilla de "autenticación de estación de trabajo", que puede encontrar (junto con otras plantillas de certificado) en las Plantillas de certificado predeterminadas.The examples in this topic use the "workstation authentication" template, which you can find (along with other certificate templates) at Default Certificate Templates.
  • Si va a ejecutar esta configuración en un equipo distinto al nodo de destino, exporte la clave pública del certificado y luego impórtela en el equipo desde el que se va a ejecutar la configuración.If you will be running this configuration on a computer other than the target node, export the public key of the certificate , and then import it to the computer you will run the configuration from. Asegúrese de que solo se exporte la clave public ; mantenga la clave privada segura.Make sure that you export only the public key; keep the private key secure.

Nota

Los recursos de script tienen limitaciones en cuanto al cifrado.Script Resources have limitations when it comes to encryption. Para obtener más información, consulte el artículo sobre el recurso Script.For more information, see Script Resource

Proceso generalOverall process

  1. Configure los certificados, las claves y las huellas digitales, asegurándose de que cada nodo de destino tenga copias del certificado y de que el equipo de configuración tenga la huella digital y la clave pública.Set up the certificates, keys, and thumbprints, making sure that each target node has copies of the certificate and the configuration computer has the public key and thumbprint.
  2. Cree un bloque de datos de configuración que contenga la ruta de acceso y la huella digital de la clave pública.Create a configuration data block that contains the path and thumbprint of the public key.
  3. Cree un script de configuración que defina la configuración deseada para el nodo de destino y configure el descifrado en los nodos de destino, estableciendo que el administrador de configuración local descifre los datos de configuración con el certificado y su huella digital.Create a configuration script that defines your desired configuration for the target node and sets up decryption on the target nodes by commanding the Local Configuration manager to decrypt the configuration data using the certificate and its thumbprint.
  4. Ejecute la configuración, que establecerá la configuración del administrador de configuración local e inicie la configuración DSC.Run the configuration, which will set the Local Configuration Manager settings and start the DSC configuration.

Flujo del proceso para el cifrado de credenciales

Requisitos de certificadoCertificate Requirements

Para representar el cifrado de credenciales, se requiere que un certificado de clave pública esté disponible en el nodo de destino en el que confíe el equipo usado para crear la configuración de DSC.To enact credential encryption, a public key certificate must be available on the Target Node that is trusted by the computer being used to author the DSC configuration. Este certificado de clave pública tiene requisitos específicos que debe usar para el cifrado de credenciales de DSC:This public key certificate has specific requirements for it to be used for DSC credential encryption:

  1. Uso de la clave :Key Usage :
    • Debe contener: "KeyEncipherment" y "DataEncipherment".Must contain: 'KeyEncipherment' and 'DataEncipherment'.
    • No debe contener: "Digital Signature".Should not contain: 'Digital Signature'.
  2. Uso mejorado de clave :Enhanced Key Usage :
    • Debe contener: Cifrado del documento (1.3.6.1.4.1.311.80.1).Must contain: Document Encryption (1.3.6.1.4.1.311.80.1).
    • No debe contener: Autenticación de cliente (1.3.6.1.5.5.7.3.2) y autenticación de servidor (1.3.6.1.5.5.7.3.1).Should not contain: Client Authentication (1.3.6.1.5.5.7.3.2) and Server Authentication (1.3.6.1.5.5.7.3.1).
  3. La clave privada del certificado está disponible en *el nodo de destino.The Private Key for the certificate is available on the *Target Node_.
  4. El proveedor del certificado debe ser "Proveedor de servicios criptográficos de Microsoft RSA SChannel".The Provider for the certificate must be "Microsoft RSA SChannel Cryptographic Provider".

Importante

Aunque puede usar un certificado que contenga un uso de clave de "Firma digital" o uno de los EKU de autenticación, esto permitirá que la clave de cifrado se use más fácilmente de forma inadecuada y sea vulnerable a ataques.Although you can use a certificate containing a Key Usage of 'Digital Signature' or one of the Authentication EKU's, this will enable the encryption key to be more easily misused and vulnerable to attack. Por lo tanto, le recomendamos que utilice un certificado creado específicamente con el fin de proteger las credenciales de DSC que omita estos EKU y usos de clave.So it is best practice to use a certificate created specifically for the purpose of securing DSC credentials that omits these Key Usage and EKUs.

Cualquier certificado existente en el nodo de destino que cumpla estos criterios puede usarse para proteger las credenciales de DSC.Any existing certificate on the Target Node that meets these criteria can be used to secure DSC credentials.

Creación de certificadosCertificate creation

Existen dos enfoques que puede realizar para crear y usar el certificado de cifrado necesario (par de claves pública y privada).There are two approaches you can take to create and use the required Encryption Certificate (public-private key pair).

  1. Creación en el nodo de destino y exportación de únicamente la clave pública al nodo de creaciónCreate it on the Target Node and export just the public key to the Authoring Node
  2. Creación en el nodo de creación y exportación del par de claves completo al nodo de destinoCreate it on the Authoring Node and export the entire key pair to the Target Node

Se recomienda el método 1 porque la clave privada que se usa para descifrar las credenciales en el MOF permanece en el nodo de destino en todo momento.Method 1 is recommended because the private key used to decrypt credentials in the MOF stays on the Target Node at all times.

Creación del certificado en el nodo de destinoCreating the Certificate on the Target Node

La clave privada debe mantenerse secreta, ya que se usa para descifrar el MOF en el nodo de destino. La forma más sencilla de hacerlo es crear el certificado de clave privada en el nodo de destino y copiar el certificado de clave pública en el equipo que se usa para crear la configuración de DSC en un archivo MOF.The private key must be kept secret, because is used to decrypt the MOF on the Target Node The easiest way to do that is to create the private key certificate on the Target Node , and copy the public key certificate to the computer being used to author the DSC configuration into a MOF file. En el ejemplo siguiente:The following example:

  1. crea un certificado en el nodo de destino.creates a certificate on the Target node
  2. exporta el certificado de clave pública al nodo de destino.exports the public key certificate on the Target node.
  3. importa el certificado de clave pública en mi almacén de certificados en el nodo de creación.imports the public key certificate into the my certificate store on the Authoring node.

En el nodo de destino: creación y exportación de certificadosOn the Target Node: create and export the certificate

Nodo de destino: Windows Server 2016 y Windows 10Target Node: Windows Server 2016 and 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

Una vez exportado, el DscPublicKey.cer tendría que copiarse en el nodo de creación.Once exported, the DscPublicKey.cer would need to be copied to the Authoring Node.

Nodo de destino: Windows Server 2012 R2/Windows 8.1 y anterioresTarget Node: Windows Server 2012 R2/Windows 8.1 and earlier

Advertencia

Dado que el cmdlet New-SelfSignedCertificate en sistemas operativos anteriores a Windows 10 y Windows Server 2016 no admite el parámetro Type , en estos sistemas operativos es necesario un método alternativo para crear este certificado.Because the New-SelfSignedCertificate cmdlet on Windows Operating Systems prior to Windows 10 and Windows Server 2016 do not support the Type parameter, an alternate method of creating this certificate is required on these operating systems. En este caso puede usar makecert.exe o certutil.exe para crear el certificado.In this case you can use makecert.exe or certutil.exe to create the certificate. Un método alternativo consiste en descargar el script New-SelfSignedCertificateEx.ps1 desde el centro de scripts de Microsoft y usarlo para crear el certificado:An alternate method is to download the New-SelfSignedCertificateEx.ps1 script from Microsoft Script Center and use it to create the certificate instead:

# note: These steps need to be performed in an Administrator PowerShell session
# and in the folder that contains New-SelfSignedCertificateEx.ps1
. .\New-SelfSignedCertificateEx.ps1
New-SelfsignedCertificateEx `
    -Subject "CN=${ENV:ComputerName}" `
    -EKU 'Document Encryption' `
    -KeyUsage 'KeyEncipherment, DataEncipherment' `
    -SAN ${ENV:ComputerName} `
    -FriendlyName 'DSC Credential Encryption certificate' `
    -Exportable `
    -StoreLocation 'LocalMachine' `
    -KeyLength 2048 `
    -ProviderName 'Microsoft Enhanced Cryptographic Provider v1.0' `
    -AlgorithmName 'RSA' `
    -SignatureAlgorithm 'SHA256'
# Locate the newly created certificate
$Cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object {
        ($_.FriendlyName -eq 'DSC Credential Encryption certificate') -and ($_.Subject -eq "CN=${ENV:ComputerName}")
    } | Select-Object -First 1
# export the public key certificate
$cert | Export-Certificate -FilePath "$env:temp\DscPublicKey.cer" -Force

Una vez exportado, el DscPublicKey.cer tendría que copiarse en el nodo de creación.Once exported, the DscPublicKey.cer would need to be copied to the Authoring Node.

En el nodo de creación: importación de la clave pública del certificadoOn the Authoring Node: import the cert's public key

# Import to the my store
Import-Certificate -FilePath "$env:temp\DscPublicKey.cer" -CertStoreLocation Cert:\LocalMachine\My

Creación del certificado en el nodo de creaciónCreating the Certificate on the Authoring Node

Como alternativa, se puede crear el certificado de cifrado en el nodo de creación , exportarlo con la clave privada como archivo PFX y después importarlo en el nodo de destino.Alternately, the encryption certificate can be created on the Authoring Node , exported with the private key as a PFX file and then imported on the Target Node. Este es el método actual para implementar el cifrado de credenciales de DSC en Nano Server.This is the current method for implementing DSC credential encryption on Nano Server. Aunque el PFX está protegido con una contraseña, debe estar protegido durante el tránsito.Although the PFX is secured with a password it should be kept secure during transit. En el ejemplo siguiente:The following example:

  1. crea un certificado en el nodo de creación.creates a certificate on the Authoring node.
  2. exporta el certificado, incluida la clave privada, en el nodo de creación.exports the certificate including the private key on the Authoring node.
  3. quita la clave privada del nodo de creación , pero mantiene el certificado de clave pública de mi almacén.removes the private key from the Authoring node , but keeps the public key certificate in the my store.
  4. importa el certificado de clave privada al almacén de certificados My(Personal) en el nodo de destino.imports the private key certificate into the My(Personal) certificate store on the Target node.
    • debe agregarse al almacén raíz, de forma que este será de confianza para el nodo de destino.it must be added to the root store so that it will be trusted by the Target node.

En el nodo de creación: creación y exportación de certificadosOn the Authoring Node: create and export the certificate

Nodo de destino: Windows Server 2016 y Windows 10Target Node: Windows Server 2016 and 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

Una vez exportado, el DscPrivateKey.pfx tendría que copiarse en el nodo de destino.Once exported, the DscPrivateKey.pfx would need to be copied to the Target Node.

Nodo de destino: Windows Server 2012 R2/Windows 8.1 y anterioresTarget Node: Windows Server 2012 R2/Windows 8.1 and earlier

Advertencia

Dado que el cmdlet New-SelfSignedCertificate en sistemas operativos anteriores a Windows 10 y Windows Server 2016 no admite el parámetro Type , en estos sistemas operativos es necesario un método alternativo para crear este certificado.Because the New-SelfSignedCertificate cmdlet on Windows Operating Systems prior to Windows 10 and Windows Server 2016 do not support the Type parameter, an alternate method of creating this certificate is required on these operating systems. En este caso puede usar makecert.exe o certutil.exe para crear el certificado.In this case you can use makecert.exe or certutil.exe to create the certificate. Un método alternativo consiste en descargar el script New-SelfSignedCertificateEx.ps1 desde el centro de scripts de Microsoft y usarlo para crear el certificado:An alternate method is to download the New-SelfSignedCertificateEx.ps1 script from Microsoft Script Center and use it to create the certificate instead:

# note: These steps need to be performed in an Administrator PowerShell session
# and in the folder that contains New-SelfSignedCertificateEx.ps1
. .\New-SelfSignedCertificateEx.ps1
New-SelfsignedCertificateEx `
    -Subject "CN=${ENV:ComputerName}" `
    -EKU 'Document Encryption' `
    -KeyUsage 'KeyEncipherment, DataEncipherment' `
    -SAN ${ENV:ComputerName} `
    -FriendlyName 'DSC Credential Encryption certificate' `
    -Exportable `
    -StoreLocation 'LocalMachine' `
    -KeyLength 2048 `
    -ProviderName 'Microsoft Enhanced Cryptographic Provider v1.0' `
    -AlgorithmName 'RSA' `
    -SignatureAlgorithm 'SHA256'
# Locate the newly created certificate
$Cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object {
        ($_.FriendlyName -eq 'DSC Credential Encryption certificate') -and ($_.Subject -eq "CN=${ENV:ComputerName}")
    } | Select-Object -First 1
# export the public 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

En el nodo de destino: importación de la clave privada del certificado raíz de confianzaOn the Target Node: import the cert's private key as a trusted root

# 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

Datos de configuraciónConfiguration data

El bloque de datos de configuración define los nodos de destino en los que operará, si se cifrarán las credenciales o no, los medios de cifrado y otra información.The configuration data block defines which target nodes to operate on, whether or not to encrypt the credentials, the means of encryption, and other information. Para más información sobre el bloque de datos de configuración, consulte Separación de los datos de entorno y configuración.For more information on the configuration data block, see Separating Configuration and Environment Data.

Los elementos que se pueden configurar para cada nodo que están relacionados con el cifrado de credenciales son:The elements that can be configured for each node that are related to credential encryption are:

  • NodeName : nombre del nodo de destino para el que se configura el cifrado de credenciales.NodeName - the name of the target node that the credential encryption is being configured for.
  • PsDscAllowPlainTextPassword : indica si las credenciales sin cifrar se pueden pasar a este nodo.PsDscAllowPlainTextPassword - whether unencrypted credentials will be allowed to be passed to this node. Esto no se recomienda.This is not recommended.
  • Huella digital : huella digital del certificado que se usará para descifrar las credenciales en la configuración de DSC en el nodo de destino.Thumbprint - the thumbprint of the certificate that will be used to decrypt the credentials in the DSC Configuration on the Target Node. Este certificado debe existir en el almacén de certificados de la máquina local en el nodo de destino.This certificate must exist in the Local Machine certificate store on the Target Node.
  • CertificateFile : archivo de certificado (que solo contiene la clave pública) que debe usarse para cifrar las credenciales para el nodo de destino.CertificateFile - the certificate file (containing the public key only) that should be used to encrypt the credentials for the Target Node. Debe ser un archivo de certificados con formato X.509 codificado base 64 o DER binario codificado X.509.This must be either a DER encoded binary X.509 or Base-64 encoded X.509 format certificate file.

En este ejemplo se muestra un bloque de datos de configuración que especifica un nodo de destino en el que se actuará con el nombre targetNode, la ruta de acceso al archivo de certificado de clave pública (denominado targetNode.cer) y la huella digital de la clave pública.This example shows a configuration data block that specifies a target node to act on named targetNode, the path to the public key certificate file (named targetNode.cer), and the thumbprint for the public key.

$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"
            }
        )
    }

Script de configuraciónConfiguration script

En el script de configuración, utilice el parámetro PsCredential para garantizar que las credenciales se almacenen durante el menor tiempo posible.In the configuration script itself, use the PsCredential parameter to ensure that credentials are stored for the shortest possible time. Al ejecutar el ejemplo facilitado, DSC pedirá las credenciales y luego cifrará el archivo MOF con el elemento CertificateFile que esté asociado con el nodo de destino en el bloque de datos de configuración.When you run the supplied example, DSC will prompt you for credentials and then encrypt the MOF file using the CertificateFile that is associated with the target node in the configuration data block. Este ejemplo de código copia un archivo desde un recurso compartido que está protegido para un usuario.This code example copies a file from a share that is secured to a user.

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
        }
    }
}

Configuración del descifradoSetting up decryption

Antes de que Start-DscConfiguration pueda funcionar, debe indicar al administrador de configuración local en cada nodo de destino qué certificado se usará para descifrar las credenciales, mediante el recurso CertificateID para comprobar la huella digital del certificado.Before Start-DscConfiguration can work, you have to tell the Local Configuration Manager on each target node which certificate to use to decrypt the credentials, using the CertificateID resource to verify the certificate's thumbprint. Esta función de ejemplo encontrará el certificado local adecuado (es posible que deba personalizarlo para que encuentre el certificado exacto que quiere utilizar):This example function will find the appropriate local certificate (you might have to customize it so it will find the exact certificate you want to use):

# 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
        }
    }
}

Con el certificado identificado mediante su huella digital, el script de configuración se puede actualizar para utilizar el valor:With the certificate identified by its thumbprint, the configuration script can be updated to use the value:

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
        }
    }
}

Ejecución de la configuraciónRunning the configuration

En este punto, puede ejecutar la configuración, lo que dará como resultado dos archivos:At this point, you can run the configuration, which will output two files:

  • Un archivo *.meta.mof que configura el administrador de configuración local para que descifre las credenciales mediante el certificado que está almacenado en el almacén de la máquina local y se identifique mediante su huella digital.A *.meta.mof file that configures the Local Configuration Manager to decrypt the credentials using the certificate that is stored on the local machine store and identified by its thumbprint. Set-DscLocalConfigurationManager aplica el archivo *.meta.mof .Set-DscLocalConfigurationManager applies the *.meta.mof file.
  • Un archivo MOF que aplica realmente la configuración.A MOF file that actually applies the configuration. Start-DscConfiguration aplica la configuración.Start-DscConfiguration applies the configuration.

Estos comandos llevará a cabo esos pasos:These commands will accomplish those steps:

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

En este ejemplo se insertaría la configuración de DSC en el nodo de destino.This example would push the DSC configuration to the target node. La configuración de DSC también se puede aplicar mediante un servidor de incorporación de cambios de DSC, si está disponible.The DSC configuration can also be applied using a DSC Pull Server if one is available.

Consulte Setting up a DSC pull client (Configuración de un cliente de extracción de DSC) para obtener más información sobre cómo aplicar configuraciones de DSC mediante un servidor de incorporación de cambios de DSC.See Setting up a DSC pull client for more information on applying DSC configurations using a DSC Pull Server.

Ejemplo de módulo de cifrado de credencialesCredential Encryption Module Example

Este es un ejemplo completo que incorpora todos estos pasos, además de un cmdlet del asistente que exporta y copia las claves públicas:Here is a full example that incorporates all of these steps, plus a helper cmdlet that exports and copies the public keys:

# 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