Opciones de credenciales en los datos de configuraciónCredentials Options in Configuration Data

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

Contraseñas de texto sin formato y usuarios del dominioPlain Text Passwords and Domain Users

Las configuraciones DSC que contienen una credencial sin cifrado generarán un mensaje de error sobre contraseñas de texto sin formato.DSC configurations containing a credential without encryption will generate an error message about plain text passwords. Además, DSC generará una advertencia cuando se usen credenciales de dominio.Also, DSC will generate a warning when using domain credentials. Para suprimir estos mensajes de advertencia y de error, utilice las palabras clave de datos de configuración DSC:To suppress these error and warning messages use the DSC configuration data keywords:

  • PsDscAllowPlainTextPasswordPsDscAllowPlainTextPassword
  • PsDscAllowDomainUserPsDscAllowDomainUser

Nota

En general, no es seguro almacenar o transmitir contraseñas de texto sin formato y no cifradas.Storing/transmitting plaintext passwords unencrypted is generally not secure. Se recomienda proteger las credenciales mediante el uso de las técnicas que se describirán más adelante en este tema.Securing credentials by using the techniques covered later in this topic is recommended. El servicio DSC de Azure Automation le permite administrar de forma centralizada las credenciales que se deben compilar en las configuraciones y almacenar de forma segura.The Azure Automation DSC service allows you to centrally manage credentials to be compiled in configurations and stored securely. Para obtener información, vea los artículos Compilación de configuraciones DSC y Recursos de credenciales.For information, see: Compiling DSC Configurations / Credential Assets

Control de credenciales en DSCHandling Credentials in DSC

Los recursos de configuración DSC se ejecutan como Local System de forma predeterminada.DSC configuration resources run as Local System by default. Sin embargo, algunos recursos necesitan una credencial, por ejemplo cuando el recurso Package necesita instalar software en una cuenta de usuario concreta.However, some resources need a credential, for example when the Package resource needs to install software under a specific user account.

Los recursos anteriores utilizaban un nombre de propiedad Credential codificado de forma rígida para controlar esto.Earlier resources used a hard-coded Credential property name to handle this. WMF 5.0 agregó una propiedad PsDscRunAsCredential automática para todos los recursos.WMF 5.0 added an automatic PsDscRunAsCredential property for all resources. Para obtener más información sobre cómo usar PsDscRunAsCredential, vea DSC de ejecución con las credenciales de usuario.For information about using PsDscRunAsCredential, see Running DSC with user credentials. Los recursos más recientes y los recursos personalizados pueden utilizar esta propiedad automática en lugar de crear su propia propiedad para las credenciales.Newer resources and custom resources can use this automatic property instead of creating their own property for credentials.

Nota

El diseño de algunos recursos implica que se van a usar varias credenciales para un motivo concreto y tendrán sus propias propiedades de credencial.The design of some resources are to use multiple credentials for a specific reason, and they will have their own credential properties.

Para encontrar las propiedades de credenciales disponibles en un recurso, use Get-DscResource -Name ResourceName -Syntax o Intellisense en el ISE (CTRL+SPACE).To find the available credential properties on a resource use either Get-DscResource -Name ResourceName -Syntax or the Intellisense in the ISE (CTRL+SPACE).

Get-DscResource -Name Group -Syntax
Group [String] #ResourceName
{
    GroupName = [string]
    [Credential = [PSCredential]]
    [DependsOn = [string[]]]
    [Description = [string]]
    [Ensure = [string]{ Absent | Present }]
    [Members = [string[]]]
    [MembersToExclude = [string[]]]
    [MembersToInclude = [string[]]]
    [PsDscRunAsCredential = [PSCredential]]
}

En este ejemplo se utiliza un recurso Group del módulo de recursos integrado de DSC PSDesiredStateConfiguration.This example uses a Group resource from the PSDesiredStateConfiguration built-in DSC resource module. Puede crear grupos locales y agregar o quitar miembros.It can create local groups and add or remove members. Acepta tanto la propiedad Credential como la propiedad automática PsDscRunAsCredential.It accepts both the Credential property and the automatic PsDscRunAsCredential property. No obstante, el recurso solo utiliza la propiedad Credential.However, the resource only uses the Credential property.

