我们在 RDS 环境中安装了 PowerShell。它目前用于远程管理和 App-V 虚拟应用程序发布等任务。据我了解,绕过受限执行策略相当容易。
但是,我找不到任何有关防止绕过执行策略(或使其变得更加困难)的有用信息。我正在考虑使用文件筛选 (AppLocker) 来阻止 PowerShell 文件,但我猜想攻击者可以使用附加到 Microsoft Office 文件的 VBA 脚本来执行 PowerShell 脚本。
目前我们的重点是监控,但我希望更多地关注预防。
你想要实现的目标是毫无意义的。有多种方法可以绕过执行策略。事实上,它并不是是出于安全原因而设计的。
这应该是一个很好的起点。
PS:您还可以监视事件 400,以在重新安装 PS2 时检测对 PS2 的绕过(这是您不希望出现在用户计算机上的情况)。
实际上,有一些方法可以防止滥用 PowerShell(并使绕过执行策略变得毫无用处):
除此之外,配置所有 PowerShell 命令的日志记录并通过中央位置发送它们(以便 IDS 可以监控这一点)也是一个很好的做法。
请参阅检测进攻性 PowerShell 攻击工具,了解有关如何实现此目的的更多详细信息。
真正的答案是设置“MachinePolicy”(或“UserPolicy”)范围。这可以通过组策略编辑器完成,并且不能使用绕过命令覆盖。默认情况下,如果您在 PowerShell 中运行
Get-ExecutionPolicy -List
,您可能会看到顶部的两个都为“未定义”。
要更改它,请打开组策略编辑器并导航到:
Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell
并打开名为 Turn on Script Execution
的选项。
默认情况下未配置。如果您将其设置为
Disabled
,它将把 MachinePolicy 设置为“受限”。如果您将其设置为 Enabled
,您将看到一个下拉菜单,您可以在其中选择其他策略,例如仅签名脚本(“AllSigned 策略”)。
假设您将其设置为 AllSigned。然后,如果有人尝试运行如下命令:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
它会这样回应:
Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope. Due to the override, your shell will retain its current effective execution policy of AllSigned.
如果再次列出当前的执行策略,则会显示该人刚刚设置的具有该执行策略的范围。然而,即使是 Bypass,它实际上也不会应用,MachinePolicy 会获胜。即使 PowerShell 以管理员身份运行,MachinePolicy 仍然适用。
而且您也不能仅通过 PowerShell 更改 MachinePolicy,即使以管理员身份运行也是如此。如果你这样做,它会说:
Cannot set execution policy. Execution policies at the MachinePolicy or UserPolicy scopes must be set through Group Policy.
PowerShell 7 的附加说明:
如果您使用单独下载的 PowerShell 7(不要与“Windows Powershell”混淆),则将使用完全独立的执行策略。要为此设置 MachinePolicy,您还需要使用组策略编辑器,但默认情况下不会在那里找到它。
要使 PowerShell 7 设置显示在组策略编辑器中,您需要运行 PowerShell 7 安装中包含的名为
InstallPSCorePolicyDefinitions.ps1
的脚本。您必须使用 PowerShell 7 运行此程序,并且可能以管理员身份运行。
现在,您将能够在 GPE 中找到这些设置:
Computer Configuration > Administrative Templates > PowerShell Core
它将具有与 Windows PowerShell 相同的设置,但幸运的是,他们有一个额外的选项来继承您为 Windows PowerShell 设置的内容。