다음을 통해 공유


WDAC 디버깅 및 문제 해결

참고

Windows Defender Application Control의 일부 기능은 특정 Windows 버전에서만 사용할 수 있습니다. Windows Defender Application Control 기능 가용성에 대해 자세히 알아봅니다.

이 문서에서는 Windows Defender WDAC(애플리케이션 제어)를 사용할 때 앱 및 스크립트 오류를 디버그하고 해결하는 방법을 설명합니다.

1 - WDAC 진단 데이터 수집

WDAC 문제를 디버깅하고 해결하기 전에 문제 동작을 나타내는 디바이스에서 정보를 수집해야 합니다.

관리자 권한 PowerShell 창에서 다음 명령을 실행하여 필요한 진단 정보를 수집합니다.

  1. 일반 WDAC 진단 데이터를 수집하고 %userprofile%\AppData\Local\Temp\DiagOutputDir\CiDiag에 복사합니다.

    cidiag.exe /stop
    

    CiDiag.exe Windows 버전에 없는 경우 이 정보를 수동으로 수집합니다.

  2. 디바이스의 시스템 정보를 CiDiag 폴더에 저장합니다.

    msinfo32.exe /report $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\SystemInformation.txt
    
  3. CiTool.exe 사용하여 디바이스의 WDAC 정책 목록을 인벤토리에 추가합니다. CiTool.exe Windows 버전에 없는 경우 이 단계를 건너뜁니다.

    citool.exe -lp -json > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\CiToolOutput.json
    
  4. AppLocker 레지스트리 키 데이터를 CiDiag 폴더로 내보냅니다.

    reg.exe query HKLM\Software\Policies\Microsoft\Windows\SrpV2 /s > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt; reg.exe query HKLM\Software\Policies\Microsoft\Windows\AppidPlugins /s >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt; reg.exe query HKLM\System\CurrentControlSet\Control\Srp\ /s >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerRegistry.txt
    

    참고

    시스템에서 지정된 레지스트리 키 또는 값을 찾을 수 없다는 오류가 표시될 수 있습니다. 이 오류는 문제를 나타내지 않으며 무시할 수 있습니다.

  5. %windir%System32\AppLocker에서 CiDiag 폴더로 AppLocker 정책 파일을 복사합니다.

    Copy-Item -Path $env:windir\System32\AppLocker -Destination $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\ -Recurse -Force -ErrorAction Ignore
    
  6. 이전 단계에서 수집된 AppLocker 정책 파일에 대한 파일 정보를 수집합니다.

    Get-ChildItem -Path $env:windir\System32\AppLocker\ -Recurse | select Mode,LastWriteTime,CreationTime,Length,Name >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerPolicyFiles.txt
    
  7. 유효한 AppLocker 정책을 내보냅니다.

    Get-AppLockerPolicy -xml -Effective > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLocker.xml
    
  8. AppLocker 서비스 구성 및 상태 정보를 수집합니다.

    sc.exe query appid > $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt; sc.exe query appidsvc >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt; sc.exe query applockerfltr >> $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt
    

핵심 WDAC 이벤트 로그

WDAC 이벤트는 다음 두 위치에서 생성됩니다.

  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - CodeIntegrity - 운영
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - AppLocker - MSI 및 스크립트

CiDiag 출력 디렉터리 내에서 이러한 이벤트 로그를 각각 CIOperational.evtx 및 ALMsiAndScript.evtx라고 합니다.

유용할 수 있는 기타 Windows 이벤트 로그

경우에 따라 핵심 WDAC 이벤트 로그에 포함된 정보를 이러한 다른 이벤트 로그에 있는 정보로 보완할 수 있습니다. CIDiag.exe 기울임꼴에 표시된 것을 수집하지 않습니다.

  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - CodeIntegrity - 자세한 정보
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - AppLocker - EXE 및 DLL
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - AppLocker - 패키지된 앱 배포
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - AppLocker - 패키지된 앱 실행
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - AppID - 운영
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - CAPI2 - 운영
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - DeviceGuard - 운영
  • 애플리케이션 및 서비스 로그 - Microsoft - Windows - PowerShell - *
  • Windows - 애플리케이션
  • Windows - 시스템

