다음을 통해 공유


App Control을 사용하여 PowerShell을 보호하는 방법

이 문서에서는 비즈니스용 앱 컨트롤 정책을 설정하는 방법을 설명합니다. 정책 규칙을 적용하거나 감사하도록 정책을 구성할 수 있습니다. 감사 모드에서 PowerShell 동작은 변경되지 않지만 이벤트 ID 16387 메시지를 이벤트 로그에 PowerShellCore/Analytic 기록합니다. 적용 모드에서 PowerShell은 정책의 제한을 적용합니다.

이 문서에서는 사용자 환경에서 정책을 배포하기 전에 컴퓨터 전체 앱 제어 정책에서 PowerShell 동작을 테스트할 수 있도록 테스트 컴퓨터를 사용한다고 가정합니다.

앱 제어 정책 만들기

앱 제어 정책은 정책 옵션, 허용되는 파일 및 정책에서 인식되는 서명 인증서에 대한 정보를 포함하는 XML 파일에 설명되어 있습니다. 정책이 적용되면 승인된 파일만 로드하고 실행할 수 있습니다. PowerShell은 정책 옵션에 따라 승인되지 않은 스크립트 파일의 실행을 차단하거나 모드에서 ConstrainedLanguage 실행합니다.

지원되는 모든 Windows 버전에서 사용할 수 있는 ConfigCI 모듈을 사용하여 앱 제어 정책을 만들고 조작합니다. 이 Windows PowerShell 모듈은 Windows PowerShell 5.1 또는 PowerShell 7에서 Windows 호환성 계층을 통해 사용할 수 있습니다 . Windows PowerShell에서 이 모듈을 사용하는 것이 더 쉽습니다. 만든 정책은 모든 버전의 PowerShell에 적용할 수 있습니다.

앱 제어 정책을 만드는 단계

테스트를 위해 기본 정책 및 자체 서명된 코드 서명 인증서를 만들어야 합니다.

  1. 기본 정책 만들기

    New-CIPolicy -Level PcaCertificate -FilePath .\SystemCIPolicy.xml -UserPEs
    

    이 명령은 모든 Microsoft 코드 서명 파일을 실행할 수 있도록 하는 기본 SystemCIPolicy.xml 정책 파일을 만듭니다.

    참고 항목

    이 명령을 실행하려면 전체 테스트 컴퓨터를 검사해야 하므로 최대 2시간이 걸릴 수 있습니다.

  2. 기본 정책에서 감사 모드 사용 안 함

    새 정책은 항상 모드에서 Audit 만들어집니다. 정책 적용을 테스트하려면 정책을 적용할 때 감사 모드를 사용하지 않도록 설정해야 합니다. SystemCIPolicy.xml VS Code(Visual Studio Code)와 같은 notepad.exe 텍스트 편집기를 사용하여 파일을 편집합니다. 옵션을 주석으로 처리합니다 Audit mode .

    <!--
    <Rule>
      <Option>Enabled:Audit Mode</Option>
    </Rule>
    -->
    
  3. 자체 서명된 코드 서명 인증서 만들기

    테스트 컴퓨터에서 실행하려는 모든 테스트 이진 파일 또는 스크립트 파일에 서명하려면 코드 서명 인증서가 필요합니다. PKI New-SelfSignedCertificate 모듈에서 제공합니다. 최상의 결과를 위해 Windows PowerShell 5.1에서 이 명령을 실행해야 합니다.

    $newSelfSignedCertificateSplat = @{
        DnsName = $env:COMPUTERNAME
        CertStoreLocation = "Cert:\CurrentUser\My\"
        Type = 'CodeSigningCert'
    }
    $cert = New-SelfSignedCertificate @newSelfSignedCertificateSplat
    Export-Certificate -Cert $cert -FilePath c:\certs\signing.cer
    Import-Certificate -FilePath C:\certs\signing.cer -CertStoreLocation "Cert:\CurrentUser\Root\"
    $cert = Get-ChildItem Cert:\CurrentUser\My\ -CodeSigningCert
    
    dir c:\bin\powershell\pwsh.exe | Set-AuthenticodeSignature -Certificate $cert
    
  4. 정책에 코드 서명 인증서 추가

    다음 명령을 사용하여 정책에 새 코드 서명 인증서를 추가합니다.

    Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath c:\certs\signing.cer -User
    
  5. XML 정책 파일을 정책 적용 이진 파일로 변환

    마지막으로 정책을 적용하려면 XML 파일을 App Control에서 사용하는 이진 파일로 변환해야 합니다.

    ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
    
  6. 앱 제어 정책 적용

    테스트 컴퓨터에 정책을 적용하려면 필요한 시스템 위치에 C:\Windows\System32\CodeIntegrity파일을 복사 SIPolicy.p7b 합니다.

    참고 항목

    일부 정책 정의는 .와 같은 C:\Windows\System32\CodeIntegrity\CiPolicies하위 폴더에 복사해야 합니다. 자세한 내용은 App Control 관리자 팁 및 알려진 문제를 참조하세요.

  7. 앱 제어 정책 사용 안 함

    정책을 사용하지 않도록 설정하려면 파일 이름을 SIPolicy.p7b 바꿉니다. 더 많은 테스트를 수행해야 하는 경우 정책을 다시 사용하도록 이름을 변경할 수 있습니다.

    Rename-Item -Path .\SIPolicy.p7b -NewName .\SIPolicy.p7b.off
    

