WMF 5.1에서 DSC(필요한 상태 구성)의 개선 사항Improvements in Desired State Configuration (DSC) in WMF 5.1

향상된 DSC 클래스 리소스DSC class resource improvements

WMF 5.1에서 다음과 같은 알려진 문제를 해결했습니다.In WMF 5.1, we have fixed the following known issues:

  • 클래스 기반 DSC 리소스의 Get() 함수에서 복합/해시 테이블 형식을 반환하는 경우 Get-DscConfiguration에서 빈 값(null) 또는 오류를 반환할 수 있습니다.Get-DscConfiguration may return empty values (null) or errors if a complex/hash table type is returned by Get() function of a class-based DSC resource.
  • DSC 구성에 RunAs 자격 증명이 사용된 경우 Get-DscConfiguration에서 오류를 반환합니다.Get-DscConfiguration returns error if RunAs credential is used in DSC configuration.
  • 복합 구성에서는 클래스 기반 리소스를 사용할 수 없습니다.Class-based resource cannot be used in a composite configuration.
  • 클래스 기반 리소스에 자체 형식의 속성이 있는 경우 Start-DscConfiguration이 중단됩니다.Start-DscConfiguration hangs if class-based resource has a property of its own type.
  • 클래스 기반 리소스를 단독 리소스로 사용할 수 없습니다.Class-based resource cannot be used as an exclusive resource.

향상된 DSC 리소스 디버깅DSC resource debugging improvements

WMF 5.0에서 PowerShell 디버거는 클래스 기반 리소스 메서드(Get/Set/Test)에서 바로 중지되지 않았습니다.In WMF 5.0, the PowerShell debugger did not stop at the class-based resource method (Get/Set/Test) directly. WMF 5.1에서는 디버거가 MOF 기반 리소스 메서드와 동일하게 클래스 기반 리소스 메서드에서 중지됩니다.In WMF 5.1, the debugger stops at the class-based resource method in the same way as for MOF-based resources methods.

DSC 끌어오기 클라이언트가 TLS 1.1 및 TLS 1.2 지원DSC pull client supports TLS 1.1 and TLS 1.2

기존에 DSC 끌어오기 클라이언트는 HTTPS 연결을 통해 SSL3.0 및 TLS1.0만 지원했습니다.Previously, the DSC pull client only supported SSL3.0 and TLS1.0 over HTTPS connections. 더 안전한 프로토콜을 사용하도록 하는 경우 끌어오기 클라이언트의 작동이 중지되었습니다.When forced to use more secure protocols, the pull client would stop functioning. WMF 5.1에서는 DSC 끌어오기 클라이언트가 SSL 3.0을 더 이상 지원하지 않고 더 안전한 TLS 1.1 및 TLS 1.2 프로토콜을 추가로 지원합니다.In WMF 5.1, the DSC pull client no longer supports SSL 3.0 and adds support for the more secure TLS 1.1 and TLS 1.2 protocols.

향상된 끌어오기 서버 등록Improved pull server registration

이전 버전의 WMF에서는 ESENT 데이터베이스를 사용하는 동안 DSC 끌어오기 서버에 동시 등록/보고 요청을 하는 경우 LCM이 등록 및/또는 보고에 실패했습니다.In the earlier versions of WMF, simultaneous registrations/reporting requests to a DSC pull server while using the ESENT database would lead to LCM failing to register and/or report. 이러한 경우 끌어오기 서버의 이벤트 로그에 "이미 사용 중인 인스턴스 이름" 오류가 표시됩니다.In such cases, the event logs on the pull server has the error "Instance Name already in use." 이는 다중 스레드 시나리오에서 잘못된 패턴을 사용하여 ESENT 데이터베이스에 액세스하기 때문이었습니다.This was due to an incorrect pattern being used to access the ESENT database in a multi-threaded scenario. WMF 5.1에서는 이 문제가 해결되었습니다.In WMF 5.1, this issue has been fixed. WMF 5.1에서는 동시 등록 또는 보고(ESENT 데이터베이스 포함)가 올바로 작동합니다.Concurrent registrations or reporting (involving ESENT database) works fine in WMF 5.1. 이 문제는 ESENT 데이터베이스에만 적용되고 OLEDB 데이터베이스에는 적용되지 않습니다.This issue is applicable only to the ESENT database and does not apply to the OLEDB database.

ESENT 데이터베이스 인스턴스에 순환 로그 사용Enable Circular log on ESENT database instance