Para más información sobre la propiedad PsDscRunAsCredential, consulte DSC de ejecución con las credenciales de usuario.For more information about the PsDscRunAsCredential property, see Running DSC with user credentials.

Ejemplo: la propiedad Credential del recurso GroupExample: The Group resource Credential property

DSC se ejecuta en Local System, por lo que ya tiene permisos para cambiar grupos y usuarios locales.DSC runs under Local System, so it already has permissions to change local users and groups. Si el miembro agregado es una cuenta local, no se necesitan credenciales.If the member added is a local account, then no credential is necessary. Si el recurso Group agrega una cuenta de dominio al grupo local, es necesaria una credencial.If the Group resource adds a domain account to the local group, then a credential is necessary.

No se permiten las consultas anónimas a Active Directory.Anonymous queries to Active Directory are not allowed. La propiedad Credential del recurso Group es la cuenta de dominio que se utiliza para consultar a Active Directory.The Credential property of the Group resource is the domain account used to query Active Directory. En la mayoría de casos esto podría deberse a una cuenta de usuario genérica ya que, de forma predeterminada, los usuarios pueden leer la mayoría de objetos de Active Directory.For most purposes this could be a generic user account, because by default users can read most of the objects in Active Directory.

Configuración de ejemploExample Configuration

En el ejemplo de código siguiente se utiliza DSC para rellenar un grupo local con un usuario de dominio:The following example code uses DSC to populate a local group with a domain user:

Configuration DomainCredentialExample
{
    param
    (
        [PSCredential] $DomainCredential
    )
    Import-DscResource -ModuleName PSDesiredStateConfiguration

    node localhost
    {
        Group DomainUserToLocalGroup
        {
            GroupName        = 'ApplicationAdmins'
            MembersToInclude = 'contoso\alice'
            Credential       = $DomainCredential
        }
    }
}

$cred = Get-Credential -UserName contoso\genericuser -Message "Password please"
DomainCredentialExample -DomainCredential $cred

Este código genera un error y un mensaje de advertencia:This code generates both an error and warning message:

ConvertTo-MOFInstance : System.InvalidOperationException error processing property 'Credential' OF
TYPE 'Group': Converting and storing encrypted passwords as plain text is not recommended.
For more information on securing credentials in MOF file, please refer to MSDN blog:
https://go.microsoft.com/fwlink/?LinkId=393729

At line:11 char:9
+   Group
At line:341 char:16
+     $aliasId = ConvertTo-MOFInstance $keywordName $canonicalizedValue
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Write-Error], InvalidOperationException
    + FullyQualifiedErrorId : FailToProcessProperty,ConvertTo-MOFInstance
WARNING: It is not recommended to use domain credential for node 'localhost'. In order to suppress
the warning, you can add a property named 'PSDscAllowDomainUser' with a value of $true to your DSC
configuration data for node 'localhost'.

Compilation errors occurred while processing configuration
'DomainCredentialExample'. Please review the errors reported in error stream and modify your
configuration code appropriately.
At C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PSDesiredStateConfiguration.psm1:3917 char:5
+     throw $ErrorRecord
+     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (DomainCredentialExample:String) [], InvalidOperationException
    + FullyQualifiedErrorId : FailToProcessConfiguration

Este ejemplo tiene dos problemas:This example has two issues:

  1. Un error explica que no se recomiendan las contraseñas de texto sin formato.An error explains that plain text passwords are not recommended
  2. Una advertencia recomienda que no se use una credencial de dominio.A warning advises against using a domain credential

Las marcas de PSDSCAllowPlainTextPassword y PSDSCAllowDomainUser suprimen el error y la advertencia que informan al usuario del riesgo que conlleva.The flags PSDSCAllowPlainTextPassword and PSDSCAllowDomainUser suppress the error and warning informing the user of the risk involved.

