セキュリティ上の理由から、PowerShell コマンドのサブセットに制限されている PowerShell セッションをホストするシナリオがあります。
定義上、制限付きセッションとは、 Import-Module の使用が許可されていないセッションです。 他にも制限がある場合がありますが、これが主な要件です。 ユーザーがモジュールをインポートできる場合は、必要な操作を実行できます。
制限付きセッションの例を次に示します。
- Just-Enough-Administration (JEA)
- Exchange モジュールや Teams モジュールなどのカスタム制限付きリモート処理の実装
ほとんどのシステム管理者にとって、JEA は制限付きセッションを作成するための最適なエクスペリエンスを提供し、最初の選択肢にする必要があります。 JEA の詳細については、 JEA の概要を参照してください。
カスタム セッション実装の推奨事項
シナリオでカスタム実装が必要な場合は、次の推奨事項に従う必要があります。
PowerShell プロバイダーの使用と機能を制限する
許可されたプロバイダーを使用して、制限付きセッションの実装に脆弱性が生じないようにする方法を確認します。
Warnung
FileSystem プロバイダーを許可しないでください。 ユーザーがファイル システムの任意の部分に書き込むことができる場合は、セキュリティを完全にバイパスできます。
証明書プロバイダーを許可しないでください。 プロバイダーを有効にすると、ユーザーは保存されている秘密キーにアクセスできます。
新しい実行空間を作成できるコマンドを許可しない
Warnung
PowerShell 7 の Windows 互換性機能では、Windows PowerShell をホストするための新しい実行空間が作成されます。 Windows 互換性機能を使用して実行されるコマンドは許可しないでください。
*-Job コマンドレットは、制限なしで新しい実行空間を作成できます。
Trace-Command コマンドレットは許可しないでください。
Warnung
Trace-Commandを使用すると、トレースされたすべてのコマンドがセッションに取り込まれます。
制限されたコマンドに対して独自のプロキシ実装を作成しないでください
PowerShell には、制限されたコマンド シナリオ用の一連のプロキシ コマンドがあります。 これらのプロキシ コマンドにより、入力パラメーターによってセッションのセキュリティが損なわれることはありません。 次のコマンドでは、プロキシが制限されています。
Exit-PSSessionGet-CommandGet-FormatDataGet-HelpMeasure-ObjectOut-DefaultSelect-Object
これらのコマンドの独自の実装を作成すると、JEA プロキシ コマンドで禁止されているコードの実行がユーザーに誤って許可される可能性があります。
次のコマンドを実行して、制限されたコマンドの一覧を取得できます。
$commands = [System.Management.Automation.CommandMetadata]::GetRestrictedCommands(
[System.Management.Automation.SessionCapabilities]::RemoteServer
)
制限付きプロキシ コマンドは、次のコマンドを使用して確認できます。
$commands = [System.Management.Automation.CommandMetadata]::GetRestrictedCommands(
[System.Management.Automation.SessionCapabilities]::RemoteServer
)
$getHelpProxyBlock = [System.Management.Automation.ProxyCommand]::Create($commands['Get-Help'])
NoLanguage モードを使用するようにセッションを構成する
PowerShell NoLanguage モードでは、PowerShell スクリプト言語が完全に無効になります。 スクリプトを実行したり、変数を使用したりすることはできません。 ネイティブ コマンドとコマンドレットのみを実行できます。
言語モードの詳細については、「 about_Language_Modes」を参照してください。
セッションでデバッガーを使用できないようにする
既定では、PowerShell デバッガーは FullLanguage モードでコードを実行します。
SessionState の UseFullLanguageModeInDebugger プロパティを false に設定します。
詳細については、「 UseFullLanguageModeInDebugger」を参照してください。
PowerShell