共用方式為


保護受限制的 PowerShell 遠程會話

在某些情況下,您可能希望出於安全考慮,建立一個僅限於 PowerShell 命令子集的 PowerShell 工作階段。

根據定義,受限制的會話是 Import-Module 不允許使用的會話。 可能有其他限制,但這是主要需求。 如果使用者可以匯入模組,則可以執行任何想要的專案。

受限制會話的範例包括:

  • Just-Enough-Administration (JEA)
  • 自訂限制的遠端執行實作,例如 Exchange 和 Teams 模組

對於大多數系統管理員來說,JEA 提供建立受限制會話的最佳解決方案,應該是您的首選。 如需 JEA 的詳細資訊,請參閱 JEA 概觀

自定義會話實作的建議

如果您的案例需要自定義實作,則您應該遵循這些建議。

限制 PowerShell 提供者的使用和功能

檢閱被允許的提供者的使用方式,以確保在您的受限制會話實作中不會導致安全漏洞。

警告

不允許 FileSystem 提供者。 如果使用者可以寫入文件系統的任何部分,則可以完全略過安全性。

不允許 憑證 提供者。 啟用提供者後,用戶可以存取儲存的私鑰。

不允許可建立新 Runspace 的命令

警告

PowerShell 7 的 Windows 相容性功能會建立一個新的執行空間來承載 Windows PowerShell。 不要允許任何會透過 Windows 相容性功能執行的指令。 Cmdlet *-Job 可以建立新的執行空間,而不受限制。

不允許 Cmdlet Trace-Command

警告

使用 Trace-Command 會將所有已追蹤的命令帶入會話中。

請勿為受限制的命令建立您自己的 Proxy 實作

PowerShell 有一組用於受限制命令情境的 Proxy 命令。 這些 Proxy 命令可確保輸入參數無法危害會話的安全性。 下列命令有限制的代理:

  • Exit-PSSession
  • Get-Command
  • Get-FormatData
  • Get-Help
  • Measure-Object
  • Out-Default
  • Select-Object

如果您建立自己的這些命令實作,您可能會不小心允許使用者執行 JEA Proxy 命令所禁止的程式代碼。

您可以執行下列命令來取得受限制的命令清單:

$commands = [System.Management.Automation.CommandMetadata]::GetRestrictedCommands(
    [System.Management.Automation.SessionCapabilities]::RemoteServer
)

您可以使用下列命令來檢查受限制的 Proxy 命令:

$commands = [System.Management.Automation.CommandMetadata]::GetRestrictedCommands(
    [System.Management.Automation.SessionCapabilities]::RemoteServer
)
$getHelpProxyBlock = [System.Management.Automation.ProxyCommand]::Create($commands['Get-Help'])

設定會話以使用 NoLanguage 模式

PowerShell NoLanguage 模式會完全停用 PowerShell 腳本語言。 您無法執行文稿或使用變數。 您只能執行原生命令和 Cmdlet。

如需語言模式的詳細資訊,請參閱 about_Language_Modes

不允許在會話中使用調試程式

根據預設,PowerShell 除錯工具在 FullLanguage 模式下執行代碼。 將 SessionState 中的 UseFullLanguageModeInDebugger 屬性設定為 false。

如需詳細資訊,請參閱 UseFullLanguageModeInDebugger