PowerShell 提供多种功能,旨在提高脚本编写环境的安全性。
执行策略
PowerShell 执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶意脚本的执行。 可使用组策略设置为计算机和用户设置执行策略。 执行策略仅适用于 Windows 平台。
有关更多信息,请参阅 about_Execution_Policies。
SecureString 类的使用
PowerShell 具有多个支持使用 System.Security.SecureString 类的 cmdlet。
与任何 .NET 类一样,可以在自己的脚本中使用 SecureString。 但是,Microsoft 不建议使用 SecureString 进行新开发。 Microsoft 不建议使用密码或依赖其他方法来进行身份验证,例如证书或 Windows 身份验证。
PowerShell 继续支持 SecureString 类以实现后向兼容性。 使用 SecureString 仍然比使用纯文本字符串更安全。 PowerShell 仍依赖于 SecureString 类型,以避免意外将内容公开到控制台或日志中。 请仔细使用 SecureString ,因为它可以轻松转换为纯文本字符串。 有关使用 SecureString 的完整讨论,请参阅 System.Security.SecureString 类文档。
模块和脚本块的日志记录
模块日志记录使你能够为选定的 PowerShell 模块启用日志记录。 此设置在计算机上的所有会话中都有效。 PowerShell 记录 Windows PowerShell 事件日志中指定模块的管道执行事件。
脚本块日志记录可用于处理命令、脚本块、函数和脚本(无论是以交互方式调用还是通过自动化来处理)。 PowerShell 将此信息记录到 Microsoft-Windows-PowerShell/Operational 事件日志中。
有关详细信息,请参阅以下文章:
AMSI 支持
Windows 反恶意软件扫描接口 (AMSI) 是一种 API,允许应用程序将操作传递给反恶意软件扫描程序(例如 Windows Defender),以扫描恶意有效负载。 从 PowerShell 5.1 开始,在 Windows 10(及更高版本)上运行的 PowerShell 将所有脚本块传递到 AMSI。
PowerShell 7.3 扩展了发送到 AMSI 进行检查的数据。 它现在包括所有 .NET 方法调用。
有关 AMSI 的详细信息,请参阅 AMSI 如何提供帮助。
受约束的语言模式
ConstrainedLanguage 模式通过限制 PowerShell 会话中允许的 cmdlet 和 .NET 类型来保护系统。 有关完整说明,请参阅 about_Language_Modes。
应用程序控件
Windows 10 包括两种技术: 适用于企业的 应用控件和 AppLocker ,可用于控制应用程序。 PowerShell 检测是否正在强制实施系统范围的应用程序控制策略。 此策略会在运行脚本块、脚本文件或加载模块文件时应用某些行为,以防止在系统上执行任意代码。
应用控制企业版在Microsoft安全响应中心(MSRC)定义的服务条件下设计为安全功能。 适用于企业的应用控制是适用于 Windows 的首选应用程序控制系统。 有关 PowerShell 如何支持 AppLocker 和 App Control for Business 的详细信息,请参阅 使用应用控制来保护 PowerShell。
AppLocker 是一个旧版应用程序控制系统,但在 Windows 11 中仍受支持。 AppLocker 不是 MSRC 定义的服务条件下的安全功能。 有关服务条件的详细信息,请参阅Microsoft 安全 Windows的服务条件。
系统锁定模式
在 PowerShell 中,系统锁定模式是系统范围的应用程序控制策略的抽象,由Windows通过适用于企业的应用控制或 AppLocker 强制实施。 当应用程序控制策略处于活动状态时,PowerShell 将进入系统锁定模式。 在系统锁定模式下,应用程序控制策略确定每个运行空间的语言模式。
重要
如果没有系统锁定模式,语言模式不会在运行空间之间传播。 每个运行空间单独查询Windows应用程序控制策略以确定其语言模式。
在一个运行空间上设置语言模式不会影响其他运行空间。 如果没有活动应用程序控制策略,新的运行空间默认为 FullLanguage 模式。
软件材料帐单 (SBOM)
从 PowerShell 7.2 开始,所有安装包都包含软件材料帐单 (SBOM)。 PowerShell 团队还会为由其负责但独立于 PowerShell 单独发布的模块生成 SBOM。
可以在以下位置找到 SBOM 文件:
- 在 PowerShell 中的
$PSHOME/_manifest/spdx_2.2/manifest.spdx.json处找到 SBOM。 - 对于各模块,可在
_manifest/spdx_2.2/manifest.spdx.json下的模块文件夹中找到 SBOM。
SBOM 的创建和发布是将联邦政府网络安全现代化和加强软件供应链安全的第一步。 有关此计划的详细信息,请参阅博客文章在 Microsoft 使用 SPDX 生成 SBOM。
在 PowerShell 远程处理中保护数据传输
在 PowerShell v7.6-preview5 之前,会先使用 Session_Key 对 SecureString 进行加密,然后再将其发送到 PowerShell 远程会话。 当需要传输 SecureString 对象时,PowerShell 远程处理协议(PSRP)会在客户端与服务器之间进行密钥交换。 交换涉及以下步骤:
- 客户端生成公钥/私钥对,并将公钥发送到服务器。
- 服务器生成用于对称加密的会话密钥。
- 服务器使用公钥加密会话密钥并将其发送到客户端。
- 客户端和服务器都使用新的会话密钥来加密 SecureString 对象。
PowerShell 远程协议(PSRP)在密钥交换期间使用 RSAEncryptionPadding.Pkcs1 算法。 算法 不安全 ,因此密钥交换不提供任何额外的安全性。
重要
必须使用安全传输层来确保通过 PSRP 进行安全数据传输。
从 PowerShell v7.6-preview.5 开始,密钥交换已弃用。 PSRP 的版本已递增到 v2.4,并包含以下更改:
当客户端和服务器为 v2.4 或更高版本时,将弃用以下 PSRP 消息:
- PUBLIC_KEY
- PUBLIC_KEY_REQUEST
- ENCRYPTED_SESSION_KEY
当客户端和服务器为 v2.4 或更高版本时,将跳过加密和解密步骤
SecureString。
此项更改向后兼容。
- 对于旧客户端或服务器(v2.3 或更低版本),需要时仍使用密钥交换。
- 当客户端和服务器位于同一台计算机上时,PSRP 可以使用命名管道远程会话。
由于远程客户端可以连接到命名管道,并且数据不再使用会话密钥进行加密,因此命名管道(用于
Enter-PSHostProcess)会拒绝远程客户端。
安全服务标准
安全边界在具有不同信任级别的安全域的代码和数据之间提供逻辑分隔。 安全功能建立在安全边界之上,可提供针对特定威胁的可靠防护。 对于此类别中的安全功能,Microsoft打算通过服务解决报告漏洞。
PowerShell 的安全功能
- 搭载企业版应用控制的系统锁定
- 使用适用于企业的 App Control 的约束语言模式
有关详细信息,请参阅Windows 的 Microsoft 安全服务条件文档。
在某些情况下,安全功能可能会提供针对威胁的防护,而无需提供可靠的防御。 这些安全功能通常称为 深层防御 功能或缓解措施,因为它们提供额外的安全性,但可能具有设计限制,以防止它们完全缓解威胁。 对深层防御安全功能的绕过本身并不构成直接风险,因为攻击者还必须找到影响安全边界的漏洞,或者他们必须依赖其他技术(如社会工程)来实现设备入侵的初始阶段。
PowerShell 的深层防御功能
- 使用 AppLocker 或通过会话配置或手动设置来配置受约束的语言模式
$ExecutionContext.SessionState.LanguageMode - 使用 AppLocker 锁定系统
- 执行策略