다음을 통해 공유


사용자 지정 컴퓨터 구성 정책 정의를 만드는 방법

시작하기 전에 컴퓨터 구성에 대한 개요 페이지와 컴퓨터 구성의 수정 옵션에 대한 세부 정보를 읽어보는 것이 좋습니다.

Important

Azure Virtual Machines에는 컴퓨터 구성 확장이 필요합니다. 모든 머신에서 확장을 대규모로 배포하려면 정책 이니셔티브(Deploy prerequisites to enable machine configuration policies on virtual machines)를 할당합니다.

구성을 적용하는 컴퓨터 구성 패키지를 사용하려면 Azure VM 게스트 구성 확장 버전 1.26.24 이상 또는 Arc 에이전트 1.10.0 이상이 필요합니다.

AuditIfNotExists 또는 DeployIfNotExists 중 하나를 사용하는 사용자 지정 컴퓨터 구성 정책 정의는 GA(일반 공급) 지원 상태입니다.

다음 단계를 사용하여 규정 준수를 감사하거나 Azure 또는 Arc 사용 머신의 상태를 관리하는 고유한 정책을 만듭니다.

PowerShell 7 및 필수 PowerShell 모듈 설치

먼저 컴퓨터 구성 제작 환경을 설정하여 OS 및 GuestConfiguration 모듈에 필요한 PowerShell 버전을 설치합니다.

컴퓨터 구성 패키지 아티팩트 만들기 및 게시

아직 만들지 않은 경우 사용자 지정 컴퓨터 구성 패키지 아티팩트를 만드는 방법의 단계에 따라 사용자 지정 컴퓨터 구성 패키지를 만들고 게시합니다. 그런 다음, 컴퓨터 구성 패키지 아티팩트를 테스트하는 방법의 단계에 따라 개발 환경에서 패키지의 유효성을 검사합니다.

참고 항목

이 문서의 예제 코드는 $contentUri 변수를 참조합니다. 패키지 아티팩트를 만들고 테스트하기 위해 이전 자습서와 동일한 PowerShell 세션을 사용하는 경우 해당 변수에 이미 패키지에 대한 URI가 있을 수 있습니다.

PowerShell 세션에서 패키지의 URI로 설정된 변수가 없는 경우 $contentUri 변수를 설정해야 합니다. 이 예제에서는 스토리지 계정의 연결 문자열New-AzStorageContext cmdlet을 사용하여 스토리지 컨텍스트를 만듭니다. 그런 다음, 게시된 패키지에 대한 스토리지 Blob을 가져오고 해당 개체의 속성을 사용하여 콘텐츠 URI를 가져옵니다.

$connectionString = '<storage-account-connection-string>'
$context = New-AzStorageContext -ConnectionString $connectionString
$getParams = @{
    Context   = $context
    Container = '<container-name>'
    Blob      = '<published-package-file-name>'
}
$blob = Get-AzStorageBlob @getParams
$contentUri = $blob.ICloudBlob.Uri.AbsoluteUri

컴퓨터 구성에 대한 정책 요구 사항

컴퓨터 구성 할당의 프로비저닝 및 보고를 자동화하기 위해 정책 정의 메타데이터 섹션에는 게스트 구성 서비스를 위한 두 개의 속성이 포함되어야 합니다. 범주 속성은 Guest Configuration으로 설정해야 하며 guestConfiguration이라는 섹션에는 컴퓨터 구성 할당에 대한 정보가 포함되어야 합니다. New-GuestConfigurationPolicy cmdlet은 이 텍스트를 자동으로 만듭니다.

다음 예제에서는 New-GuestConfigurationPolicy에 의해 자동으로 생성되는 메타데이터 섹션을 보여 줍니다.

"metadata": {
    "category": "Guest Configuration",
    "guestConfiguration": {
        "name": "test",
        "version": "1.0.0",
        "contentType": "Custom",
        "contentUri": "CUSTOM-URI-HERE",
        "contentHash": "CUSTOM-HASH-VALUE-HERE",
        "configurationParameter": {}
    }
}

정의 효과가 DeployIfNotExists로 설정된 경우 then 섹션에는 컴퓨터 구성 할당에 대한 배포 세부 정보가 포함되어야 합니다. New-GuestConfigurationPolicy cmdlet은 이 텍스트를 자동으로 만듭니다.

Azure Policy 정의 만들기

컴퓨터 구성 사용자 지정 정책 패키지가 만들어지고 업로드되면 컴퓨터 구성 정책 정의를 만듭니다. New-GuestConfigurationPolicy cmdlet은 사용자 지정 정책 패키지를 사용하고 정책 정의를 만듭니다.

