App Control を使用して PowerShell をセキュリティで保護する方法
この記事では、App Control for Business ポリシーを設定する方法について説明します。 ポリシーの規則を適用または監査するようにポリシーの構成ができます。 監査モードで、PowerShell の動作は変更されませんが、イベント ID 16387 メッセージを PowerShellCore/Analytic
イベント ログに記録します。 強制モードで、PowerShell によってポリシーの制限が適用されます。
この記事では、環境にポリシーを展開する前に、コンピューター全体のアプリコントロール ポリシーで PowerShell の動作をテストできるように、テスト マシンを使用していることを前提としています。
アプリ制御ポリシーを作成する
アプリ制御ポリシーは、ポリシー オプション、許可されているファイル、およびポリシーによって認識される署名証明書に関する情報を含む XML ファイルで記述されます。 ポリシーが適用されると、承認されたファイルのみが読み込みと実行が許可されます。 PowerShell は、承認されていないスクリプト ファイルの実行をブロックする、または、ポリシー オプションに応じて ConstrainedLanguage
モードで実行します。
サポートされているすべての Windows バージョンで使用できる ConfigCI モジュールを使用して、アプリ制御ポリシーを作成および操作します。 この Windows PowerShell モジュールは、Windows PowerShell 5.1 または PowerShell 7 で、Windows 互換性レイヤーで使用ができます。 Windows PowerShell では、このモジュールを使用する方が簡単です。 作成したポリシーは、任意のバージョンの PowerShell に適用できます。
アプリ制御ポリシーを作成する手順
テストでは、既定のポリシーと自己署名コード署名証明書の作成のみで済みます。
既定のポリシーを作成する
New-CIPolicy -Level PcaCertificate -FilePath .\SystemCIPolicy.xml -UserPEs
このコマンドにより、すべての Microsoft コード署名ファイルを実行できる
SystemCIPolicy.xml
という既定のポリシー ファイルを作成します。Note
テスト マシン全体をスキャンする必要があるため、このコマンドの実行には最大 2 時間かかる場合があります。
既定のポリシーで監査モードを無効にする
新しいポリシーは常に
Audit
モードで作成されます。 ポリシーの適用をテストするには、ポリシーを適用するときに監査モードを無効にすることが必要です。notepad.exe
や Visual Studio Code (VS Code) などのテキスト エディターを使用して、SystemCIPolicy.xml
ファイルの編集をします。Audit mode
オプションをコメント アウトします。<!-- <Rule> <Option>Enabled:Audit Mode</Option> </Rule> -->
自己署名証明書を作成する
テスト コンピューターで実行するテスト バイナリまたはスクリプト ファイルに署名するには、コード署名証明書が必要となります。
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
コード署名証明書をポリシーに追加する
次のコマンドを使用して、新しいコード署名証明書をポリシーに追加します。
Add-SignerRule -FilePath .\SystemCIPolicy.xml -CertificatePath c:\certs\signing.cer -User
XML ポリシー ファイルをポリシー強制バイナリ ファイルに変換します
最後に、ポリシーを適用するには、XML ファイルを App Control で使用されるバイナリ ファイルに変換する必要があります。
ConvertFrom-CIPolicy -XmlFilePath .\SystemCIPolicy.xml -BinaryFilePath .\SIPolicy.p7b
アプリ制御ポリシーを適用する
テスト マシンにポリシーの適用には、
SIPolicy.p7b
ファイルを必要なシステムの場所 (C:\Windows\System32\CodeIntegrity
) にコピーします。Note
一部のポリシー定義は、
C:\Windows\System32\CodeIntegrity\CiPolicies
などのサブフォルダーにコピーすることが必要です。 詳細については、「アプリ コントロールの管理に関するヒント」 > 「既知の問題」を参照してください。アプリ制御ポリシーを無効にする
ポリシーの無効には、
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 イベント ビューアーでイベントを表示したり、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 は、監査イベントが発生したスクリプトの現在の場所で、コマンド ライン スクリプト デバッガーに割り込みます。 ブレークポイントを設定すると、コードのデバッグやスクリプトの現在の状態をリアルタイムで確認することができます。
PowerShell