이전 버전의 DSC-PullServer에서는 데이터베이스 인스턴스가 순환 로깅 없이 만들어지므로 ESENT 데이터베이스 로그 파일이 끌어오기 서버의 디스크 공간을 가득 채웠습니다.In eariler version of DSC-PullServer, the ESENT database log files were filling up the disk space of the pullserver becouse the database instance was being created without circular logging. 이 릴리스에서는 끌어오기 서버의 web.config를 사용하여 인스턴스의 순환 로깅 동작을 제어할 수 있습니다.In this release, you have the option to control the circular logging behavior of the instance using the web.config of the pullserver. 기본적으로 CircularLogging은 TRUE로 설정됩니다.By default CircularLogging is set to TRUE.

<appSettings>
    <add key="dbprovider" value="ESENT" />
    <add key="dbconnectionstr" value="C:\Program Files\WindowsPowerShell\DscService\Devices.edb" />
    <add key="CheckpointDepthMaxKB" value="512" />
    <add key="UseCircularESENTLogs" value="TRUE" />
  </appSettings>

부분 구성 명명 규칙 끌어오기Pull partial configuration naming convention

이전 릴리스에서는 부분 구성에 대한 명명 규칙에 따라 끌어오기 서버/서비스의 MOF 파일 이름이 로컬 구성 관리자 설정에 지정된 부분 구성 이름과 일치하여 MOF 파일에 포함된 구성 이름과 일치해야 했습니다.In the previous release, the naming convention for a partial configuration was that the MOF file name in the pull server/service should match the partial configuration name specified in the local configuration manager settings that in turn must match the configuration name embedded in the MOF file.

아래 스냅숏을 참조하세요.See the snapshots below:

  • 노드가 수신할 수 있는 부분 구성을 정의하는 로컬 구성 설정입니다.Local configuration settings which defines a partial configuration that a node is allowed to receive.

샘플 메타 구성

  • 샘플 부분 구성 정의Sample partial configuration definition
Configuration PartialOne
{
    Node('localhost')
    {
        File test
        {
            DestinationPath = "$env:TEMP\partialconfigexample.txt"
            Contents = 'Partial Config Example'
        }
    }
}
PartialOne
  • 생성된 MOF 파일에 포함된 ‘ConfigurationName’'ConfigurationName' embedded in the generated MOF file.

생성된 mof 파일 샘플

  • 풀 구성 리포지토리의 FileNameFileName in the pull configuration repository

구성 리포지토리의 FileName

Azure 자동화 서비스 이름은 MOF 파일을 <ConfigurationName>.<NodeName>.mof로 생성했습니다.Azure Automation service name generated MOF files as <ConfigurationName>.<NodeName>.mof. 따라서 아래 구성은 PartialOne.localhost.mof로 컴파일됩니다.So the configuration below compiles to PartialOne.localhost.mof.

따라서 Azure 자동화 서비스에서 부분 구성 중 하나를 끌어올 수 없었습니다.This made it impossible to pull one of your partial configuration from Azure Automation service.

Configuration PartialOne
{
    Node('localhost')
    {
        File test
        {
            DestinationPath = "$env:TEMP\partialconfigexample.txt"
            Contents = 'Partial Config Example'
        }
    }
}
PartialOne

WMF 5.1에서는 끌어오기 서버/서비스의 부분 구성을 <ConfigurationName>.<NodeName>.mof로 명명할 수 있습니다.In WMF 5.1, a partial configuration in the pull server/service can be named as <ConfigurationName>.<NodeName>.mof. 또한 컴퓨터가 끌어오기 서버/서비스에서 단일 구성을 끌어오는 경우 끌어오기 서버 구성 리포지토리의 구성 파일에 원하는 이름을 지정할 수 있습니다.Moreover, if a machine is pulling a single configuration from a pull server/service then the configuration file on the pull server configuration repository can have any file name. 이러한 명명 유연성을 통해 노드를 Azure Automation 서비스로 부분적으로 관리할 수 있습니다. 이 경우 노드의 일부 구성을 Azure Automation DSC에서 가져오고 부분 구성을 로컬로 관리할 수 있습니다.This naming flexibility allows you to manage your nodes partially by Azure Automation service, where some configuration for your node is coming from Azure Automation DSC and with a partial configuration that you manage locally.

아래 메타 구성은 노드를 로컬뿐 아니라 Azure Automation 서비스에서 관리하도록 설정합니다.The metaconfiguration below sets up a node to be managed both locally as well as by Azure Automation service.