New-GuestConfigurationPolicyPolicyId 매개 변수에는 고유한 문자열이 필요합니다. GUID(전역적으로 고유한 식별자)가 필요합니다. 새 정의에는 New-GUID cmdlet을 사용하여 새 GUID를 생성합니다. 정의를 업데이트할 때 PolicyId에 같은 고유 문자열을 사용하여 올바른 정의가 업데이트되었는지 확인합니다.

New-GuestConfigurationPolicy cmdlet의 매개 변수는 다음과 같습니다.

  • PolicyId: GUID입니다.
  • ContentUri: 컴퓨터 구성 콘텐츠 패키지의 공용 HTTP URI입니다.
  • DisplayName - 정책 표시 이름입니다.
  • 설명: 정책 설명입니다.
  • 매개 변수: 해시 테이블에 제공된 정책 매개 변수입니다.
  • PolicyVersion: 정책 버전입니다.
  • 경로: 정책 정의가 만들어지는 대상 경로입니다.
  • 플랫폼: 컴퓨터 구성 정책 및 콘텐츠 패키지를 위한 대상 플랫폼(Windows/Linux)입니다.
  • 모드: (대/소문자 구분: ApplyAndMonitor, ApplyAndAutoCorrectAudit) 정책에서 구성을 감사하거나 배포해야 하는지 여부를 선택합니다. 기본값은 Audit입니다.
  • Tag는 정책 정의에 하나 이상의 태그 필터를 추가합니다.
  • Category는 정책 정의의 범주 메타데이터 필드를 설정합니다.

Mode 매개 변수에 대한 자세한 내용은 컴퓨터 구성을 위한 수정 옵션을 구성하는 방법 페이지를 참조하세요.

지정된 경로에서 사용자 지정 구성 패키지를 사용하여 감사하는 정책 정의를 만듭니다.

$PolicyConfig      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My audit policy'
  Description   = 'My audit policy'
  Path          = './policies/auditIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyConfig

지정된 경로에서 사용자 지정 구성 패키지를 사용하여 구성을 배포하는 정책 정의를 만듭니다.

$PolicyConfig2      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My deployment policy'
  Description   = 'My deployment policy'
  Path          = './policies/deployIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
  Mode          = 'ApplyAndAutoCorrect'
}

New-GuestConfigurationPolicy @PolicyConfig2

cmdlet 출력은 정책 파일의 정책 표시 이름과 경로가 포함된 개체를 반환합니다. 감사 정책 정의를 만드는 정책 JSON 파일의 이름은 auditIfNotExists.json이며 구성을 적용하기 위해 정책 정의를 만드는 파일의 이름은 deployIfNotExists.json입니다.

태그를 사용하여 컴퓨터 구성 정책 필터링

GuestConfiguration 모듈에서 cmdlet으로 생성되는 정책 정의에는 선택적으로 태그에 대한 필터가 포함될 수 있습니다. New-GuestConfigurationPolicyTag 매개 변수는 개별 태그 항목을 포함하는 해시 테이블의 배열을 지원합니다. 태그는 정책 정의의 if 섹션에 추가되며 정책 할당으로 수정할 수 없습니다.

태그를 필터링하는 정책 정의의 예제 코드 조각은 다음과 같습니다.

"if": {
  "allOf" : [
    {
      "allOf": [
        {
          "field": "tags.Owner",
          "equals": "BusinessUnit"
        },
        {
          "field": "tags.Role",
          "equals": "Web"
        }
      ]
    },
    {
      // Original machine configuration content
    }
  ]
}

사용자 지정 컴퓨터 구성 정책 정의에서 매개 변수 사용

컴퓨터 구성은 런타임 시 DSC 구성 속성 재정의를 지원합니다. 이 기능은 패키지의 MOF 파일에 있는 값을 정적으로 간주할 필요가 없음을 의미합니다. 재정의 값은 Azure Policy를 통해 제공되며 DSC 구성을 작성하거나 컴파일하는 방법을 변경하지 않습니다.

컴퓨터 구성은 매개 변수에 대해 다음 값 형식을 지원합니다.

  • 문자열
  • 부울
  • 두 배
  • Float

cmdlet New-GuestConfigurationPolicyGet-GuestConfigurationPackageComplianceStatus에는 Parameters라는 매개 변수가 포함됩니다. 이 매개 변수는 각 매개 변수에 대한 모든 세부 정보를 포함하는 해시 테이블 정의를 사용하고 Azure Policy 정의에 사용되는 각 파일의 필요한 섹션을 만듭니다.

다음 예에서는 서비스를 감사할 정책 정의를 만듭니다. 사용자는 정책 할당 시 이를 목록에서 선택할 수 있습니다.