2 - 진단 및 로그 데이터를 사용하여 문제 식별

디바이스에서 필요한 진단 정보를 수집한 후에는 이전 섹션에서 수집된 진단 데이터 분석을 시작할 준비가 된 것입니다.

  1. 활성 상태이고 적용되는 WDAC 정책 집합을 확인합니다. 활성화될 것으로 예상되는 정책만 현재 활성화되어 있는지 확인합니다. 활성 상태일 수도 있는 Windows 받은 편지함 정책에 유의하세요. 다음 방법 중 하나를 사용할 수 있습니다.

    • 해당하는 경우 CiTool.exe -lp의 출력을 검토합니다. 이 출력은 CITOOLOUTPUT.JSON CIDiag 출력 디렉터리에 저장되었습니다. 서식이 지정된 json 파일을 보려면 Microsoft Edge 사용을 참조하세요.
    • 애플리케이션 및 서비스 로그 - Microsoft - Windows - CodeIntegrity - Operational에 있는 핵심 WDAC 이벤트 로그의 모든 정책 활성화 이벤트를 검토합니다. CIDiag 출력 디렉터리 내에서 이 이벤트 로그를 CIOperational.evtx라고 합니다.
  2. 애플리케이션 및 서비스 로그 - Microsoft - Windows - CodeIntegrity - Operational에 있는 핵심 WDAC 이벤트 로그에서 실행 파일, dll 및 드라이버에 대한 블록 이벤트를 검토합니다. CIDiag 출력 디렉터리 내에서 이 이벤트 로그를 CIOperational.evtx라고 합니다. 블록 이벤트 및 상관 관계가 있는 3089 서명 세부 정보 이벤트의 정보를 사용하여 설명되지 않거나 예기치 않은 블록을 조사합니다. 참조는 이 문서의 뒷부분에 설명된 차단된 실행 파일 예제를 참조하세요.

  3. 애플리케이션 및 서비스 로그 - Microsoft - Windows - AppLocker - MSI 및 스크립트에 있는 핵심 스크립트 적용 이벤트 로그에서 패키지된 앱, MSI 설치 관리자, 스크립트 및 COM 개체에 대한 블록 이벤트를 검토합니다. CIDiag 출력 디렉터리 내에서 이 이벤트 로그를 ALMsiAndScript.evtx라고 합니다. 블록 이벤트 및 상관 관계가 있는 8038 서명 세부 정보 이벤트의 정보를 사용하여 설명되지 않거나 예기치 않은 블록을 조사합니다.

앱 및 스크립트 오류를 비롯한 대부분의 WDAC 관련 문제는 이전 단계를 사용하여 진단할 수 있습니다.

차단된 실행 파일 예제에 대한 이벤트 분석

다음은 일반적인 WDAC 적용 모드 블록 이벤트 3077 및 상관 관계가 있는 3089 서명 정보 이벤트 중 하나의 자세한 EventData 예제입니다. 각 이벤트 스크린샷 뒤에 있는 테이블은 이벤트에 포함된 일부 요소를 설명합니다. 이벤트 설명 다음에는 이벤트를 사용하여 블록이 발생한 이유를 이해하는 방법을 설명하는 단계별 연습이 있습니다.

이벤트 3077 - WDAC 적용 블록 이벤트

PowerShell.exe 대한 예제 3077 블록 이벤트입니다.

