在某些情況下,您可能希望出於安全考慮,建立一個僅限於 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-PSSessionGet-CommandGet-FormatDataGet-HelpMeasure-ObjectOut-DefaultSelect-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。