[DscLocalConfigurationManager()]
Configuration RegistrationMetaConfig
{
    Settings
    {
        RefreshFrequencyMins = 30
        RefreshMode = "PULL"
    }

    ConfigurationRepositoryWeb web
    {
        ServerURL =  $endPoint
        RegistrationKey = $registrationKey
        ConfigurationNames = $configurationName
    }

    # Partial configuration managed by Azure Automation service.
    PartialConfiguration PartialConfigurationManagedByAzureAutomation
    {
        ConfigurationSource = "[ConfigurationRepositoryWeb]Web"
    }

    # This partial configuration is managed locally.
    PartialConfiguration OnPremisesConfig
    {
        RefreshMode = "PUSH"
        ExclusiveResources = @("Script")
    }

}

RegistrationMetaConfig
Set-DscLocalConfigurationManager -Path .\RegistrationMetaConfig -Verbose

DSC 복합 리소스와 함께 PsDscRunAsCredential 사용Using PsDscRunAsCredential with DSC composite resources

PsDscRunAsCredential을 DSC 복합 리소스와 함께 사용할 수 있도록 지원을 추가했습니다.We have added support for using PsDscRunAsCredential with DSC Composite resources.

이제 구성 내에서 복합 리소스를 사용할 때 PsDscRunAsCredential 값을 지정할 수 있습니다.You can now specify a value for PsDscRunAsCredential when using composite resources inside configurations. 이 값을 지정할 경우 모든 리소스가 복합 리소스 내에서 RunAs 사용자로 실행됩니다.When specified, all resources run inside a composite resource as a RunAs user. 복합 리소스가 다른 복합 리소스를 호출하는 경우에도 모든 리소스가 RunAs 사용자로 실행됩니다.If a composite resource calls another composite resource, all of its resources are also executed as RunAs user. RunAs 자격 증명은 복합 리소스 계층 구조의 모든 수준에 전파됩니다.RunAs credentials are propagated to any level of the composite resource hierarchy. 복합 리소스 내의 리소스가 PsDscRunAsCredential의 고유한 값을 지정하는 경우 구성 컴파일 중 병합 오류가 발생합니다.If any resource inside a composite resource specifies its own value for PsDscRunAsCredential, a merge error results during configuration compilation.

이 예제에서는 PSDesiredStateConfiguration 모듈에 포함된 WindowsFeatureSet 복합 리소스와 함께 사용하는 방법입니다.This example shows usage with WindowsFeatureSet composite resource included in PSDesiredStateConfiguration module.

Configuration InstallWindowsFeature
{
    Import-DscResource -ModuleName PSDesiredStateConfiguration

    Node $AllNodes.NodeName
    {
        WindowsFeatureSet features
        {
            Name = @("Telnet-Client","SNMP-Service")
            Ensure = "Present"
            IncludeAllSubFeature = $true
            PsDscRunAsCredential = Get-Credential
        }
    }
}

$configData = @{
    AllNodes = @(
        @{
            NodeName             = 'localhost'
            PSDscAllowDomainUser = $true
            CertificateFile      = 'C:\publicKeys\targetNode.cer'
            Thumbprint           = '7ee7f09d-4be0-41aa-a47f-96b9e3bdec25'
        }
    )
}

InstallWindowsFeature -ConfigurationData $configData

DSC 모듈 및 구성 서명 유효성 검사DSC module and configuration signing validations

DSC에서는 구성 및 모듈이 끌어오기 서버에서 관리되는 컴퓨터로 배포됩니다.In DSC, configurations and modules are distributed to managed computers from the pull server. 끌어오기 서버가 손상되는 경우 공격자가 끌어오기 서버의 구성 및 모듈을 수정하고 모든 관리되는 노드로 배포하여 모든 노드를 손상시킬 수 있습니다.If the pull server is compromised, an attacker can potentially modify the configurations and modules on the pull server and have it distributed to all managed nodes, compromising all of them.

WMF 5.1의 DSC에서는 카탈로그 및 구성(.MOF) 파일에 있는 디지털 서명의 유효성을 검사할 수 있습니다.In WMF 5.1, DSC supports validating the digital signatures on catalog and configuration (.MOF) files. 이 기능은 노드에서 신뢰할 수 있는 서명자가 서명하지 않았거나 신뢰할 수 있는 서명자가 서명한 후 변조된 구성 또는 모듈 파일을 실행하지 못하게 합니다.This feature prevents nodes from executing configurations or module files which are not signed by a trusted signer or which have been tampered with after they have been signed by trusted signer.