요소 이름 설명
시스템 - 상관 관계 - [ActivityID] 스크린샷에 표시되지 않음
상관 관계 ActivityID를 사용하여 WDAC 블록 이벤트를 하나 이상의 3089 서명 이벤트와 일치시킬 수 있습니다.
파일 이름 실행이 차단된 디스크의 파일 경로 및 이름입니다. 디스크의 이름은 변경할 수 있으므로 이 값 를 사용하여 WDAC 파일 규칙을 만들 때 사용되는 값이 -Level FileName아닙니다. 대신 이 테이블의 뒷부분에 있는 OriginalFileName 요소를 참조하세요.
프로세스 이름 차단된 파일을 실행하려고 시도한 파일의 경로 및 이름입니다. 부모 프로세스라고도 합니다.
요청된 서명 수준 실행하기 위해 코드를 전달하는 데 필요한 Windows 서명 권한 부여 수준입니다. 요청된 서명 및 유효성이 검사된 서명 수준을 참조하세요.
유효성이 검사된 서명 수준 코드가 제공된 Windows 서명 권한 부여 수준입니다. 요청된 서명 및 유효성이 검사된 서명 수준을 참조하세요.
상태 코드 Windows NT 상태. 를 사용하여 certutil.exe -error <status> 상태 코드의 의미를 조회할 수 있습니다.
SHA1 해시 차단된 파일에 대한 SHA1 Authenticode 해시입니다.
SHA256 해시 차단된 파일에 대한 SHA256 Authenticode 해시입니다.
SHA1 플랫 해시 차단된 파일에 대한 SHA1 플랫 파일 해시입니다.
SHA256 플랫 해시 차단된 파일의 SHA256 플랫 파일 해시입니다.
PolicyName 블록 이벤트를 발생시킨 WDAC 정책의 식별 이름입니다. 파일 실행을 차단하는 각 정책에 대해 별도의 3077 블록 이벤트(또는 3076 감사 블록 이벤트)가 표시됩니다.
PolicyId 블록 이벤트를 발생시킨 WDAC 정책의 식별 ID 값입니다.
PolicyHash 블록 이벤트를 발생시킨 WDAC 정책 이진 파일의 SHA256 Authenticode 해시입니다.
OriginalFileName 차단된 파일의 리소스 헤더에서 개발자가 설정한 변경할 수 없는 파일 이름입니다. 이 값은 를 사용하여 WDAC 파일 규칙을 만들 때 사용되는 값입니다 -Level FileName.
InternalName 차단된 파일의 리소스 헤더에서 개발자가 설정한 다른 변경할 수 없는 값입니다. 파일 규칙에서 이 값을 OriginalFileName으로 대체할 수 있습니다 -Level FileName -SpecificFileNameLevel InternalName.
FileDescription 차단된 파일의 리소스 헤더에서 개발자가 설정한 다른 변경할 수 없는 값입니다. 파일 규칙에서 이 값을 OriginalFileName으로 대체할 수 있습니다 -Level FileName -SpecificFileNameLevel FileDescription.
ProductName 차단된 파일의 리소스 헤더에서 개발자가 설정한 다른 변경할 수 없는 값입니다. 파일 규칙에서 이 값을 OriginalFileName으로 대체할 수 있습니다 -Level FileName -SpecificFileNameLevel ProductName.
FileVersion 서명된 정책에 버전 제어를 적용하는 데 사용되는 정책의 VersionEx 값입니다.
PolicyGUID 블록 이벤트를 발생시킨 WDAC 정책의 PolicyId입니다.
UserWriteable 파일이 사용자가 쓸 수 있는 위치에 있는지 여부를 나타내는 부울 값입니다. 이 정보는 FilePath 규칙에서 허용할 때 문제를 진단하는 데 유용합니다.
PackageFamilyName 차단된 파일을 포함하는 MSIX(패키지된 앱)의 패키지 패밀리 이름입니다.

이벤트 3089 - WDAC 서명 정보 이벤트

PowerShell.exe 대한 예제 3089 서명 정보 이벤트입니다.

