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 事件日志中指定模块的管道执行事件。
脚本块日志记录可用于处理命令、脚本块、函数和脚本(无论是以交互方式调用还是通过自动化来处理)。 owerShell 将此信息记录到 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 和应用控制的详细信息,请参阅 使用应用控件来保护 PowerShell。
软件材料帐单 (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 之前,A Session_Key 用于在发送 PowerShell 远程会话之前加密 SecureString 。 需要传输对象时 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)会拒绝远程客户端。
安全服务标准
PowerShell 遵守 Microsoft 的 Windows 安全服务标准。 仅安全功能符合服务条件。
安全功能
- 适用于企业的应用控制系统锁定
- 使用适用于企业的 App Control 的约束语言模式
深度防御功能
- 使用 AppLocker 锁定系统
- 使用 AppLocker 的受约束语言模式
- 执行策略