35、受限语言模式下的 PowerShell 安全策略实现

受限语言模式下的 PowerShell 安全策略实现

1. PowerShell Protect 模块

可以将 PowerShell Protect 模块与受限语言模式(CLM)并行实施,以增强安全性。该模块有两个主要部分:
1. PowerShell cmdlets :帮助创建和部署策略。
2. AMSI(反恶意软件扫描接口) :检查预解析的 PowerShell 代码,防止恶意代码执行。

更多信息请参考:https://ironmansoftware.com/powershell-protect

2. 深入了解 Windows 锁定策略(WLDP)

PowerShell 使用 SystemPolicy 类依赖 Windows 锁定策略(WLDP)来实施 Windows 锁定策略、设备防护和受限语言模式。WLDP 有三个关键方法:
- GetSystemLockdownPolicy() :PowerShell 用于检查系统锁定状态的顶级方法,会调用 GetLockdownPolicy() 和 GetDebugLockdownPolicy(),New - Object 用此方法验证批准的对象类型。
- GetLockdownPolicy(string path, SafeHandle handle) :检索适用于文件的锁定策略,GetSystemLockdownPolicy() 和 ReadScriptContents() 方法会使用它。
- GetDebugLockdownPolicy(string path) :检索 __PSLockdownPolicy 环境变量中启用的调试覆盖设置。若启用调试覆盖且 WLDP 策略已生效,系统会忽略该覆盖。

2.1 GetLockdownPolicy()

此方法是代码的主要部分,按以下顺序测试 WLDP 和 AppLocker 策略:
1. WLDP 文件策略
2. AppLocker 文件策略
3. 系统 WLDP 策略
4. 调试覆盖策略

2.2 GetWldpPolicy()

该方法调用并缓存 wldp.dll 中 WldpGetLockdownPolicy() 函数的结果,Windows Defender 应用程序控制(WDAC)使用 WLDP 定义配置状态。

2.3 GetAppLockerPolicy()

评估当前实施的系统和用户 AppLocker 策略,步骤如下:
1. 在用户的 %Temp% 目录中创建 AppLocker 测试文件名(.psd1 和 .psm1),若 %Temp% 目录不可访问,则尝试 \AppData\LocalLow\Temp。
2. 向调用者返回实施策略。

2.4 GetDebugLockdownPolicy()

这是用于调试目的的覆盖设置,包括:
- 宽松文件匹配 :系统信任所有位于名为 ‘System32’ 目录中的脚本。
- __PSLockdownPolicy 环境变量 :该变量的值会影响语言模式,适用于所有位于名为 ‘System32’ 的任何目录中的脚本,Contains() 方法允许在任何父目录或子目录中进行匹配。

2.4.1 __PSLockdownPolicy 环境变量

GetDebugLockdownPolicy(string path) 使用此变量进行调试,不建议在生产环境中使用。设置 _PSLockdownPolicy 为 0 不会覆盖现有的 WDAC 或 App Locker 策略。策略设置如下:
| 值 | 描述 |
| ---- | ---- |
| 0 | 未定义,不应用任何更改 |
| 4 | UMCI 强制实施,启用受限语言模式 |
| 8 | UMCI 审核,将 UMCI 策略设置为 ‘审核’,PowerShell 不会启用受限语言模式 |

以下是 WLDP 的 __PSLockdownPolicy 实现的源代码:

internal static class WldpNativeConstants
{
    internal const uint WLDP_HOST_INFORMATION_REVISION = 0x00000001;

    internal const uint WLDP_LOCKDOWN_UNDEFINED = 0;
    internal const uint WLDP_LOCKDOWN_DEFINED_FLAG = 0x80000000;
    internal const uint WLDP_LOCKDOWN_SECUREBOOT_FLAG = 1;
    internal const uint WLDP_LOCKDOWN_DEBUGPOLICY_FLAG = 2;
    internal const uint WLDP_LOCKDOWN_UMCIENFORCE_FLAG = 4;
    internal const uint WLDP_LOCKDOWN_UMCIAUDIT_FLAG = 8;
}
private static SystemEnforcementMode GetLockdownPolicyForResult(
    uint pdwLockdownState)
{
    if ((pdwLockdownState & WldpNativeConstants.WLDP_LOCKDOWN_UMCIAUDIT_FLAG)
        == SystemPolicy.WldpNativeConstants.WLDP_LOCKDOWN_UMCIAUDIT_FLAG)
    {
        return SystemEnforcementMode.Audit;
    }
    else if ((pdwLockdownState &
              WldpNativeConstants.WLDP_LOCKDOWN_UMCIENFORCE_FLAG) ==
             WldpNativeConstants.WLDP_LOCKDOWN_UMCIENFORCE_FLAG)
    {
        return SystemEnforcementMode.Enforce;
    }
    else
    {
        return SystemEnforcementMode.None;
    }
}