요소 이름 설명
시스템 - 상관 관계 - [ActivityID] 상관 관계 ActivityID를 사용하여 WDAC 서명 이벤트를 해당 블록 이벤트와 일치시킬 수 있습니다.
TotalSignatureCount 차단된 파일에 대해 검색된 총 서명 수입니다.
Signature 이 3089 이벤트에 표시된 현재 서명의 인덱스 수(0부터 시작)입니다. 파일에 여러 서명이 있는 경우 다른 서명에 대한 다른 3089 이벤트를 찾을 수 있습니다.
Hash WDAC가 파일과 일치하는 데 사용한 해시 값입니다. 이 값은 3077 또는 3076 블록 이벤트에 표시된 네 가지 해시 중 하나와 일치해야 합니다. 파일에 대한 서명을 찾을 수 없는 경우(TotalSignatureCount = 0) 해시 값만 표시됩니다.
SignatureType 서명의 형식입니다.
ValidatedSigningLevel 서명이 충족된 Windows 서명 권한 부여 수준입니다. 요청된 서명 및 유효성이 검사된 서명 수준을 참조하세요.
VerificationError 이 특정 서명이 WDAC 정책을 통과하지 못한 이유입니다. VerificationError를 참조하세요.
PublisherName 리프 인증서의 CN(일반 이름) 값입니다.
IssuerName 인증서 체인에서 사용 가능한 가장 높은 인증서의 CN 값입니다. 이 수준은 일반적으로 루트 아래의 하나의 인증서입니다.
PublisherTBSHash 리프 인증서의 TBS 해시입니다.
IssuerTBSHash 인증서 체인에서 사용 가능한 가장 높은 인증서의 TBS 해시입니다. 이 수준은 일반적으로 루트 아래의 하나의 인증서입니다.

예제 3077 및 3089 이벤트의 단계별 연습

이제 WDAC 정책이 이 파일을 차단한 이유를 이해하기 위해 예제 3077 및 3089 이벤트의 이벤트 데이터를 사용하는 방법을 살펴보겠습니다.

차단되는 파일 및 블록 컨텍스트 이해

3077 이벤트를 참조하여 정책을 식별하는 정보, 차단되는 파일 및 실행하려는 부모 프로세스를 찾습니다. 블록이 예상되고 원하는지 여부를 확인하려면 이 컨텍스트 정보를 고려합니다.

이 예제에서 차단되는 파일은 windows의 일부이며 일반적으로 실행될 것으로 예상되는 PowerShell.exe. 그러나 이 경우 정책은 공격 표면을 제한하는 방법으로 스크립트 호스트를 실행할 수 없는 S 모드의 Windows 모드 정책 템플릿을 기반으로 합니다. S 모드의 경우 이 블록 이벤트는 성공입니다. 그러나 정책 작성자가 템플릿을 선택할 때 해당 제약 조건을 인식하지 못했다고 가정하고 이 블록을 예기치 않은 것으로 처리해 보겠습니다.

WDAC가 파일을 거부한 이유 확인

3077 이벤트를 다시 언급하면 요청된 서명 수준 2는 코드가 WDAC 정책을 통과해야 한다는 것을 의미합니다. 그러나 유효성이 검사된 서명 수준 1은 코드가 서명되지 않은 것처럼 처리되었음을 의미합니다. "서명되지 않음"은 파일이 실제로 서명되지 않거나 서명되지 않았지만 잘못된 인증서가 있거나 서명되었지만 WDAC 정책에서 허용하는 인증서가 없음을 의미할 수 있습니다.

이제 차단된 파일에 대한 상관 관계가 있는 3089 이벤트를 검사해 보겠습니다. 이 예제에서는 여러 서명이 있는 파일에 있는 첫 번째 서명(서명 인덱스 0)만 살펴봅니다. 이 서명의 경우 ValidatedSigningLevel은 12입니다. 즉, Microsoft Windows 제품 서명이 있습니다. VerificationError가 21이면 서명이 WDAC 정책을 통과하지 못했습니다.

각 서명에 다른 ValidatedSigningLevel 및 VerificationError가 있을 수 있으므로 상관 관계가 있는 각 3089 이벤트에 대한 정보를 검토하는 것이 중요합니다.

