구성 데이터의 자격 증명 옵션Credentials Options in Configuration Data

적용 대상: Windows PowerShell 5.0Applies To: Windows PowerShell 5.0

일반 텍스트 암호 및 도메인 사용자Plain Text Passwords and Domain Users

암호화하지 않고 자격 증명을 포함하는 DSC를 구성하면 일반 텍스트 암호에 대한 오류 메시지가 생성됩니다.DSC configurations containing a credential without encryption will generate an error message about plain text passwords. 또한 DSC에서는 도메인 자격 증명을 사용하는 경우 경고를 생성합니다.Also, DSC will generate a warning when using domain credentials. 이러한 오류 및 경고 메시지가 발생하지 않도록 하려면, DSC 구성 데이터 키워드를 사용합니다.To suppress these error and warning messages use the DSC configuration data keywords:

  • PsDscAllowPlainTextPasswordPsDscAllowPlainTextPassword
  • PsDscAllowDomainUserPsDscAllowDomainUser

참고

일반적으로 암호화되지 않은 일반 텍스트 암호를 저장/전송하는 작업은 안전하지 않습니다.Storing/transmitting plaintext passwords unencrypted is generally not secure. 이 항목의 뒷부분에 설명된 기술을 사용하여 자격 증명을 보호하는 것이 좋습니다.Securing credentials by using the techniques covered later in this topic is recommended. Azure Automation DSC 서비스를 사용하면 자격 증명을 중앙에서 관리하여 구성에서 컴파일하고 안전하게 저장할 수 있습니다.The Azure Automation DSC service allows you to centrally manage credentials to be compiled in configurations and stored securely. 자세한 내용은 DSC 구성 컴파일/자격 증명 자산을 참조하세요.For information, see: Compiling DSC Configurations / Credential Assets

다음은 일반 텍스트 자격 증명을 전달하는 예입니다.The following is an example of passing plain text credentials:

#Prompt user for their credentials
#credentials will be unencrypted in the MOF
$promptedCreds = get-credential -Message "Please enter your credentials to generate a DSC MOF:"

# Store passwords in plaintext, in the document itself
# will also be stored in plaintext in the mof
$password = "ThisIsAPlaintextPassword" | ConvertTo-SecureString -asPlainText -Force
$username = "User1"
[PSCredential] $credential = New-Object System.Management.Automation.PSCredential($username,$password)

# DSC requires explicit confirmation before storing passwords insecurely
$ConfigurationData = @{
    AllNodes = @(
        @{
            # The "*" means "all nodes named in ConfigData" so we don't have to repeat ourselves
            NodeName="*"
            PSDscAllowPlainTextPassword = $true
        },
        #however, each node still needs to be explicitly defined for "*" to have meaning
        @{
            NodeName = "TestMachine1"
        },
        #we can also use a property to define node-specific passwords, although this is no more secure
        @{
            NodeName = "TestMachine2";
            UserName = "User2"
            LocalPassword = "ThisIsYetAnotherPlaintextPassword"
        }
        )
}
configuration unencryptedPasswordDemo
{
    Node "TestMachine1"
    {
        # We use the plaintext password to generate a new account
        User User1
        {
            UserName = $username
            Password = $credential
            Description = "local account"
            Ensure = "Present"
            Disabled = $false
            PasswordNeverExpires = $true
            PasswordChangeRequired = $false
        }
        # We use the prompted password to add this account to the local admins group
        Group addToAdmin
        {
            # Ensure the user exists before we add the user to a group
            DependsOn = "[User]User1"
            Credential = $promptedCreds
            GroupName = "Administrators"
            Ensure = "Present"
            MembersToInclude = "User1"
        }
    }

    Node "TestMachine2"
    {
        # Now we'll use a node-specific password to this machine
        $password = $Node.LocalPassword | ConvertTo-SecureString -asPlainText -Force
        $username = $node.UserName
        [PSCredential] $nodeCred = New-Object System.Management.Automation.PSCredential($username,$password)

        User User2
        {
            UserName = $username
            Password = $nodeCred
            Description = "local account"
            Ensure = "Present"
            Disabled = $false
            PasswordNeverExpires = $true
            PasswordChangeRequired = $false
        }

        Group addToAdmin
        {
            Credential = $promptedCreds
            GroupName = "Administrators"
            DependsOn = "[User]User2"
            Ensure = "Present"
            MembersToInclude = "User2"
        }
    }

}
# We declared the ConfigurationData in a local variable, but we need to pass it in to our configuration function
# We need to invoke the configuration function we created to generate a MOF
unencryptedPasswordDemo -ConfigurationData $ConfigurationData
# We need to pass the MOF to the machines we named.
#-wait: doesn't use jobs so we get blocked at the prompt until the configuration is done
#-verbose: so we can see what's going on and catch any errors
#-force: for testing purposes, I run start-dscconfiguration frequently + want to make sure i'm
#        not blocked by previous configurations that are still running
Start-DscConfiguration ./unencryptedPasswordDemo -verbose -wait -force