PSDSCAllowPlainTextPasswordPSDSCAllowPlainTextPassword

El primer mensaje de error tiene una dirección URL con documentación.The first error message has a URL with documentation. En este vínculo se explica cómo cifrar contraseñas con una estructura ConfigurationData y un certificado.This link explains how to encrypt passwords using a ConfigurationData structure and a certificate. Para más información sobre certificados y DSC, lea esta publicación.For more information on certificates and DSC read this post.

Para forzar una contraseña de texto sin formato, el recurso requiere la palabra clave PsDscAllowPlainTextPassword en la sección de datos de configuración, como se indica a continuación:To force a plain text password, the resource requires the PsDscAllowPlainTextPassword keyword in the configuration data section as follows:

$password = "ThisIsAPlaintextPassword" | ConvertTo-SecureString -asPlainText -Force
$username = "contoso\Administrator"
[PSCredential] $credential = New-Object System.Management.Automation.PSCredential($username,$password)

Configuration DomainCredentialExample
{
    Import-DscResource -ModuleName PSDesiredStateConfiguration

    node localhost
    {
        Group DomainUserToLocalGroup
        {
            GroupName        = 'ApplicationAdmins'
            MembersToInclude = 'contoso\alice'
            Credential       = $credential
        }
    }
}

$cd = @{
    AllNodes = @(
        @{
            NodeName = 'localhost'
            PSDscAllowPlainTextPassword = $true
        }
    )
}

DomainCredentialExample -ConfigurationData $cd

localhost.moflocalhost.mof

La marca PSDSCAllowPlainTextPassword requiere que el usuario reconozca el riesgo de almacenar contraseñas de texto sin formato en un archivo MOF.The PSDSCAllowPlainTextPassword flag requires that the user acknowledge the risk of storing plain text passwords in a MOF file. En el archivo MOF generado, aunque se utilizó un objeto PSCredential que contenía un valor SecureString , las contraseñas aún aparecen como texto sin formato.In the generated MOF file, even though a PSCredential object containing a SecureString was used, the passwords still appear as plain text. Esta es la única vez que se exponen las credenciales.This is the only time the credentials are exposed. Al obtener acceso a este archivo MOF, cualquier persona puede acceder a la cuenta de administrador.Gaining access to this MOF file gives anyone access to the Administrator account.

/*
@TargetNode='localhost'
@GeneratedBy=Administrator
@GenerationDate=01/31/2019 06:43:13
@GenerationHost=Server01
*/

instance of MSFT_Credential as $MSFT_Credential1ref
{
Password = "ThisIsAPlaintextPassword";
 UserName = "Administrator";

};

instance of MSFT_GroupResource as $MSFT_GroupResource1ref
{
ResourceID = "[Group]DomainUserToLocalGroup";
 MembersToInclude = {
    "contoso\\alice"
};
 Credential = $MSFT_Credential1ref;
 SourceInfo = "::11::9::Group";
 GroupName = "ApplicationAdmins";
 ModuleName = "PSDesiredStateConfiguration";

ModuleVersion = "1.0";

 ConfigurationName = "DomainCredentialExample";

};