중요

3077 이벤트의 유효성 검사된 서명 수준이 3089 이벤트의 ValidatedSigningLevel과 매우 다르게 해석되는 방식을 확인합니다.

3077 이벤트의 경우 유효성이 검사된 서명 수준은 이진 파일이 Windows에서 실제로 처리된 방법을 알려줍니다.

반면에 3089 이벤트의 경우 ValidatedSigningLevel은 서명이 받을 수 있는 잠재적 최대 수준을 알려줍니다. 서명이 거부된 이유를 이해하려면 VerificationError를 사용해야 합니다.

3 - 일반적인 문제 해결

WDAC 진단 데이터를 분석한 후에는 문제를 resolve 더 많은 디버깅 단계를 수행하는 단계를 수행할 수 있습니다. 다음은 루트 문제를 resolve 또는 추가로 격리하기 위해 시도할 수 있는 몇 가지 일반적인 문제 및 단계입니다.

문제: 허용하려는 파일이 차단되었습니다.

  • 핵심 WDAC 이벤트 로그의 데이터를 사용하여 차단된 파일을 허용하는 규칙을 추가합니다.
  • 정책에서 관리되는 설치 관리자를 신뢰하는 경우 관리되는 설치 관리자를 사용하여 파일 또는 앱을 다시 배포합니다.

문제: 예기치 않은 정책이 활성화됨

다음과 같은 경우 이 조건이 존재할 수 있습니다.

  • 정책이 제거되었지만 시스템이 다시 부팅되지 않았습니다.
  • 정책이 부분적으로 제거되었지만 정책 복사본은 여전히 시스템 또는 EFI 파티션에 있습니다.
  • PolicyId {A244370E-44C9-4C06-B551-F6016E563076}(단일 정책 형식)이 있는 정책이 활성화되기 전에 다중 정책 형식 정책 위치에 복사되어 디스크에 중복 정책 이진 파일이 생성되었습니다. 시스템 및 EFI 파티션에서 SiPolicy.p7b 및 {A244370E-44C9-4C06-B551-F6016E563076}.cip 파일을 모두 확인합니다.
  • 정책이 디바이스에 잘못 배포되었습니다.
  • 관리자 액세스 권한이 있는 공격자가 일부 중요한 프로세스에 대한 서비스 거부를 유발하는 정책을 적용했습니다.

이러한 문제를 resolve 하려면 식별된 정책에 대한 WDAC 정책 제거 지침을 따릅니다.

문제: 처리되지 않은 앱 오류가 발생하고 WDAC 이벤트가 관찰되지 않음

일부 앱은 사용자 모드 WDAC 정책이 활성 상태일 때 동작을 변경하여 예기치 않은 오류가 발생할 수 있습니다. 스크립트 호스트에서 구현한 적용 동작을 제대로 처리하지 않는 앱에 대한 스크립트 적용의 부작용일 수도 있습니다.

다음 작업을 수행하여 근본 원인을 격리해 보세요.

  • 이 문서의 섹션 1에 나열된 다른 이벤트 로그에서 예기치 않은 앱 오류에 해당하는 이벤트를 확인합니다.
  • 일시적으로 WDAC 정책을 스크립트 적용을 사용하지 않도록 설정하고 다시 테스트하는 다른 정책으로 바꿉니다.
  • WDAC 정책을 일시적으로 모든 COM 개체를 허용 하고 다시 테스트할 수 있는 다른 정책으로 바꿉니다.
  • 일시적으로 WDAC 정책을 다른 정책 규칙을 완화하고 다시 테스트하는 다른 정책 으로 바꿉니다.

문제: 관리되는 설치 관리자가 배포한 앱이 작동하지 않음