3. 使用 AppLocker 脚本规则实施策略

3.1 简介

可以通过组策略在以下路径管理 AppLocker:
Computer Configuration\Windows Settings\Security Settings\Application Control Policies\App Locker

AppLocker 有五种规则定义类型:
1. 可执行规则 :控制哪些可执行文件( .exe, .com)可以或不可以运行。
2. Windows 安装程序规则 :控制允许的安装包( .msi, .msp, .mst)。
3.
脚本规则 :定义允许的脚本格式( .ps1, .bat, .cmd, .vbs, .js)和文件,PowerShell 模块文件( .psm1)和 PowerShell 模块清单文件( .psd1)不受影响。
4. DLL 规则 :控制模块和库( .dll, .ocx)可以运行的位置以及允许的用户,这些规则可能影响系统稳定性和性能。
5. 打包应用规则 :控制哪些通用 Windows 平台(UWP)应用和安装程序可以运行。

必须在 AppLocker 属性中启用每种定义类型来配置和实施规则,DLL 规则可在高级选项卡中找到。AppLocker 使用允许列表方法,实施所有定义类型,支持策略 ‘审核’ 以在实施前测试策略定义,减少对用户的影响。

AppLocker 规则评估有三个主要条件,按最佳方法排序如下:
1. (推荐)发布者 :代码签名的脚本是推荐选项,提供最大的灵活性和安全性。
2. 文件哈希 :文件哈希可防止代码被修改,但文件更改时需要更改策略。
3. (不推荐)文件路径 :规则应用取决于文件或目录路径或名称,此方法不能确保文件的完整性,因为没有机制测试文件的身份。

对 AppLocker 进行任何更改后,应运行 gpupdate /force 刷新组策略。

3.2 入门

3.2.1 启用 AppLocker 服务

在创建和配置规则之前,必须通过组策略在以下路径启用 ‘Application Identity’ Windows 服务:
Computer Configuration\Windows Settings\Security Settings\System Services\Application Identity

也可以手动启用该服务,使用 PowerShell 启用服务的步骤如下:
1. 以管理员身份启动会话。
2. 输入 Start - Service - Name 'Application Identity'

3.2.2 创建默认规则

首次启用 AppLocker 时,允许其创建默认规则。操作步骤如下:
1. 右键单击脚本规则,选择“创建默认规则”。

默认脚本规则如下:
1. 允许所有用户运行 “Program Files” 目录(由 %PROGRAM - FILES%* 路径变量定义)中的脚本。
2. 允许所有用户运行 “Windows” 目录(由 %WINDIR%* 路径变量定义)中的脚本。
3. 允许本地管理员运行所有脚本,使管理员能够继续维护/管理环境。

定义自定义规则后,应删除这些默认规则,以防止它们成为 “通用规则”。

3.2.3 自动生成规则

自动生成规则的过程如下:
1. 右键单击脚本规则,选择“自动生成规则…”。
2. 选择目标安全组。
3. 输入扫描目录路径。
4. 输入规则集名称。
5. 选择 “下一步 >”。
6. 确保选择以下设置:
- 为数字签名的文件创建发布者规则。
- 文件哈希:使用文件的哈希创建规则。
- 通过对相似文件进行分组减少创建的规则数量。
7. 选择 “下一步 >”。
8. 选择 “创建”。

3.2.4 创建自定义规则

创建自定义规则的步骤如下:
1. 右键单击脚本规则,选择“创建新规则”。
2. 选择 “下一步 >”。
3. 在操作中选择 “允许”。
4. 选择目标安全组。
5. 选择 “下一步 >”。
6. 选择主要条件(发布者、路径、文件哈希)。