구성 및 모듈에 서명하는 방법How to sign configuration and module


  • 구성 파일(.MOF): 기존 PowerShell cmdlet Set-AuthenticodeSignature가 MOF 파일 서명을 지원하도록 확장되었습니다.Configuration Files (.MOFs): The existing PowerShell cmdlet Set-AuthenticodeSignature is extended to support signing of MOF files.
  • 모듈: 다음 단계에 따라 해당 모듈 카탈로그에 서명하여 모듈 서명을 수행합니다.Modules: Signing of modules is done by signing the corresponding module catalog using the following steps:
    1. 카탈로그 파일을 만듭니다. 카탈로그 파일에는 암호화 해시 또는 지문의 컬렉션이 포함됩니다.Create a catalog file: A catalog file contains a collection of cryptographic hashes or thumbprints. 각 지문은 모듈에 포함된 파일에 해당합니다.Each thumbprint corresponds to a file that is included in the module. 사용자가 모듈의 카탈로그 파일을 만들 수 있도록 지원하는 새로운 New-FileCatalog cmdlet이 추가되었습니다.The new cmdlet New-FileCatalog, has been added to enable users to create a catalog file for their module.
    2. 카탈로그 파일에 서명합니다. Set-AuthenticodeSignature를 사용하여 카탈로그 파일에 서명합니다.Sign the catalog file: Use Set-AuthenticodeSignature to sign the catalog file.
    3. 카탈로그 파일을 모듈 폴더 내에 배치합니다.Place the catalog file inside the module folder. 규칙에 따라 모듈 카탈로그 파일은 모듈과 이름이 같은 모듈 폴더에 배치해야 합니다.By convention, module catalog file should be placed under the module folder with the same name as the module.

서명 유효성 검사를 사용하도록 설정하는 LocalConfigurationManager 설정LocalConfigurationManager settings to enable signing validations

끌어오기Pull

노드의 LocalConfigurationManager는 현재 설정에 따라 모듈 및 구성의 서명 유효성 검사를 수행합니다.The LocalConfigurationManager of a node performs signing validation of modules and configurations based on its current settings. 기본적으로 서명 유효성 검사를 사용하지 않도록 설정되어 있습니다.By default, signature validation is disabled. 서명 유효성 검사를 사용하도록 설정하려면 아래 표시된 노드의 메타 구성 정의에 'SignatureValidation' 블록을 추가합니다.Signature validation can enabled by adding the ‘SignatureValidation’ block to the meta-configuration definition of the node as shown below:

[DSCLocalConfigurationManager()]
Configuration EnableSignatureValidation
{
    Settings
    {
        RefreshMode = 'PULL'
    }

    ConfigurationRepositoryWeb pullserver{
      ConfigurationNames = 'sql'
      ServerURL = 'http://localhost:8080/PSDSCPullServer/PSDSCPullServer.svc'
      AllowUnsecureConnection = $true
      RegistrationKey = 'd6750ff1-d8dd-49f7-8caf-7471ea9793fc' # Replace this with correct registration key.
    }
    SignatureValidation validations{
        # If the TrustedStorePath property is provided then LCM will use the custom path. Otherwise, the LCM will use default trusted store path (Cert:\LocalMachine\DSCStore) to find the signing certificate.
        TrustedStorePath = 'Cert:\LocalMachine\DSCStore'
        SignedItemType = 'Configuration','Module'         # This is a list of DSC artifacts, for which LCM need to verify their digital signature before executing them on the node.
    }

}
EnableSignatureValidation
Set-DscLocalConfigurationManager -Path .\EnableSignatureValidation -Verbose