관리되는 설치 관리자를 사용하여 문제를 디버그하려면 다음 단계를 수행합니다.

  • 앱을 차단하는 WDAC 정책에 관리되는 설치 관리자를 사용하도록 설정하는 옵션이 포함되어 있는지 확인합니다.
  • 관리되는 설치 관리자가 배포한 앱 자동 허용에 설명된 대로 유효한 AppLocker 정책 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLocker.xml 올바른지 확인합니다.
  • AppLocker 서비스가 실행되고 있는지 확인합니다. 이 정보는 이 문서의 섹션 1에서 만든 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt 있습니다.
  • MANAGEDINSTALLER라는 AppLocker 파일이 있는지 확인합니다. APPLOCKER는 이전에 만든 CiDiag 폴더에 있습니다. 그렇지 않은 경우 관리되는 설치 관리자 AppLocker 구성을 배포하고 사용하도록 설정하는 단계를 반복합니다.
  • 관리되는 설치 관리자 프로세스를 다시 시작하고 PolicyName = MANAGEDINSTALLER를 사용하여 관리되는 설치 관리자 프로세스에 대한 AppLocker - EXE 및 DLL 이벤트 로그에서 8002 이벤트가 관찰되도록 검사. 대신 PolicyName = MANAGEDINSTALLER가 있는 8003 또는 8004 이벤트가 표시되는 경우 AppLocker 정책 XML에서 ManagedInstaller 규칙을 검사 규칙이 관리되는 설치 관리자 프로세스와 일치하는지 확인합니다.
  • fsutil.exe사용하여 관리되는 설치 관리자 프로세스에서 작성한 파일에 관리되는 설치 관리자 원본 확장 특성이 있는지 확인합니다. 그렇지 않은 경우 관리되는 설치 관리자를 사용하여 파일을 다시 배포하고 다시 검사.
  • 관리되는 설치 관리자를 사용하여 다른 앱의 설치를 테스트합니다.
  • 다른 관리형 설치 관리자를 AppLocker 정책에 추가하고 다른 관리되는 설치 관리자를 사용하여 설치를 테스트합니다.
  • 앱이 관리되는 설치 관리자에서 알려진 제한 사항이 발생하는지 확인합니다. 그렇다면 다른 방법을 사용하여 앱에 권한을 부여해야 합니다.

문제: ISG(Intelligent Security Graph)가 허용될 것으로 예상한 앱이 작동하지 않습니다.

ISG를 사용하여 문제를 디버그하려면 다음 단계를 수행합니다.

  • 앱을 차단하는 WDAC 정책에 지능형 보안 그래프를 사용하도록 설정하는 옵션이 포함되어 있는지 확인합니다.
  • AppLocker 서비스가 실행되고 있는지 확인합니다. 이 정보는 이 문서의 섹션 1에서 만든 $env:USERPROFILE\AppData\Local\Temp\DiagOutputDir\CiDiag\AppLockerServices.txt 있습니다.
  • fsutil.exe사용하여 파일에 ISG 원본 확장 특성이 있는지 확인합니다. 그렇지 않은 경우 관리되는 설치 관리자를 사용하여 파일을 다시 배포하고 다시 검사.
  • 앱이 ISG에서 알려진 제한 사항이 발생하는지 확인합니다.

4 - 적절한 경우 Microsoft에 문제 보고

이 문서에서 다루는 지침을 수행한 후 제품 문제를 식별했다고 생각되는 경우 Microsoft에 문제를 보고합니다.

  • Microsoft 프리미어 지원이 있는 고객은 일반 채널을 통해 서비스 요청을 기록해야 합니다.
  • 다른 모든 고객은 Windows 피드백 허브를 통해 WDAC 제품 팀에 직접 문제를 보고할 수 있습니다. 보안 & 개인 정보 - 애플리케이션 제어 범주를 선택하여 문제가 WDAC 제품 팀으로 올바르게 라우팅되었는지 확인합니다.

문제를 보고할 때 다음 정보를 제공해야 합니다.

  • 앞에서 설명한 모든 WDAC 진단 데이터 입니다.
  • 가능하면 차단된 파일입니다.
  • 문제를 재현하는 지침을 지웁니다.