3.2.4.1 发布者条件
  1. 在参考文件下,选择 “浏览…” 并定位 *.ps1 文件。
  2. 可以分配不同的安全级别,从最宽松(顶部)到最严格(底部),每个级别包含前一个级别的要求:
    • (最低)发布者:要求文件证书的颁发者符合当前值。
    • 产品名称:要求签名文件的产品名称符合当前值。
    • 文件名称:要求签名文件的文件描述符合当前值。
    • (最高)文件版本:要求签名文件的版本符合当前值,可选择更高或更低版本。
      可以通过选择 “使用自定义值” 进一步自定义字段,建议为内部自签名证书使用产品名称。
  3. 选择 “下一步 >”。
  4. 添加规则的任何例外,例外遵循 AppLocker 条件(文件、发布者、哈希)。
  5. 选择 “下一步 >”。
  6. 输入名称和(可选)描述,然后选择 “创建”。
3.2.4.2 路径条件
  1. 选择 “浏览文件…” 或 “浏览文件夹…” 并选择要添加的文件/目录。
  2. 选择 “下一步 >”。
  3. 添加规则的任何例外,例外遵循 AppLocker 条件(文件、发布者、哈希)。
  4. 输入名称和(可选)描述,然后选择 “创建”。
3.2.4.3 文件哈希条件
  1. 选择 “浏览文件…” 或 “浏览文件夹…” 并选择要添加的文件/目录,选择目录时,向导将枚举目录中的所有 *.ps1 文件,注意这不是递归搜索。
  2. 输入名称和(可选)描述,然后选择 “创建”。
3.2.5 启用审核

在实施策略之前,可以在不影响最终用户的情况下测试组织内的更改。AppLocker 在事件日志的 Application and Services Logs\Microsoft\Windows\AppLocker 下引发事件。启用策略审核的步骤如下:
1. 右键单击 AppLocker,选择 “属性”。
2. 启用脚本规则,选择 “仅审核”。
3. 选择 “应用” 和 “确定”。

3.2.6 启用策略实施

准备好后,实施 AppLocker 策略的步骤如下:
1. 右键单击 AppLocker,选择 “属性”。
2. 启用脚本规则,选择 “实施规则”。
3. 选择 “应用” 和 “确定”。

以下是 AppLocker 脚本规则操作的 mermaid 流程图:

graph LR
    A[开始] --> B[启用 AppLocker 服务]
    B --> C{选择规则创建方式}
    C -->|默认规则| D[创建默认规则]
    C -->|自动生成| E[自动生成规则]
    C -->|自定义规则| F[创建自定义规则]
    D --> G[删除默认规则(自定义规则定义后)]
    E --> H[完成规则生成]
    F --> I{选择主要条件}
    I -->|发布者| J[按发布者条件创建规则]
    I -->|路径| K[按路径条件创建规则]
    I -->|文件哈希| L[按文件哈希条件创建规则]
    J --> M[完成规则创建]
    K --> M
    L --> M
    M --> N{选择操作}
    N -->|审核| O[启用审核]
    N -->|实施| P[启用策略实施]
    O --> Q[完成审核设置]
    P --> R[完成策略实施]

4. 使用 WDAC 实施策略

4.1 什么是 WDAC

WDAC 即 Windows Defender 应用程序控制策略,是在 Windows 10 桌面(1903)和 Server 2016 操作系统上与 Windows Defender 一起实施的策略框架。它曾被称为可配置代码完整性(CGI)和设备防护(DG)。当 WDAC 策略生效时,PowerShell 将以受限语言模式运行。

WDAC 支持 Windows 10 1903 及 Windows Server 2016 或更高版本。它在底层的功能与 AppLocker 相同,但不能使用 AppLocker 组策略编辑策略实施,而是使用 WLDP 查询状态。AppLocker 仅限于使用组策略的本地域中的本地端点,而 WDAC 可部署到云端点和本地端点,支持以下端点:
- 移动设备管理(MDM)解决方案 :如 Microsoft Intune,仅支持 Windows 10 设备。
- Microsoft 端点配置管理器(MECM)
- 脚本解决方案
- 组策略

WDAC 是云设备的推荐部署方式。与 AppLocker 类似,在实施前必须启用策略审核,否则最终用户可能无法使用应用程序或程序。

4.2 使用 Microsoft Intune 部署 WDAC

