다음을 통해 공유


WDAC(Windows Defender 애플리케이션 제어) 적용 인프라 관리를 위한 확장 지원

Windows Admin Center는 플랫폼 수준에서 WDAC(Windows Defender 애플리케이션 제어) 적용 인프라 관리를 지원합니다. Windows Admin Center에서 WDAC 적용 인프라를 관리하는 방법에 대해 자세히 알아봅니다.

플랫폼 수준에서 해당 관리를 지원한다고 해서 Windows Admin Center용으로 빌드된 확장이 기본적으로 WDAC 강제 인프라 관리를 지원하는 것은 아닙니다. 해당 가이드는 WDAC 강제 인프라 관리를 지원하기 위한 확장 요구 사항을 간략하게 설명합니다.

확장 구조 요구 사항

WDAC 적용 인프라를 관리하려면 Windows Admin Center에서 PowerShell 스크립트를 특정 방식으로 수집하고 실행하여 모범 보안 사례를 준수해야 합니다. 확장의 스크립트가 올바르게 실행되게 하려면 확장이 다음 요구 사항을 준수하는지 확인하세요.

모든 PowerShell 스크립트를 파일에 저장해야 합니다.

지금까지 WAC 확장 개발자는 사용자 지정 PowerShell 코드를 확장 manifest.json 파일에 문자열로 포함하도록 선택했을 수 있습니다. 예를 들어 '스크립트' 속성에 PowerShell 스크립트를 제공하여 도구 확장의 표시 유형에 대한 조건을 정의하도록 선택할 수 있습니다. PowerShell 스크립트가 WDAC와 호환되려면 서명이 필요합니다. 문자열은 서명할 수 없습니다.

이 요구 사항을 충족하려면 다음 단계를 수행하세요.

  1. manifest.json 파일에서 PowerShell 스크립트를 식별합니다.
  2. manifest.json 파일에서 스크립트 콘텐츠를 정의한 후 스크립트 콘텐츠를 제거하고, 확장의 resources/scripts 디렉터리에 있는 .ps1 파일에 저장합니다. 확장 매니페스트의 스크립트 코드는 이제 다른 Windows Admin Center PowerShell과 동일한 규칙을 따릅니다.
  3. 확장 매니페스트의 조건 속성을 다음 형식으로 업데이트합니다.
    "conditions": [
        {
            "powerShell": {
                "command": "Script-File-Name",
                "module": "powerShellModuleName",
                "script": "Your script text goes here."
            }
        }
    ]
    
    확장 매니페스트에 PowerShell 모듈 이름이 이미 있습니다. 매니페스트 및 PowerShell 필드의 해당 값은 일치해야 합니다.
  4. PowerShell 스크립트를 동적으로 생성하는 다른 위치를 식별합니다. 문자열 연결을 사용하여 동적으로 PowerShell 스크립트를 생성하게 되면 공격자가 임의의 PowerShell 스크립트를 삽입하여 실행할 수 있습니다. 해당 메서드는 제한된 실행 공간을 사용하는 원격 사용자에게 적용되는 제한을 우회하는 데 사용할 수 있습니다. 또한 사용자 입력으로 PowerShell 스크립트를 빌드하고 실행하는 모든 애플리케이션에 대해 표준 명령 주입을 달성하는 데 사용할 수 있습니다.

문자열 연결을 사용하여 만든 스크립트 블록의 예:

param($UserInputVar)
$DynamicScript = "Get-ChildItem $UserInputVar"
$ScriptBlock = [ScriptBlock]::Create($DynamicScript)
Invoke-Command $ScriptBlock

문자열 연결 없이 구성된 동일 스크립트 블록의 예:

param($UserInputVar)
 [ScriptBlock]$ScriptBlock = {
Param($SafeUserInput)
Get-ChildItem $ SafeUserInput
 }
 Invoke-Command -ScriptBlock $ScriptBlock -ArgumentList @($UserInputVar)

# OR, alternatively
param($UserInputVar)
 Invoke-Command -ScriptBlock {
 param(
    [String] $SafeUserInput
 )
Get-ChildItem $SafeUserInput

} -ArgumentList $UserInputVar

또한 문자열 연결로 스크립트 파일을 생성해서는 안 됩니다. 스크립트 파일을 생성하지 않는 방법의 예는 다음과 같습니다.

$Script=@'
    Get-ChildItem $UserInputVar