Credenciales en tránsito y en reposoCredentials in transit and at rest

  • La marca PSDscAllowPlainTextPassword permite la compilación de archivos MOF que contienen contraseñas como texto no cifrado.The PSDscAllowPlainTextPassword flag allows the compilation of MOF files that contain passwords in clear text. Tome precauciones cuando almacene archivos MOF que contienen contraseñas de texto no cifrado.Take precautions when storing MOF files containing clear text passwords.
  • Cuando el archivo MOF se entrega a un nodo en modo de inserción , WinRM cifra la comunicación para proteger la contraseña de texto no cifrado a menos que reemplace el valor predeterminado por el parámetro AllowUnencrypted.When the MOF file is delivered to a Node in Push mode, WinRM encrypts the communication to protect the clear text password unless you override the default with the AllowUnencrypted parameter.
    • El cifrado del MOF con un certificado protege el archivo MOF en reposo antes de que se haya aplicado a un nodo.Encrypting the MOF with a certificate protects the MOF file at rest before it has been applied to a node.
  • En el modo de extracción , puede configurar el servidor de extracción de Windows para usar HTTPS para el cifrado del tráfico mediante el protocolo especificado en Internet Information Server.In Pull mode, you can configure Windows pull server to use HTTPS to encrypt traffic using the protocol specified in Internet Information Server. Para obtener más información, consulte los artículos Configuración de un cliente de extracción de DSC y Proteger el archivo MOF.For more information, see the articles Setting up a DSC pull client and Securing MOF files with Certificates.
  • En el nodo, los archivos MOF se cifran en reposo a partir de PowerShell 5.0.On the Node, MOF files are encrypted at rest Beginning in PowerShell 5.0.
    • En PowerShell 4.0, los archivos MOF no se cifran en reposo, a menos que se cifrasen con un certificado cuando se insertaron en el nodo o se extrajeron de él.In PowerShell 4.0 MOF files are unencrypted at rest unless they are encrypted with a certificate when they pushed or pulled to the Node.

Microsoft aconseja evitar las contraseñas de texto sin formato por sus riesgos de seguridad considerables.Microsoft advises to avoid plain text passwords due to the significant security risk.

Credenciales del dominioDomain Credentials

Si se ejecuta de nuevo el script de configuración de ejemplo (con o sin cifrado), se sigue generando la advertencia que indica que no se recomienda el uso de una cuenta de dominio para una credencial.Running the example configuration script again (with or without encryption), still generates the warning that using a domain account for a credential is not recommended. Si se utiliza una cuenta local, se elimina la posible exposición de credenciales de dominio podría usarse en otros servidores.Using a local account eliminates potential exposure of domain credentials that could be used on other servers.

Cuando se usan credenciales con recursos de DSC, siempre que sea posible es preferible usar una cuenta local en lugar de una cuenta de dominio.When using credentials with DSC resources, prefer a local account over a domain account when possible.

Si hay un carácter '\' o '@' en la propiedad Username de la credencial, DSC lo tratará como una cuenta de dominio.If there is a '\' or '@' in the Username property of the credential, then DSC will treat it as a domain account. Existen excepciones para "localhost", "127.0.0.1" y "::1" en la parte del dominio del nombre de usuario.There is an exception for "localhost", "127.0.0.1", and "::1" in the domain portion of the user name.

PSDscAllowDomainUserPSDscAllowDomainUser

En el ejemplo del recurso Group de DSC anterior, la consulta a un dominio de Active Directory requiere una cuenta de dominio.In the DSC Group resource example above, querying an Active Directory domain requires a domain account. En este caso, agregue la propiedad PSDscAllowDomainUser al bloque ConfigurationData como se indica a continuación:In this case add the PSDscAllowDomainUser property to the ConfigurationData block as follows:

$password = "ThisIsAPlaintextPassword" | ConvertTo-SecureString -asPlainText -Force
$username = "contoso\Administrator"
[PSCredential] $credential = New-Object System.Management.Automation.PSCredential($username,$password)

Configuration DomainCredentialExample
{
    Import-DscResource -ModuleName PSDesiredStateConfiguration

    node localhost
    {
        Group DomainUserToLocalGroup
        {
            GroupName        = 'ApplicationAdmins'
            MembersToInclude = 'contoso\alice'
            Credential       = $credential
        }
    }
}

$cd = @{
    AllNodes = @(
        @{
            NodeName = 'localhost'
            PSDscAllowDomainUser = $true
            PSDscAllowPlainTextPassword = $true
        }
    )
}

DomainCredentialExample -ConfigurationData $cd

Ahora, el script de configuración generará el archivo MOF sin errores ni advertencias.Now the configuration script will generate the MOF file with no errors or warnings.