我正在使用 Hyper-V VM、Windows 11 22H2 来测试签名的 WDAC 策略,特别是即使管理员也无法禁用/删除它,所以我决定尝试一下。
我已经在我的主机上成功部署了未签名的 WDAC 策略,并且它运行良好。但是在让签名的变体工作时遇到了麻烦。
我已经退房这个相关问题并且已经尝试了那里的解决方案,即在我的 WDAC 策略中使用此处的一个 WDAC 策略模板的 PolicyID:
"C:\Windows\schemas\CodeIntegrity\ExamplePolicies"
所以我这样做了,从这些示例 XML 文件中取出一个 PolicyID,并用它替换我的 BasePolicyID 和 PolicyID,如下所示:
<BasePolicyID>{A244370E-44C9-4C06-B551-F6016E563076}</BasePolicyID>
<PolicyID>{A244370E-44C9-4C06-B551-F6016E563076}</PolicyID>
重新启动虚拟机后,Windows 不再加载。
在使用该解决方案之前,我的虚拟机至少会重新启动一次,但第二次重新启动时 Windows 将不再加载。
我在将其部署到我的虚拟机之前创建了一个检查点,这样我就可以在几秒钟内返回到之前的状态。我愿意接受任何建议。这个问题是 3 年前的,我想现在情况可能已经改变了。
几乎没有关于对签名的 WDAC 策略进行故障排除甚至部署它的信息,我找到的所有信息都是从Microsoft Docs 官方网站。
我不知道如何澳大利亚确实如此,但值得称赞。
我不知道是否应该将用于创建签名 WDAC 策略的 .cert 文件添加到 VM 的证书存储中,如果应该,应该添加到哪个存储中?我尝试了受信任的 CA 存储,但没有用。
以下是我制定签名的 WDAC 策略的方式(在应用我链接的问题的解决方案之前):
首先我创建了我的代码签名证书:
New-SelfSignedCertificate -DnsName test.com -CertStoreLocation Cert:\CurrentUser\My\ -Type Codesigning
然后将其导出至.cert
不带私钥的版本和.pfx
带私钥的版本。
之后,按照 Microsoft 官方文档指南进行操作:
Add-SignerRule -FilePath "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\MERGED.xml" -CertificatePath "C:\Users\username\OneDrive\Desktop\certificate.cer" -Kernel -User –Update
Set-RuleOption -FilePath "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\MERGED.xml" -Option 6 –Delete
$PolicyID= Set-CIPolicyIdInfo -FilePath "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\MERGED.xml" -ResetPolicyID
$PolicyID = $PolicyID.Substring(11)
$CIPolicyBin = "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\" + $PolicyID + ".cip"
ConvertFrom-CIPolicy "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\MERGED.xml" $CIPolicyBin
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\"
.\signtool.exe sign -v /n "test.com" -p7 . -p7co 1.3.6.1.4.1.311.79.1 -fd sha256 "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\{3fc72282-501d-482a-906e-a67b66b8fc42}.cip"
但并没有像上面提到的那样起作用。
我执行了相同的程序以尝试链接问题的解决方案,但不运行此部分:
$PolicyID= Set-CIPolicyIdInfo -FilePath "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\MERGED.xml" -ResetPolicyID
$PolicyID = $PolicyID.Substring(11)
$CIPolicyBin = "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\" + $PolicyID + ".cip"
ConvertFrom-CIPolicy "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\MERGED.xml" $CIPolicyBin
而是手动交换 PolicyID 和 BasePolicyID,然后使用此命令创建 .cip 文件:
ConvertFrom-CIPolicy "C:\Users\username\OneDrive\Desktop\Signing test - my WDAC Policy\0 Signed\MERGED.xml" "{A244370E-44C9-4C06-B551-F6016E563076}.cip"
我迫切需要有人来帮助我,因为我已经没有其他选择了。
答案1
我在我的 Github 上创建了有关成功创建、签署和部署签名的 WDAC - Windows Defender 应用程序控制策略的完整指南。
关于 WDAC 本身:
https://github.com/HotCakeX/Harden-Windows-Security/wiki/Introduction
创建并部署签名的 WDAC Windows Defender 策略
介绍
通过部署签Windows Defender 应用程序控制策略,系统将安全并且能够抵御任何形式的篡改(如果与 Bitlocker 和其他内置安全功能结合使用)甚至系统管理员也无法篡改或禁用此安全策略。
这仅有的此安全功能的方法要关闭,修改,更新或禁用将可以访问证书和用于签署证书的证书私钥。
请参阅微软网站或者我的其他 wiki 帖子如果您想了解 WDAC 本身以及如何为自己的环境创建定制的 WDAC。
在部署签名版本之前,请务必先在审核模式下测试并部署 WDAC 策略,以确保其正常工作。
- 这WDAC配置模块有一个可选参数,
-TestMode
它将使用以下方式部署策略失败时启动审核和高级启动选项菜单策略规则选项。
- 这WDAC配置模块有一个可选参数,
将已部署的基础策略的 xml 文件保存在安全的地方,如果您稍后决定禁用已签名的已部署 WDAC 策略,则需要它们。
视频指南
TL;DR(简短版本)
- 安装最新的 Windows Server,在其上安装 AD/DS 和 AD/CS 角色。(约 15 分钟,具体取决于硬件以及是否下载了 ISO 或 VHDX)
- 使用企业 CA 的代码签名模板创建用于 WDAC 签名的自定义证书模板(≈5 分钟)
- 生成证书并使用它来签署 WDAC 策略(≈3 分钟)
这基本上就是我们要做的一切。因此,如果您已经熟悉这些概念,您可以直接转到本页底部并使用资源部分参考 Microsoft 指南来创建和部署签名的 WDAC 策略。
但如果您不熟悉,请继续阅读,因为我已经详细解释了设置 Windows Server、生成签名证书和签署 WDAC 策略的每个步骤。对我来说,这大约需要 20 分钟(如您在视频中看到的那样),并且根据硬件的不同,它甚至可能需要更少的时间。
先决条件
最新的 Windows Server,可免费试用 180 天,提供 ISO 和 VHDX 格式。最好使用 Windows Server insider vNext,因为它具有最新功能和视觉升级。
获得 Windows 安装介质(ISO 或 VHDX)后,我们需要在主机上设置 Hyper-V VM。在本指南中,我们的主机是 Windows 11 专业工作站计算机。
创建具有以下规格的 Hyper-V VM:
- 安全启动
- 可信平台模块 (TPM)
- 至少 4 个虚拟处理器
- 至少 4 GB RAM
- 至少~20 GB 存储空间
- 将默认交换机连接到虚拟机或在 Hyper-V 管理器的虚拟交换机管理器中创建一个私有虚拟交换机,然后将其作为网络适配器硬件添加到虚拟机。
Windows Server VM 设置
Windows Server 安装完成后,您可以创建一个Hyper-V 标准检查点因此,如果您稍后配置错误,您将能够将虚拟机的状态恢复到此时间点。
重命名服务器
选择一个有意义的名字,例如CAServer
。使用此PowerShell 命令为了轻松做到这一点,它将重新启动服务器以应用新名称。
Rename-Computer CAServer -Restart
使用 GUI:安装 Active Directory 域服务
从服务器管理器 => 添加角色和功能 => 基于角色或基于功能的安装 => 选择您所在的当前服务器 => 从列表中选择 Active Directory 域服务 => 选择“添加功能” => 选择下一步继续其余步骤。
安装完成后,打开服务器管理器中的通知(上面可能有一个黄色图标),选择“将此服务器提升为域控制器”。
在打开的部署配置窗口中,选择“添加新林”,在根域名中输入域名。
它可以是任何东西,甚至是Bing.com
,但就我们的用途而言,让我们使用CAServer.com
。下一步,为 DSRM(目录服务还原模式)设置密码,它需要包含大写、小写和数字(例如,Bing6969),将此密码记在某处,例如主机上的便签应用中。
接下来,选择一个 NetBIOS 域名,默认即可。确认并继续执行其余步骤,选择下一步,最后选择安装。等待安装完成。安装完成后,它将重新启动服务器。
使用 PowerShell:安装 Active Directory 域服务
安装 (AD DS) 角色
Install-windowsfeature -name AD-Domain-Services -IncludeManagementTools
安装林并设置林密码
$password = ConvertTo-SecureString 'Bing6969' -AsPlainText -Force
Install-ADDSForest -DomainName CAServer.com -DomainNetbiosName CASERVER0 -SafeModeAdministratorPassword $password -InstallDNS:$false -Force
使用 GUI:安装 Active Directory 认证服务并设置企业根 CA(证书颁发机构)
从服务器管理器 => 添加角色和功能 => 基于角色或基于功能的安装 => 选择我们当前所在的服务器 => 选择 Active Directory 认证服务 => 选择下一步执行其余步骤,最后选择安装。
安装完成后,打开服务器管理器中的通知(上面可能会有一个黄色图标),选择“在目标服务器上配置 Active Directory 证书服务”。
在新打开的配置窗口上,在凭据部分选择下一步,在角色服务部分选中复选框Certification Authority
并选择下一步。
选择Enterprise CA
(因为独立 CA 不支持我们要使用的证书模板)并选择下一步。在 CA 类型部分选择Root CA
。在私钥部分选择Create a new private key
。
在“加密”部分,选择“加密提供程序” RSA#Microsoft Software Key Storage Provider
,选择“密钥长度” 4096
,选择“哈希算法”,SHA512
然后选择“下一步”。在“CA 名称”部分,选择“下一步”。在“有效期”部分,将有效期设置为 50 年等。选择“下一步”以完成其余部分,最后选择“配置”。
使用 PowerShell:安装 Active Directory 认证服务并设置企业根 CA
安装 Active Directory 证书服务
Install-WindowsFeature Adcs-Cert-Authority -IncludeAllSubFeature
安装新的企业 CA
Install-AdcsCertificationAuthority -CAType EnterpriseRootCa -CryptoProviderName "RSA#Microsoft Software Key Storage Provider" -KeyLength 4096 -HashAlgorithmName SHA512 -ValidityPeriod Years -ValidityPeriodUnits 50 -Force
重新启动服务器,因为这是必需的,并且服务器管理器也要求重新启动
Restart-Computer
最后,执行此操作以便将“证书颁发机构”选项添加到“服务器管理器”=>“工具”,并且其 GUI 将变得可访问和可见
Add-WindowsFeature Adcs-Cert-Authority -IncludeManagementTools
在服务器上配置颁发证书的有效期
我们将CA颁发的证书的有效期延长至30年:
certutil -setreg ca\ValidityPeriod "Years"
certutil -setreg ca\ValidityPeriodUnits "30"
完成此步骤后重新启动服务器。
您可以使用以下命令验证并确认结果:
certutil -getreg ca\ValidityPeriod
certutil -getreg ca\ValidityPeriodUnits
按照官方指南创建证书模板并生成签名证书
现在打开“证书颁发机构”,您可以通过在 Windows 搜索中或从“服务器管理器”=>“工具”中搜索它来打开它。打开后,您可以按照微软官方指南创建用于 WDAC 策略签名的证书模板,然后请求和创建证书。
请注意,如果服务器没有至少 1 个网络适配器连接到,则证书模板不会加载,这就是为什么我们的 Hyper-V VM 服务器至少需要一个虚拟网络适配器的原因。
这指南建议使用客户端计算机请求和创建证书,但由于我们将使用未加入域的计算机的证书并且不需要使用 Active Directory,因此我们可以在同一个 Windows Server VM 上执行所有步骤。
这些是一些可选的偏差来自官方指南那从而创建成功且更安全的证书对于我们的 WDAC 政策签署:
在兼容性选项卡上,您可以从证书颁发机构列表中选择 Windows Server 2016,并从证书接收者列表中选择 Windows 10/Windows Server 2016。
在常规选项卡上,您可以将有效期设置为 30 年,将续订期设置为 22 年。(我们选择的有效期允许的最大续订期。)
在“加密”选项卡上,您可以将“提供程序类别”设置为
Key Storage Provider
(韩国科学技术振兴院). 将算法名称设置为RSA
. 将最小密钥大小设置为4096
. 将请求哈希设置为SHA512
.
作为微软的指南建议,您需要转到“安全”选项卡来验证请求证书的用户的帐户访问权限,但由于我们在同一个 CA 服务器上请求和创建证书,因此我们不需要在那里进行任何更改。
创建签名的 WDAC 策略
一旦我们在 Windows 服务器或客户端计算机的用户证书存储中获得了证书,请右键单击它 => 所有任务 => 导出。导出私钥并导出所有扩展属性,为证书设置密码,并将加密设置为AES256-SHA256
。选择要导出的位置,它将创建一个.pfx
文件。
您还需要导出证书没有私钥,DER encoded binary X.509
格式为,将创建一个.cer
证书文件。我们需要此证书来签署 WDAC 策略。
请务必将这两个文件(特别.pfx
是包含私钥的文件)保存在安全的地方,例如Azure Key Vault 托管 HSM或者OneDrive 个人保管库,这样,如果您删除了您创建的所有虚拟机,您将能够继续使用同一张证书签署进一步的 WDAC 政策和补充政策,至少在接下来的 22 年内,直到需要续订。如您所见,所有这些设置只需完成一次每隔几十年。
这个人信息交换 (.pfx)文件非常重要,因为它包含公钥和私钥证书,以便任何有权访问此文件的人可以禁用已部署的签名 WDAC 策略。它绝不应该与您信任圈之外的任何人共享。它本质上是一个受密码保护的文件。
使用WDACConfig 模块签署并部署 WDAC 策略
WDACConfig 模块Deploy-SignedWDACConfig
命令可以自动化签署和部署已签署的 WDAC 策略的整个过程。
Deploy-SignedWDACConfig -CertPath <String> -PolicyPaths <String[]> -CertCN <String>
您需要对策略二进制文件signtool.exe
进行签名.cip
。
运行它并仅选择Windows SDK Signing Tools for Desktop Apps
安装。之后signtool.exe
将放置在C:\Program Files (x86)\Windows Kits\10\bin
并且 WDACConfig 模块将自动检测并使用它进行签名。您甚至可以将可执行文件复制到另一个位置,以便稍后在未安装 SDK 的另一个系统上使用,然后使用-SignToolPath <String>
WDACConfig 模块的可选参数浏览可执行文件。
- SignTool 还包含在Windows ADK但是 SDK 中的是最新的,也是推荐的获取地点。
使用WDACConfig 模块删除已签名和已部署的 WDAC 策略
Remove-WDACConfig [-SignedBase] -PolicyPaths <String[]> -CertCN <String>
参数信息
运行上述命令并重新启动系统后,您需要运行此命令并重新启动第二次,以完成从系统完全删除已签名的基本策略。
Remove-WDACConfig [-UnsignedOrSupplemental] [-PolicyIDs <String[]>] [-PolicyNames <String[]>]
参数信息
系统行为
激活过程
在部署过程中将签名的 WDAC 策略二进制文件.cip
复制到EFI
分区后,系统重新启动一次,我们可以在系统信息中看到 WDAC 用户模式正在强制执行,当您尝试安装部署策略不允许的应用程序时,它将被成功阻止。此时,由于我们使用的是 UEFI 安全启动,防篡改保护已签署 WDAC启动并开始保护 WDAC 策略免受任何篡改。我们需要再次重启系统,验证一切并确保没有启动失败。
部署签名的 WDAC 策略而无需重启与部署未签名的策略相同,因为签名的策略可以像未签名的策略一样轻松删除。因此,在部署签名的 WDAC 策略后,请务必至少重启一次。
如果有人强行删除已部署的 WDAC 策略文件
删除
.cip
策略文件C:\Windows\System32\CodeIntegrity\CiPolicies\Active
然后多次重启系统不会对 WDAC 的状态产生任何影响。它将继续工作,并且强制执行状态将显示在系统信息中。这就是它保护自己免受恶意管理员侵害的方法。从位于的分区中删除
.cip
策略文件并重新启动设备将导致启动失败。在系统重新启动之前,什么都不会发生,它将保持活动状态。这是签名 WDAC 策略的另一种自我保护方法。要从此状态恢复,用户需要在 UEFI 固件设置中禁用安全启动。目前只有 3 种情况:EFI
\EFI\Microsoft\Boot\CIPolicies\Active
如果按照安全建议,你为硬件的 UEFI 固件设置了一个强密码,他们就无法访问固件。这一安全措施以及其他 Windows 内置安全功能例如 Bitlocker 设备加密将提供为 Windows 设备提供终极保护,抵御任何威胁和任何人,无论是物理威胁、现实威胁还是互联网威胁。
如果 UEFI 固件没有密码保护,人们可以在 UEFI 固件设置中禁用安全启动和/或 TPM,他们甚至可以通过物理滥用设备来刷新整个 UEFI 固件内存,以绕过 UEFI 密码,但由于设备受 Bitlocker 保护,将触发全面封锁并且该人需要提供操作系统驱动器的 48 位恢复密钥才能完成启动过程进入 Windows 锁定屏幕。假设该人还可以访问 Windows PIN,他们还需要提供任何后续受 Bitlocker 保护的驱动器的 48 位恢复密码才能访问它们(如果驱动器未设置为使用操作系统驱动器自动解锁)。这不仅仅是深度安全。如果 UEFI 固件有任何未修补的漏洞,Device Guard 功能将会处理它。
由于第 1 步和第 2 步对于流氓用户来说是无法绕过的,因此只剩下一个选择。要完全回收物理设备,请处理无法访问的硬件(例如 SSD),然后出售剩余的硬件部件。无论哪种方式,您的数据始终保持安全,任何未经授权的人员都无法访问。
当我们激活智能应用控制时
在完全部署签名的 WDAC 策略后,如果我们打开智能应用控制,它WDAC 的变体,则它将控制 Windows Defender 应用程序控制用户模式策略。关闭智能应用程序控制后,签名的 WDAC 策略将自动接管控制权。因此,部署签名的 WDAC 策略后,可以打开或关闭智能应用程序控制,无论哪种方式,签名的 WDAC 策略都不会被禁用,并且会在智能应用程序控制关闭后立即打开。
资源
- 使用签名策略保护 Windows Defender 应用程序控制免遭篡改
- 为 Windows Defender 应用程序控制创建代码签名证书
- 部署已签名的策略
- WDAC 策略向导
- 在线生成 Windows Defender 应用程序控制 (WDAC) 策略
- WDAC 政策制定 - 澳大利亚政府
- 了解 Windows Defender 应用程序控制 (WDAC) 策略规则和文件规则
- 安装 Active Directory 域服务
- 安装-AdcsCertificationAuthority
- 安装证书颁发机构
- 标准版、数据中心版和数据中心版比较:Windows Server 2022 的 Azure Edition 版本
- 删除 Windows Defender 应用程序控制 (WDAC) 策略
- 添加签名者规则