'@
$Script = '$ UserInputVar =' + "'$ UserInputVar;"+$Script 
$path = “C:\temp”
$Script | Out-File $path

대신 다음과 같이 스크립트 파일을 생성하세요.

Function test {
    param(
        [String] $userInputVar
     )
    Get-ChildItem $UserInputVar
    }
   
    $path = “C:\temp”
    (Get-Command test).ScriptBlock | Set-Content -path $path

모든 PowerShell 코드를 서명하고 적절한 위치에 저장해야 합니다.

WDAC 적용 인프라 관리를 지원하고자 Windows Admin Center가 변경한 내용의 일부이며, 확장에 대한 서명된 PowerShell 스크립트가 실행되기 전 현재 연결된 노드로 전송됩니다. 또한 이전 요구 사항에 언급된 대로 WDAC 적용 인프라는 서명된 PowerShell 스크립트만 실행합니다. 이러한 요구 사항으로 인해 모든 PowerShell 코드에는 서명이 필요합니다. Windows Admin Center 플랫폼에서 확장의 서명된 모듈을 예측할 수 있도록 모든 PowerShell도 일관된 위치에 있어야 합니다.

확장 리포지토리에 서명된 PowerShell 모듈이 포함된 powershell-module 디렉터리가 없는 경우, Windows Admin Center 플랫폼은 전송 가능한 코드를 식별할 수 없으며 WDAC 적용 환경에서 작업이 실패합니다.

Windows Admin Center gulp build 명령은 리포지토리 내의 /dist 폴더를 업데이트하여 모듈 폴더 내에 서명되지 않은 .psd1 및 .psm1 파일을 생성합니다. 이러한 파일은 WDAC 정책에 허용된 인증서와 일치하는 서명 인증서로 서명해야 합니다.

이를 변경하려면 PowerShell 서명을 통합하는 빌드 파이프라인을 생성하는 것이 좋습니다.

PowerShell이 다음 두 가지 방법 중 하나로 적절한 형식인지 확인할 수 있습니다.

  1. 확장이 설치되면 게이트웨이 컴퓨터(Windows Admin Center가 실행 중인 ProgramData\Server Management Experience\UX\modules 디렉터리)를 볼 수 있습니다. 여기에 powershell-module 폴더와 서명된 PowerShell 모듈이 표시됩니다.
  2. 확장의 .nupkg 아티팩트의 내용을 추출합니다. powershell-module 폴더가 있고 서명된 PowerShell 모듈을 포함해야 합니다.

두 경우 모두 파일에서 Get-AuthenticodeSignature 명령을 실행하거나 파일 자체를 마우스 오른쪽 버튼으로 클릭하고 디지털 서명의 유효성을 검사하여 .psd1 및 .psm1 파일 자체에 서명되었는지 확인할 수 있습니다.

'powerShellScript' 속성을 활용하는 WorkItems는 'powerShellCommand' 속성을 사용하도록 업데이트해야 합니다.

Windows Admin Center 플랫폼은 PowerShell 명령이 속한 모듈을 확인할 수 있어야 합니다. 이 요구 사항으로 인해 powerShellScript 속성을 사용하여 PowerShell 명령을 지정하는 WorkItems에서 오류가 발생합니다.

이 동작을 완화하려면 createCommand 메서드와 함께 powerShellCommand 속성을 사용하여 유효한 명령 개체를 형성합니다.

다음은 이전 메서드를 사용하는 WorkItem의 예입니다.

    const workItem : WorkItemSubmitRequest = {
      typeId: "SampleWorkItem",
      title: "Title",
      powerShellScript: PowerShellScripts.[scriptName],
      successMessage: "Success",
      errorMessage: "Error",
      progressMessage: "In progress..."
    }

새 메서드를 사용하는 동일한 WorkItem은 다음과 같습니다.

    const workItem : WorkItemSubmitRequest = {
      typeId: "SampleWorkItem",
      title: "Title",
      powerShellCommand: PowerShell.createCommand(PowerShellScripts.[scriptName]),
      successMessage: "Success",
      errorMessage: "Error",
      progressMessage: "In progress..."
    }

제한된 언어 모드에서 PowerShell 스크립트 실행 확인