노드에서 위의 메타 구성을 설정하면 다운로드된 구성 및 모듈에서 서명 유효성을 검사할 수 있습니다.Setting the above metaconfiguration on a node enables signature validation on downloaded configurations and modules. 로컬 구성 관리자는 다음 단계를 수행하여 디지털 서명을 확인합니다.The Local Configuration Manager performs the following steps to verify the digital signatures.

  1. 구성 파일(.MOF)의 서명이 유효한지 확인합니다.Verify the signature on a configuration file (.MOF) is valid. 5.1에서 MOF 서명 유효성 검사를 지원하도록 확장된 PowerShell cmdlet Get-AuthenticodeSignature를 사용합니다.It uses the PowerShell cmdlet Get-AuthenticodeSignature, which is extended in 5.1 to support MOF signature validation.
  2. 서명자에게 권한을 부여한 인증 기관을 신뢰할 수 있는지 확인합니다.Verify the certificate authority that authorized the signer is trusted.
  3. 구성의 모듈/리소스 종속성을 임시 위치로 다운로드합니다.Download module/resource dependencies of the configuration to a temp location.
  4. 모듈 내에 포함된 카탈로그의 서명을 확인합니다.Verify the signature of the catalog included inside the module.
    • <moduleName>.cat 파일을 찾고 Get-AuthenticodeSignature cmdlet을 사용하여 해당 서명을 확인합니다.Find a <moduleName>.cat file and verify its signature using the cmdlet Get-AuthenticodeSignature.
    • 서명자를 인증한 인증 기관을 신뢰할 수 있는지 확인합니다.Verify the certification authority that authenticated the signer is trusted.
    • Test-FileCatalog cmdlet을 사용하여 모듈의 콘텐츠가 변조되지 않았는지 확인합니다.Verify the content of the modules has not been tampered using the new cmdlet Test-FileCatalog.
  5. 모듈을 $env:ProgramFiles\WindowsPowerShell\Modules\에 설치Install-Module to $env:ProgramFiles\WindowsPowerShell\Modules\
  6. 구성 처리Process configuration

참고: 모듈 카탈로그 및 구성의 서명 유효성 검사는 시스템에 구성을 처음으로 적용할 때나 모듈을 다운로드하여 설치할 때만 수행합니다.Note: Signature validation on module-catalog and configuration is only performed when the configuration is applied to the system for the first time or when the module is downloaded and installed. 일관성 검사에서는 Current.mof 또는 해당 모듈 종속성의 서명 유효성을 검사하지 않습니다.Consistency runs do not validate the signature of Current.mof or its module dependencies. 끌어오기 서버에서 끌어온 구성에 서명이 되어 있지 않은 등 어느 단계에서든 유효성 검사가 실패하면 구성 처리가 종료되고 아래와 같은 오류가 표시되며 모든 임시 파일이 삭제됩니다.If verification has failed at any stage, for instance, if the configuration pulled from the pull server is unsigned, then processing of the configuration terminates with the error shown below and all temporary files are deleted.

샘플 오류 출력 구성

마찬가지로 카탈로그에 서명이 되어 있지 않은 모듈을 끌어오면 다음 오류가 발생합니다.Similarly, pulling a module whose catalog is not signed results in the following error:

샘플 오류 출력 모듈

푸시Push

푸시를 사용하여 전달된 구성은 노드로 전달되기 전에 해당 소스에서 변조될 수 있습니다.A configuration delivered by using push might be tampered with at its source before it delivered to the node. 로컬 구성 관리자는 푸시되거나 게시된 구성에 대해 비슷한 서명 유효성 검사 단계를 수행합니다.The Local Configuration Manager performs similar signature validation steps for pushed or published configuration(s). 다음은 푸시에 대한 서명 유효성 검사의 완전한 예제입니다.Below is a complete example of signature validation for push.

  • 노드에서 서명 유효성 검사를 사용하도록 설정합니다.Enable signature validation on the node.
[DSCLocalConfigurationManager()]
Configuration EnableSignatureValidation
{
    Settings
    {
        RefreshMode = 'PUSH'
    }
    SignatureValidation validations{
        TrustedStorePath = 'Cert:\LocalMachine\DSCStore'
        SignedItemType =  'Configuration','Module'
    }

}
EnableSignatureValidation
Set-DscLocalConfigurationManager -Path .\EnableSignatureValidation -Verbose
  • 샘플 구성 파일을 만듭니다.Create a sample configuration file.
# Sample configuration
Configuration Test
{

    File foo
    {
        DestinationPath =  "$env:TEMP\signingTest.txt"
        Contents = "ABC"
    }
}
Test
  • 서명되지 않은 구성 파일을 노드로 푸시해 봅니다.Try pushing the unsigned configuration file in to the node.
Start-DscConfiguration -Path .\Test -Wait -Verbose -Force

ErrorUnsignedMofPushed

  • 코드 서명 인증서를 사용하여 구성 파일에 서명합니다.Sign the configuration file using code-signing certificate.

SignMofFile

  • 서명된 MOF 파일을 푸시해 봅니다.Try pushing the signed MOF file.

SignMofFile