DSC에서의 자격 증명 처리Handling Credentials in DSC

기본적으로 DSC 구성 리소스는 Local System으로 실행됩니다.DSC configuration resources run as Local System by default. 그러나 일부 리소스는 Package 리소스가 특정 사용자 계정으로 소프트웨어를 설치해야 할 때와 같은 경우 자격 증명을 필요로 합니다.However, some resources need a credential, for example when the Package resource needs to install software under a specific user account.

이전 리소스에서는 하드 코드된 Credential 속성 이름을 사용하여 이 문제를 처리했습니다.Earlier resources used a hard-coded Credential property name to handle this. WMF 5.0에서는 모든 리소스에 대해 자동 PsDscRunAsCredential 속성을 추가했습니다.WMF 5.0 added an automatic PsDscRunAsCredential property for all resources. PsDscRunAsCredential 사용에 대한 자세한 내용은 사용자 자격 증명을 사용하여 DSC 실행을 참조하세요.For information about using PsDscRunAsCredential, see Running DSC with user credentials. 최신 리소스와 사용자 지정 리소스에서는 자격 증명에 대한 고유한 속성을 만드는 대신 이 자동 속성을 사용할 수 있습니다.Newer resources and custom resources can use this automatic property instead of creating their own property for credentials.

참고

일부 리소스의 디자인이 특정한 이유로 여러 자격 증명을 사용하게 되면 이러한 리소스는 고유한 자격 증명 속성을 갖게 됩니다.The design of some resources are to use multiple credentials for a specific reason, and they will have their own credential properties.

리소스에 대해 사용 가능한 자격 증명 속성을 찾으려면 Get-DscResource -Name ResourceName -Syntax나 ISE의 Intellisense(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).

PS C:\> 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]]
}

이 예제에서는 PSDesiredStateConfiguration 기본 제공 DSC 리소스 모듈의 그룹 리소스를 사용합니다.This example uses a Group resource from the PSDesiredStateConfiguration built-in DSC resource module. 로컬 그룹을 만들고 구성원을 추가 또는 제거할 수 있으며,It can create local groups and add or remove members. Credential 속성 및 자동 PsDscRunAsCredential 속성도 둘 다 받습니다.It accepts both the Credential property and the automatic PsDscRunAsCredential property. 그러나 리소스는 Credential 속성만 사용합니다.However, the resource only uses the Credential property.

PsDscRunAsCredential 속성에 대한 자세한 내용은 사용자 자격 증명을 사용하여 DSC 실행을 참조하세요.For more information about the PsDscRunAsCredential property, see Running DSC with user credentials.

예: 그룹 리소스 자격 증명 속성Example: The Group resource Credential property

DSC는 Local System에서 실행되므로, DSC에는 이미 로컬 사용자 및 그룹을 변경할 권한이 있습니다.DSC runs under Local System, so it already has permissions to change local users and groups. 추가된 구성원이 로컬 계정이라면 자격 증명이 필요하지 않습니다.If the member added is a local account, then no credential is necessary. Group 리소스에서 로컬 그룹에 도메인 계정을 추가한다면, 자격 증명이 필요합니다.If the Group resource adds a domain account to the local group, then a credential is necessary.

Active Directory에 대한 익명 쿼리는 허용되지 않습니다.Anonymous queries to Active Directory are not allowed. Group 리소스의 Credential 속성은 Active Directory에 대해 쿼리하는 데 사용된 도메인 계정입니다.The Credential property of the Group resource is the domain account used to query Active Directory. 대부분의 경우 사용자는 기본적으로 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.

