在某些情况下,你希望托管 PowerShell 会话,出于安全原因,这些会话仅限于 PowerShell 命令的子集。
根据定义,受限会话是 Import-Module 不允许使用的会话。 可能存在其他限制,但这是主要要求。 如果用户可以导入模块,则可以运行所需的任何内容。
受限会话的示例包括:
- 刚刚Enough-Administration (JEA)
- 自定义受限远程处理实现,如 Exchange 和 Teams 模块
对于大多数系统管理员,JEA 提供了创建受限会话的最佳体验,并且应该是你的首选。 有关 JEA 的详细信息,请参阅 JEA 概述。
自定义会话实现的建议
如果你的方案需要自定义实现,则应遵循这些建议。
限制 PowerShell 提供程序的使用和功能
查看允许的提供程序如何用于确保你不会在受限会话实现中创建漏洞。
警告
不允许 FileSystem 提供商。 如果用户可以写入文件系统的任何部分,则可以完全绕过安全性。
不允许 证书 提供者。 启用提供程序后,用户可以访问存储的私钥。
不允许可以创建新的 Runspace 的命令
警告
PowerShell 7 中的 Windows 兼容性功能创建新的运行空间来托管 Windows PowerShell。 不允许通过 Windows 兼容性功能运行的任何命令。 cmdlet *-Job 可以创建新的运行空间,但不受限制。
不允许 Trace-Command cmdlet。
警告
使用 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 脚本语言。 不能运行脚本或使用变量。 只能运行本机命令和 cmdlet。
有关语言模式的详细信息,请参阅 about_Language_Modes。
不允许在会话中使用调试器
默认情况下,PowerShell 调试器以 FullLanguage 模式运行代码。 将 SessionState 中的 UseFullLanguageModeInDebugger 属性设置为 false。
有关详细信息,请参阅 UseFullLanguageModeInDebugger。