WindowsマシンでPowerShellを無効にすることは、セキュリティポリシーで要求される環境ではしばしば必要になります。例えば、スクリプトベースの攻撃を阻止したり、ユーザーが実行できるものを制御したいというケースなどです。しかし、当然ながら、PowerShellを完全にブロックすると、GPOログオンスクリプトやSYSTEMで実行されるスケジュールタスクなど、正当な機能が動作しなくなる可能性があります。そのため、対話型コンソールとスクリプトの実行を無効にしつつ、自動化されたタスクはそのまま残すことが目標です。これはバランスを取る作業であり、特にユーザーが単純なポリシーを回避する方法を見つけてしまうため、必ずしも万全とは言えません。
WindowsでPowerShellを無効にするさまざまな方法
方法1: ソフトウェア制限ポリシーで実行ファイルをブロックするのは完全に安全ではないことが判明
おそらくこれが一番手っ取り早い方法です。「ユーザーの構成」>「ポリシー」>「Windowsの設定」>「セキュリティの設定」>「ソフトウェアの制限のポリシー」で、 「指定されたWindowsアプリケーションを実行しない」ポリシーを設定します。そして、パスを追加します。簡単ですよね? ちょっと奇妙に感じるかもしれませんが、これだけでほとんどの場合、プロセスの起動がブロックされます。ユーザーがPowerShellを実行しようとすると、次のようなメッセージが表示されます。powershell.exepowershell_ise.exe
This app has been blocked by your administrator
ただし、100%信頼できるわけではありません。Windows TerminalやPowerShell Coreの新しいバージョン(GitHub Winhanceが実行ポリシーの管理に役立つかもしれません)など、一部の環境では、この方法ですべてがブロックされない可能性があります。当然ながら、Windowsは必要以上にブロックを難しくする必要があるためです。
方法 2: ソフトウェア制限ポリシーを含むグループ ポリシーを使用して、ファイル システム内の実行可能ファイルをブロックする
これはもう少し徹底的ですが、まだ完璧ではありません。 で新しいGPOを作成し、 「ユーザーの構成」>「ポリシー」>「Windowsの設定」>「セキュリティ設定」>>「ソフトウェア制限ポリシー」gpmc.mscに進みます。新しいポリシーを作成し、「追加の規則」に以下のパスを追加します。
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe C:\Program Files\PowerShell\7\pwsh.exe
それぞれを「Disallowed(許可しない)」に設定します。このポリシーが適用されると、ユーザーはpowershell.exeまたはを実行できなくなりますpwsh.exe。次のようなエラーが表示されます。
This program is blocked by group policy. For more information, contact your system administrator.
ただし、いくつかの問題が発生する可能性があるので、ご注意ください。スクリプトやスケジュールされたタスクがSYSTEM権限で実行される場合、特にポリシーが適用される前にスクリプトが実行されると、これらの機能が動作してしまう可能性があります。また、新しいWindowsバージョンでは、この方法はAppLockerに取って代わられ、非推奨とされています。
方法3: AppLockerを使用してPowerShellの実行を明示的に拒否する
このアプローチはより堅牢です。Windows 10 2004およびWindows 11以降、AppLockerルールは特定のエディション(Pro、Enterprise、そして現在は一部のProエディション)で動作します。設定方法は次のとおりです。
- サービス( [コンピューターの構成] > [Windows の設定] > [セキュリティの設定] > [システム サービス] )からアプリケーション IDサービスを有効にし、 [自動]に設定します。
- アプリケーション制御ポリシー > AppLockerで、ルールを[ルールの適用]に設定します。
- 最初に他のアプリケーションのデフォルト ルールを作成し、次に[実行可能ルール] > [新しいルールの作成]を右クリックします。
- 発行者ルールで[拒否]を選択し、PowerShell 実行可能ファイルへのパス ( 、、など) を指定します。ワイルドカードまたは発行者情報を使用できます。
powershell.exepwsh.exepowershell_ise.exe - PowerShell の実行を信頼するユーザーに対して、それらのユーザーまたはグループを明示的に許可する許可ルールを作成します。
ちょっとした注意点ですが、AppLocker のルールは順番に処理されるため、拒否ルールが最初に来るか、適切な順序になっていることを確認してください。そうしないと、より具体的な許可ルールがある場合でも、ユーザーが PowerShell を起動してしまう可能性があります。また、ルールをエクスポートするとGet-AppLockerPolicy -Effective -XML > C:\path\to\file.xmlデバッグに役立ちます。
追加のヒント: 例外処理と自動化
実際の環境では、一部の管理者グループや特定のアカウントが引き続きPowerShellを実行できるよう、例外を設定したい場合があります。そのためには、セキュリティグループでルールを構成し、委任を設定して、それらのグループのみに権限が付与されるようにします。「委任」タブを使用してグループを追加し、特定のポリシーを許可または拒否します。
Windows 10 1803 および Windows Server 2019 以降では、より柔軟で安全な WDAC と AppLocker が推奨されるため、SRP (ソフトウェア制限ポリシー) は非推奨となっていることに注意してください。
まとめ
- すばやくブロックするには、 「指定された Windows アプリケーションを実行しない」ポリシーを使用します。このポリシーは多くの場合機能しますが、すべての場合に機能するわけではありません。
- ソフトウェア制限ポリシーを構成して、ファイル システム レベルですべての PowerShell 実行可能ファイルをブロックします。
- より堅牢なソリューションを実現するには、AppLockerルールを実装して PowerShell ファイルを明示的に拒否し、信頼できるアカウントに対して例外を設定します。
- これらの方法は主に対話型セッションをブロックしますが、SYSTEM またはさまざまな難読化方法ではスクリプトまたはスケジュールされたタスクの実行を停止できない可能性があることに注意してください。
まとめ
PowerShellを無効にするのは、特に新しいWindowsのバージョンでは、スイッチを切り替えるほど簡単ではありません。AppLockerなどの方法と適切な委任および例外ルールを組み合わせるのが最善策のようです。完璧な方法などありませんし、スクリプトやプロセスの設定によっては、依然としてすり抜けてしまう可能性があります。そのため、テストが重要です。また、OSのアップデートや新しいセキュリティ機能によって、これらのポリシーの動作が変更される場合があります。この方法が、重要な自動化を損なうことなく、セキュリティ上の問題を回避するのに役立つことを願っています。複数の環境で動作しました。皆さんにも効果があることを願っています。