4.2.1 先决条件
  • Intune 设置要求
    • 企业移动性 + 安全性(EMS)/Intune 订阅
    • Office 365 订阅(适用于 Office 应用和应用保护策略管理的应用)
    • Apple APNs 证书(用于启用 iOS/iPadOS 设备平台管理)
    • Azure AD Connect(用于目录同步)
    • Intune 本地连接器(用于 Exchange 本地条件访问,如有需要)
    • Intune 证书连接器(用于 SCEP 证书部署,如有需要)
  • Intune 设备要求 :Windows 10 桌面(1903 或更高版本)
4.2.2 创建设备策略

创建设备策略的步骤如下:
1. 打开 URL:https://endpoint.microsoft.com/。
2. 在左侧窗格中,选择 “设备”。
3. 在 “策略” 下,选择 “配置文件”。
4. 选择 “创建配置文件”。
5. 在 “平台” 下,选择 “Windows 10 及更高版本”。
6. 在 “配置文件类型” 下,选择 “模板”。
7. 选择 “端点保护”。
8. 选择 “创建”。
9. 输入名称和描述,然后按 “下一步”。
10. 选择 “Microsoft Defender 应用程序控制”。
11. 选择 “应用程序控制代码完整性策略”。
12. 根据类型,选择 “仅审核” 以审核策略或 “实施” 以实施策略。
13. 选择 “下一步”。
14. 分配将应用此策略的目标用户,策略使用 Azure Active Directory(AAD)组作为过滤机制。
15. 选择 “下一步”。
16. Intune 提供了额外的基于属性的过滤功能,可根据需要添加其他规则。
17. 选择 “下一步”。
18. 选择 “创建”。

如果策略类型设置为 “实施”,已加入的机器将应用 WDAC 策略,PowerShell 将以受限语言模式启动。

以下是使用 Microsoft Intune 部署 WDAC 的 mermaid 流程图:

graph LR
    A[开始] --> B[满足先决条件]
    B --> C[打开 URL: https://endpoint.microsoft.com/]
    C --> D[选择设备]
    D --> E[选择配置文件]
    E --> F[创建配置文件]
    F --> G[选择 Windows 10 及更高版本]
    G --> H[选择模板]
    H --> I[选择端点保护]
    I --> J[选择创建]
    J --> K[输入名称和描述并下一步]
    K --> L[选择 Microsoft Defender 应用程序控制]
    L --> M[选择应用程序控制代码完整性策略]
    M --> N{选择策略类型}
    N -->|仅审核| O[审核策略]
    N -->|实施| P[实施策略]
    O --> Q[分配目标用户并下一步]
    P --> Q
    Q --> R[添加额外规则并下一步]
    R --> S[选择创建]

5. 最佳实践

为了提高 PowerShell 的安全性,可遵循以下最佳实践:
1. 从所有机器中移除 PowerShell 2.0。
2. 在生产环境中实施脚本签名。
3. 为桌面实施 WDAC,为服务器实施 AppLocker。
4. 根据脚本签名证书实施脚本签名策略。

6. 进一步阅读

  • About Languages Modes—Microsoft Docs
  • Windows Lockdown Policy—Microsoft Docs
  • WLDP Native Methods Source—PowerShell on GitHub
  • WDAC and AppLocker Overview—Microsoft Docs
  • Constrained Language Mode—Microsoft DevBlogs
  • TypeResolver Source—PowerShell on GitHub
  • Script Rules in AppLocker—Microsoft Docs
  • Windows PowerShell 2.0 Deprecation—Microsoft DevBlogs
  • Windows 10 Device Guard and Credential Guard Demystified—Microsoft TechCommunity Blogs
  • Introduction To Device Guard VBS and WDAC—Microsoft Docs
  • AppLocker Policies Deployment Guide
  • Configure an AppLocker Policy for Audit Only—Microsoft Docs
  • Using Event Viewer with AppLocker—Microsoft Docs
  • WDAC Deployment Guide

通过以上对 PowerShell 安全策略的介绍,包括 PowerShell Protect 模块、Windows 锁定策略、AppLocker 脚本规则和 WDAC 的使用,以及最佳实践和进一步阅读建议,希望能帮助您更好地保障 PowerShell 环境的安全。在实际操作中,可根据具体需求选择合适的策略和方法,并严格按照操作步骤进行实施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值