使用已签名的策略保护适用于企业的 App Control 免受篡改

注意

适用于企业的 App Control 的某些功能仅适用于特定 Windows 版本。 详细了解 应用控制功能可用性

已签名的企业应用控制策略为组织提供 Windows 中提供的最高保护级别。 这些策略旨在检测策略的管理篡改,例如以管理员身份运行的恶意软件,并将导致启动失败或蓝屏。 考虑到这一目标,删除已签名的应用控制策略要困难得多。 必须启用 SecureBoot 才能为已签名的应用控制策略提供此保护。

如果当前没有可用于对策略进行签名的代码签名证书,请参阅 获取供自己使用的代码签名证书

警告

如果签名证书不符合以下规则,则可能会出现启动失败或蓝屏:

  • 所有策略(包括基本策略和补充策略)都必须根据 PKCS 7 Standard进行签名。
  • 仅使用 2K、3K 或 4K 密钥大小的 RSA 密钥。 不支持 ECDSA。
  • 应用 2022 年 11 月累积安全更新后,可以将 SHA-256、SHA-384 或 SHA-512 用作 Windows 11 以及 Windows 10 和 Windows Server 2019 及更高版本的摘要算法。 所有其他设备仅支持 SHA-256。

在尝试部署已签名策略之前,应首先部署策略的未签名版本,以发现策略规则的任何问题。 我们还建议启用规则选项 9 - Enabled:Advanced Boot Options Menu10 - Enabled:Boot Audit on Failure ,以使故障排除选项可供管理员使用。 若要确保启用规则选项,可以运行命令,例如 Set-RuleOption -FilePath <PathAndFilename> -Option 9,即使不确定该选项是否已启用也是如此。 如果是这样,则命令不起作用。 当经过验证并为企业部署准备就绪时,你可以删除这些选项。 有关规则选项的详细信息,请参阅 适用于业务的应用控制策略规则

注意

签署具有现有补充策略的基本策略时,还必须切换到所有补充策略的已签名策略。 通过向基本策略添加 <SupplementalPolicySigner> 规则来授权已签名的补充策略。

准备应用控制策略进行签名

  1. 打开提升的Windows PowerShell会话并初始化要使用的变量:

    $PolicyPath=$env:userprofile+"\Desktop\"
    $PolicyName="FixedWorkloadPolicy_Enforced"
    $LamnaServerPolicy=$PolicyPath+$PolicyName+".xml"
    

    注意

    此示例使用在从引用计算机创建企业应用控件策略一文中创建 的应用控制策略 的强制版本。 如果签署另一个策略,请务必使用正确的信息更新 $PolicyPath$PolicyName 变量。

  2. 导航到作为工作目录的桌面:

    cd $PolicyPath
    
  3. 如果应用控制策略尚未包含 <UpdatePolicySigner> 策略签名证书的规则,则必须添加它。 至少必须存在一个 <UpdatePolicySigner> 规则才能使用 ConvertFrom-CiPolicy 转换策略 XML。

    使用 Add-SignerRule 并从证书文件 (.cer) 创建 <UpdatePolicySigner> 规则。 如果你购买了代码签名证书或从自己的公钥基础结构 (PKI) 颁发了证书,则可以导出证书文件。

    注意

    如果策略不允许补充策略,则应省略以下命令中的 -Supplemental 开关:

    Add-SignerRule -FilePath $LamnaServerPolicy -CertificatePath <Path to exported .cer certificate> -Update -Supplemental
    

    重要提示

    如果无法执行此步骤,将无法修改或禁用此策略,并将导致启动失败。 有关如何禁用导致启动失败的已签名策略的详细信息,请参阅 删除导致启动停止失败的适用于企业的应用控制策略

  4. 使用 Set-RuleOption,删除未签名的策略规则选项:

    Set-RuleOption -FilePath $LamnaServerPolicy -Option 6 -Delete
    
  5. (可选) 使用 Set-CIPolicyIdInfo 重置策略 ID 并更改策略名称。

  6. (可选) 使用 Set-CIPolicyVersion 更改策略 VersionEx。

    重要提示

    更新已签名策略时,更新策略的 VersionEx 必须大于或等于当前策略。 将已签名的策略替换为较低版本将导致启动失败。

  7. 使用 ConvertFrom-CIPolicy,将策略转换为二进制格式:

    $PolicyID= Set-CIPolicyIdInfo -FilePath $LamnaServerPolicy  -ResetPolicyID
    $PolicyID = $PolicyID.Substring(11)
    $CIPolicyBin = $env:userprofile + "\Desktop\" + $PolicyID + ".cip"
    ConvertFrom-CIPolicy $LamnaServerPolicy $CIPolicyBin
    

对策略进行签名

使用 signtool.exe 进行策略签名

如果你购买了代码签名证书或从自己的 PKI 颁发了证书,则可以使用 SignTool.exe 对应用控制策略文件进行签名:

  1. 将 .pfx 代码签名证书导入到将进行签名的计算机上的用户个人存储中。 在此示例中,将使用在 “可选:为企业应用控制创建代码签名证书”中创建的证书。

  2. 使用 SignTool.exe 对应用控制策略进行签名:

    <Path to signtool.exe> sign -v -n "ContosoSigningCert" -p7 . -p7co 1.3.6.1.4.1.311.79.1 -fd sha256 $CIPolicyBin
    

    注意

    <signtool.exe 的路径>变量应是 SignTool.exe 实用工具的完整路径。 ContosoSigningCert 是用于对策略进行签名的证书的使用者名称。 你应将此证书导入你用于对策略进行签名的计算机上的个人证书存储。

完成后,命令应输出扩展名为 .p7 已签名的策略文件。 必须将文件重命名为 {GUID}.cip “{GUID}”是原始应用控制策略 XML 中的 <PolicyId> 。

验证并部署已签名的策略

可以使用 certutil.exe 或 PowerShell 验证已签名的文件。 查看输出以确认签名算法,如本文顶部的警告中所述。

certutil.exe -asn <path to signed policy file>
$CIPolicyBin = 'path to signed policy file'
Add-Type -AssemblyName 'System.Security'
$SignedCryptoMsgSyntax = New-Object -TypeName System.Security.Cryptography.Pkcs.SignedCms
$SignedCryptoMsgSyntax.Decode([System.IO.File]::ReadAllBytes($CIPolicyBin))
$SignedCryptoMsgSyntax.Certificates | Format-List -Property *

在继续部署之前,在一组具有代表性的计算机上全面测试已签名的策略。 请务必在应用已签名的应用控制策略后至少重新启动两次测试计算机,以确保不会遇到启动失败。

验证已签名的策略后,请使用首选部署方法进行部署。 有关部署策略的详细信息,请参阅 部署适用于业务的应用控制策略

注意

已签名策略应用到计算机后,已签名策略的防篡改保护将在首次重新启动后生效。 此保护仅适用于启用了 UEFI 安全启动的计算机。