많은 WDAC 정책은 모든 PowerShell 스크립트를 제한된 언어 모드에서 실행하도록 강제합니다. Windows Admin Center 전체에서 전체 기능을 유지하려면 확장의 모든 스크립트가 다음 모범 사례를 따르도록 해야 합니다.

  1. PowerShell 모듈을 사용하여 스크립트 파일을 내보낸 경우 와일드카드 문자를 사용하지 않고 이름으로 함수를 명시적으로 내보내야 합니다. 해당 요구 사항은 공개적으로 사용되지 않을 수 있는 도우미 함수가 실수로 노출되지 않도록 하기 위한 것입니다.
  2. 스크립트 파일을 점 소싱하면 해당 스크립트의 모든 함수, 변수, 별칭이 현재 범위로 이동합니다. 해당 기능은 신뢰할 수 있는 스크립트가 신뢰할 수 없는 스크립트로 점 소스가 되고 모든 내부 함수를 노출하지 못하도록 차단합니다. 마찬가지로 신뢰할 수 없는 스크립트는 신뢰할 수 있는 범위를 오염시킬 수 없도록 신뢰할 수 있는 스크립트에 점 소스가 되는 것을 방지합니다.
  3. 제한 언어 모드에서 스크립트 블록을 성공적으로 실행할 수 없는 경우 Start-Job 명령을 사용하여 스크립트 블록을 실행하지 않는 것이 좋습니다.

WDAC 강제 인프라 관리를 지원하지 못하는 경우에 제안된 오류 처리

WDAC 적용 컴퓨터에서 확장 실행을 지원하지 않으려는 경우 사용자 혼동을 방지하기 위해 WDAC 적용 인프라의 관리가 확장에서 지원되지 않는 시나리오임을 설명하는 UI를 추가하는 것을 권장합니다. 확장 아이콘과 확장 iFrame을 중심으로 하는 텍스트를 특징으로 하는 기존 Azure 하이브리드 서비스 페이지와 같은 레이아웃을 사용하는 것이 좋습니다.

이 페이지의 텍스트에는 다음 문구를 권장합니다.

'이 확장은 현재 WDAC(Windows Defender 애플리케이션 제어)가 적용된 컴퓨터에서 실행을 지원하지 않습니다.'

이 텍스트는 제안 사항일 뿐입니다. 사용하려는 단어에 대해 잘 모르겠는 경우 wacextensionrequests@microsoft.com로 Windows Admin Center 팀에 이메일을 보내세요.

확장에서 WDAC 적용 검색

이전 섹션의 지침을 따르려면 연결된 노드에 WDAC가 적용되었는지 확인해야 합니다. Windows Admin Center는 WDAC 적용을 결정하기 위해 Windows Admin Center의 WDAC 작업의 일부로 정의된 getPsLanguageMode 메서드를 노출합니다.

이 메서드는 두 개의 출력을 갖습니다.

  • 상태 – HTTPStatusCode 유형
  • psLanguageMode – PsLanguageMode 형식(열거형)

PowerShell이 psLanguageMode 값 3에 해당하는 제한된 언어 모드에서 실행되는 경우 WDAC가 적용되는 것을 고려할 수 있습니다.

다음 TypeScript 샘플 코드는 이 메서드를 사용하는 방법의 예를 제공합니다.

import { Component, OnInit } from '@angular/core';
import { AppContextService } from '@microsoft/windows-admin-center-sdk/angular';
import { WdacOperations } from '@microsoft/windows-admin-center-sdk/core';
import { PSLanguageMode, PsLanguageModeResult } from '@microsoft/windows-admin-center-sdk/core/data/wdac-operations';

@Component({
  selector: 'default-component',
  templateUrl: './default.component.html',
  styleUrls: ['./default.component.css']
})
export class DefaultComponent implements OnInit {
wdacEnforced: boolean;

  constructor(private appContextService: AppContextService) {
    //
  }

  public ngOnInit(): void {

  }

  public checkWDACEnforced(): void {
    const wdacOperations = new WdacOperations(this.appContextService);
    wdacOperations.getPsLanguageMode(this.appContextService.activeConnection.nodeName).subscribe(
      (response: PsLanguageModeResult) => {
          if (response.psLanguageMode.toString() === PSLanguageMode[PSLanguageMode.ConstrainedLanguage]) {
            this.wdacEnforced = true;
          }
          else {
            this.wdacEnforced = false;
          }
      }
    );
  }
}

WDAC 적용 인프라에서 확장 테스트

WDAC 강제 인프라에서 확장을 테스트하기 시작하기 위한 Windows Admin Center 의 Windows Defender 애플리케이션 제어 정책 요구 사항에 대해 자세히 알아보세요.