# This DSC resource definition...
Service 'UserSelectedNameExample' {
    Name   = 'ParameterValue'
    Ensure = 'Present'
    State  = 'Running'
}

# ...can be converted to a hash table:
$PolicyParameterInfo     = @(
  @{
    # Policy parameter name (mandatory)
    Name                 = 'ServiceName'
    # Policy parameter display name (mandatory)
    DisplayName          = 'windows service name.'
    # Policy parameter description (optional)
    Description          = 'Name of the windows service to be audited.'
    # DSC configuration resource type (mandatory)
    ResourceType         = 'Service'
    # DSC configuration resource id (mandatory)
    ResourceId           = 'UserSelectedNameExample'
    # DSC configuration resource property name (mandatory)
    ResourcePropertyName = 'Name'
    # Policy parameter default value (optional)
    DefaultValue         = 'winrm'
    # Policy parameter allowed values (optional)
    AllowedValues        = @('BDESVC','TermService','wuauserv','winrm')
  })

# ...and then passed into the `New-GuestConfigurationPolicy` cmdlet
$PolicyParam = @{
  PolicyId      = 'My GUID'
  ContentUri    = $contentUri
  DisplayName   = 'Audit Windows Service.'
  Description   = "Audit if a Windows Service isn't enabled on Windows machine."
  Path          = '.\policies\auditIfNotExists.json'
  Parameter     = $PolicyParameterInfo
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyParam

Azure Policy 정의 게시

마지막으로 New-AzPolicyDefinition cmdlet을 사용하여 정책 정의를 게시할 수 있습니다. 아래 명령은 컴퓨터 구성 정책을 정책 센터에 게시합니다.

New-AzPolicyDefinition 명령을 실행하려면 Azure에서 정책 정의를 만들기 위한 액세스 권한이 필요합니다. 특정 권한 부여 요구 사항은 Azure Policy 개요 페이지에 설명되어 있습니다. 권장되는 기본 제공 역할은 Resource Policy Contributor입니다.

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\auditIfNotExists.json'

또는 정책이 DINE(존재하지 않는 경우) 배포인 경우 다음 명령을 사용합니다.

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\deployIfNotExists.json'

Azure에서 만든 정책 정의를 사용하는 마지막 단계는 정의를 할당하는 단계입니다. Portal, Azure CLIAzure PowerShell을 사용하여 정의를 할당하는 방법을 참조하세요.

정책 수명 주기

정책 정의의 업데이트를 릴리스하려면 게스트 구성 패키지와 Azure Policy 정의 세부 정보를 모두 변경합니다.

참고 항목

컴퓨터 구성 할당의 version 속성은 Microsoft에서 호스팅하는 패키지에만 영향을 줍니다. 사용자 지정 콘텐츠의 버전을 관리하는 가장 좋은 방법은 버전을 파일 이름에 포함하는 것입니다.

먼저, New-GuestConfigurationPackage를 실행할 때, 이전 버전과는 차별되는 고유한 패키지의 이름을 지정합니다. 이름에 버전 번호를 포함할 수 있습니다(예: PackageName_1.0.0). 이 예의 숫자는 패키지를 고유하게 만드는 데만 사용되며 패키지를 다른 패키지보다 최신 버전 또는 이전 버전으로 간주하도록 지정하기 위한 것은 아닙니다.

둘째, 다음 각 설명에 따라 New-GuestConfigurationPolicy cmdlet에 사용된 매개 변수를 업데이트합니다.

  • 버전: New-GuestConfigurationPolicy cmdlet을 실행할 때 현재 게시된 것보다 큰 버전 번호를 지정해야 합니다.
  • contentUri: New-GuestConfigurationPolicy cmdlet을 실행할 때 패키지의 위치에 대한 URI를 지정해야 합니다. 패키지 버전을 파일 이름에 포함하면 각 릴리스에서 속성의 값이 변경됩니다.
  • contentHash: New-GuestConfigurationPolicy cmdlet은 이 속성을 자동으로 업데이트합니다. 이는 New-GuestConfigurationPackage에서 만든 패키지의 해시 값입니다. 게시하는 .zip 파일에 대한 속성이 정확해야 합니다. contentUri 속성만 업데이트되면 확장에서 콘텐츠 패키지를 거부합니다.

업데이트된 패키지를 릴리스하는 가장 쉬운 방법은 이 문서에 설명된 프로세스를 반복하고 업데이트된 버전 번호를 지정하는 것입니다. 해당 프로세스는 모든 속성이 올바르게 업데이트되었음을 보장합니다.

다음 단계