다음을 통해 공유


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. 자체 서명된 코드 서명 인증서 만들기

    테스트 컴퓨터에서 실행하려는 모든 테스트 이진 파일 또는 스크립트 파일에 서명하려면 코드 서명 인증서가 필요합니다. New-SelfSignedCertificate PKI 모듈에서 제공합니다. 최상의 결과를 위해 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. 앱 제어 정책 적용

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

    참고

    일부 정책 정의는 .와 같은 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

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

중요한

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

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

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