예제 구성Example Configuration

다음 코드 예제에서는 DSC를 사용하여 도메인 사용자로 로컬 그룹을 채웁니다.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

이 코드는 오류 메시지와 경고 메시지를 모두 생성합니다.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:
http://go.microsoft.com/fwlink/?LinkId=393729

At line:11 char:9
+   Group
At line:297 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'.

이 예제에는 두 가지 문제가 있습니다.This example has two issues:

  1. 오류에서는 일반 텍스트 암호는 권장되지 않는다고 설명합니다.An error explains that plain text passwords are not recommended
  2. 경고에서는 도메인 자격 증명을 사용하지 말라고 합니다.A warning advises against using a domain credential

PsDscAllowPlainTextPasswordPsDscAllowPlainTextPassword

첫 번째 오류 메시지에는 설명이 있는 URL이 있습니다.The first error message has a URL with documentation. 이 링크에서는 ConfigurationData 구조와 인증서를 사용하여 암호를 암호화하는 방법에 대해 설명입니다.This link explains how to encrypt passwords using a ConfigurationData structure and a certificate. 인증서 및 DSC에 대한 자세한 내용은 이 게시물을 읽어 보세요.For more information on certificates and DSC read this post.

일반 텍스트 암호를 적용하려면 다음과 같이 리소스의 구성 데이터 섹션에 PsDscAllowPlainTextPassword 키워드가 있어야 합니다.To force a plain text password, the resource requires the PsDscAllowPlainTextPassword keyword in the configuration data section as follows:

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

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

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

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

참고

NodeName 은 별표와 같을 수 없으며 특정 노드 이름은 필수입니다.NodeName cannot equal asterisk, a specific node name is mandatory.

Microsoft에서는 일반 텍스트 암호가 상당한 보안 위험이 있으므로 사용하지 말 것을 권고합니다.Microsoft advises to avoid plain text passwords due to the significant security risk.

도메인 자격 증명Domain Credentials

예제 구성 스크립트를 다시 실행(암호화를 사용하든 사용하지 않든)해도 여전히 자격 증명에 대한 도메인 계정을 사용하지 않는 것이 좋다는 경고가 생성됩니다.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. 로컬 계정을 사용하면 다른 서버에 사용할 수 있는 도메인 자격 증명이 노출될 가능성을 없어집니다.Using a local account eliminates potential exposure of domain credentials that could be used on other servers.

DSC 리소스에서 자격 증명을 사용할 경우 가능하면 도메인 계정보다는 로컬 계정을 사용하도록 합니다.When using credentials with DSC resources, prefer a local account over a domain account when possible.

자격 증명의 Username 속성에 '' 또는 'If there is a " data-throw-if-not-resolved="False" data-raw-source="@'가 없다면 DSC에서는 이것을 도메인 계정으로 처리합니다.</span><span class="sxs-lookup"><span data-stu-id="304b8-154">If there is a '" sourceFile="configDataCredentials.md" sourceStartLineNumber="284">' or '@' in the Username property of the credential, then DSC will treat it as a domain account. 사용자 이름의 도메인 부분에 "localhost", "127.0.0.1" 및 "::1"에 대한 예외가 있습니다.There is an exception for "localhost", "127.0.0.1", and "::1" in the domain portion of the user name.

PSDscAllowDomainUserPSDscAllowDomainUser

위의 DSC Group 리소스 예제에서 Active Directory 도메인에 대해 쿼리하려면 도메인 계정이 있어야 합니다.In the DSC Group resource example above, querying an Active Directory domain requires a domain account. 이 경우 다음과 같이 PSDscAllowDomainUser 속성을 ConfigurationData 블록에 추가합니다.In this case add the PSDscAllowDomainUser property to the ConfigurationData block as follows:

$cd = @{
    AllNodes = @(
        @{
            NodeName = 'localhost'
            PSDscAllowDomainUser = $true
            # PSDscAllowPlainTextPassword = $true
            CertificateFile = "C:\PublicKeys\server1.cer"
        }
    )
}

이제 구성 스크립트가 오류 또는 경고 없이 MOF 파일을 생성합니다.Now the configuration script will generate the MOF file with no errors or warnings.