App Control 정책 감사를 사용하여 테스트

PowerShell 7.4는 감사 모드에서 앱 제어 정책을 지원하는 새로운 기능을 추가했습니다. 감사 모드에서 PowerShell은 오류 없이 신뢰할 수 없는 스크립트를 모드에서 ConstrainedLanguage 실행하지만 대신 이벤트 로그에 메시지를 기록합니다. 로그 메시지는 정책이 적용 모드에 있는 경우 적용되는 제한을 설명합니다.

감사 이벤트 보기

PowerShell은 감사 이벤트를 PowerShellCore/Analytic 이벤트 로그에 기록합니다. 로그는 기본적으로 사용하도록 설정되지 않습니다. 로그를 사용하도록 설정하려면 Windows 이벤트 뷰어 열고 PowerShellCore/Analytic 로그를 마우스 오른쪽 단추로 클릭하고 로그 사용을 선택합니다.

또는 관리자 권한 PowerShell 세션에서 다음 명령을 실행할 수 있습니다.

wevtutil.exe sl PowerShellCore/Analytic /enabled:true /quiet

Windows 이벤트 뷰어 이벤트를 보거나 cmdlet을 Get-WinEvent 사용하여 이벤트를 검색할 수 있습니다.

Get-WinEvent -LogName PowerShellCore/Analytic -Oldest |
    Where-Object Id -eq 16387 | Format-List
TimeCreated  : 4/19/2023 10:11:07 AM
ProviderName : PowerShellCore
Id           : 16387
Message      : App Control Audit.

    Title: Method or Property Invocation
    Message: Method or Property 'WriteLine' on type 'System.Console' invocation will not
        be allowed in ConstrainedLanguage mode.
        At C:\scripts\Test1.ps1:3 char:1
        + [System.Console]::WriteLine("pwnd!")
        + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    FullyQualifiedId: MethodOrPropertyInvocationNotAllowed

이벤트 메시지에는 제한이 적용되는 스크립트 위치가 포함됩니다. 이 정보는 앱 제어 정책에서 실행되도록 스크립트를 변경해야 하는 위치를 이해하는 데 도움이 됩니다.

Important

감사 이벤트를 검토한 후에는 분석 로그를 사용하지 않도록 설정해야 합니다. 분석 로그는 빠르게 증가하고 많은 양의 디스크 공간을 사용합니다.

PowerShell 디버거에서 감사 이벤트 보기

대화형 PowerShell 세션에 대해 변수를 Break 설정하는 $DebugPreference 경우 PowerShell은 감사 이벤트가 발생한 스크립트의 현재 위치에 있는 명령줄 스크립트 디버거를 중단합니다. 중단점을 사용하면 코드를 디버그하고 스크립트의 현재 상태를 실시간으로 검사할 수 있습니다.