获取在受 Device Guard 保护的设备上运行的应用
Windows 10 引入了几项新功能和设置,将其全部组合起来时便等同于我们所称的 Device Guard。Device Guard 有助于通过要求你的所有应用由受信任的实体进行签名来保护你的企业设备免受恶意应用意外运行的危害。
若要在企业中使用 Device Guard,你必须能够让现有业务线和独立软件供应商 (ISV) 开发的应用在受保护的设备上运行。遗憾的是,许多业务线应用未签名,并且在许多情况下,甚至没有主动进行开发。同样,你可能希望运行某个 ISV 中的未签名软件,或者你希望运行某个 ISV 的特定应用程序,同时不信任该 ISV 中的所有应用程序。作为 Device Guard 功能的一部分,Windows 10 包含称为程序包检查器的新工具。程序包检查器扫描你未签名的应用,并创建已安装和运行的二进制文件的目录文件,然后由签名工具 Windows SDK 实用工具进行签名并使用组策略进行分发,以便你的应用在受到 Device Guard 保护的设备上运行。
在受到 Device Guard 保护的设备上运行应用需要的事项
在受 Device Guard 保护的设备上运行你的应用之前,你必须拥有:
一台运行 Windows 10 企业版、Windows 10 教育版或 Windows Server 2016 Technical Preview 的设备。
确定需要包含在你的目录文件中的未签名应用。
创建代码完整性策略以供 Device Guard 使用。
一个代码签名证书,使用内部公钥基础结构 (PKI) 创建。
SignTool。一种命令行工具,用于对文件进行数字签名、验证文件中的签名或为文件添加时间戳。该工具安装在 Microsoft Windows 软件开发工具包 (SDK) 的安装路径 \Bin 文件夹中。
为未签名的应用创建目录文件
你必须在审核模式下且运行临时代码完整性策略的设备上来运行程序包检查器,且为此目的而显式创建。审核模式让检查工具捕获任何遗漏的二进制文件,但是审核模式允许继续运行所有内容。
要点 此临时策略不应用于正常的商业目的。
为现有应用创建目录文件
作为管理员,启动 Windows PowerShell,并键入以下内容创建临时策略文件:
mkdir temp New-CIPolicy -l FileName -f .\tempdeny.xml -s .\temp -u ConvertFrom-CIPolicy .\tempdeny.xml .\tempdeny.bin cp .\tempdeny.bin C:\Windows\System32\CodeIntegrity\SIPolicy.p7b
重新启动你的设备。
作为管理员启动 PowerShell,并通过键入以下内容开始扫描你的文件系统:
PackageInspector.exe start c:
其中:
选项 说明 启动 <drive_letter>:
指定启动扫描。例如,开始扫描 C: 驱动器。
- 路径
程序包的文件路径正在检查中。
将应用安装媒体复制到 C:\ 驱动器,然后安装并运行该程序。
将媒体复制到本地驱动器可帮助你确保安装程序及其相关的文件包含在你的目录文件中。如果你丢失了安装文件,你的代码完整性策略可能信任并运行该应用,但是不会安装该应用。安装应用之后,你应该检查更新。如果更新发生在应用处于打开状态时,你应关闭并重新启动应用以确保在检查过程中捕捉到所有内容。
注意
由于程序包检查器为放置在文件系统上的每个二进制文件在目录中创建了日志项目,我们建议不要在扫描过程中运行任何其他安装或更新。
**可选:**如果你想要创建多个应用目录(包含在单个目录文件中的许多应用),你可以继续为其他应用执行步骤 2 - 3。添加所有你想要添加的应用之后,你可以继续执行步骤 5。
注意 若要简化你的过程,我们建议:
**主动支持和更新应用。**为每个应用创建一个目录文件。
**旧版、非活动或不更新的应用。**为所有旧版应用创建一个目录文件。
通过键入以下内容来停止扫描进程并为特定位置的每个应用创建 .\InspectedPackage.cat 和 InspectedPackage.cdf 文件:
PackageInspector.exe stop c:
如果你希望创建已存在于在硬盘驱动器上的文件的目录,还可以使用 scan
命令代替使用 start
和 stop
。 scan
命令以递归方式扫描指定的目录,并在目录中包含所有可签名的文件。 你可以通过键入以下内容扫描指定的目录:
PackageInspector.exe scan c:\<insert directory path>
下表显示 scan
和 stop
命令的可用选项。
选项 | 说明 |
---|---|
stop <drive_letter>: |
指定特定位置的扫描已完成,创建一个目录或定义文件。例如,C: |
扫描 <path to scan> |
指定要扫描的目录路径。 此命令以递归方式扫描指定的目录,并在目录中包含所有可签名的文件。 |
-out |
指定应通过工具创建何种类型的信息。你可以为目录文件使用 |
-listpath |
指定安装程序将为 |
-cdfPath <file_name> |
指定该工具放置创建的 .cdf 文件的位置。如果你使用此选项,你还必须指定文件名。 我们建议使用该文件的完整路径。然而,也支持相对路径。 |
- resdir |
此选项当前不受支持。 |
-name |
此选项当前不受支持。 |
-ph |
指定是否在目录中包含页面哈希。你可以使用 |
- en |
指定该目录的编码类型。默认情况下,它是 PKCS_7_ASN_ENCODING |X509_ASN_ENCODING,0X00010001。 |
- ca1 |
在目录和目录定义文件中指定 CATATTR1。 |
- ca2 |
在目录和目录定义文件中指定 CATATTR2。 |
你可以将其他参数添加到此处列出之外的目录。有关详细信息,请参阅 MakeCat 主题。
使用签名工具对目录文件进行签名
你可以使用签名工具(位于 Windows 7 或更高版本的 Windows 软件开发工具包 (SDK))或使用 Device Guard 签名门户对你的目录文件进行签名。 有关使用 Device Guard 签名门户的详细信息,请参阅 Device Guard 签名。
本过程介绍了如何使用受密码保护的个人信息交换 (.pfx) 文件对目录文件进行签名。
要点 若要使用此工具,必须具有一个内部证书颁发机构的代码签名证书,或由外部第三方证书颁发机构颁发的代码签名证书。
使用签名工具
检查你的代码签名证书已导入到证书存储或它们在文件系统内。
打开 SignTool.exe,并根据你的证书存储的位置来对目录文件进行签名。
如果你使用的 PFX 位于以下文件系统位置中:
signtool sign /f <\\SignCertLocation> /p <\\password> /fd sha256 /v
如果你已将证书导入到证书存储中:
signtool sign /n <\\CertSubjectName> /fd sha256 /v <CatalogNameAndLocation>
其中:
选项 说明 SignTool
指定到 SignTool.exe 的完整路径位置。
签名
数字签名文件。有关签名命令支持的选项的列表,请参阅 SignTool 选项。
/n SubjectName
指定签名证书的使用者的名称。此值可以为完整使用者名称的子字符串。
/f SignCertFileLocation
指定文件中的签名证书。
如果文件为密码保护的 pfx 格式,请使用 /p 选项指定密码。如果文件不包含私钥,请分别使用 /csp 和 /k 选项指定 .csp 和私钥容器名称。
/p Password
当打开 PFX 文件时,指定要使用的密码。(使用 /f 选项指定 PFX 文件。)
/fd Algorithm
指定要用于创建文件签名的文件摘要算法。默认算法为 SHA2。
/v
无论该命令运行成功还是失败,都显示详细输出,并显示警告消息。
有关详细信息和使用可用选项的示例,请参阅 SignTool.exe (签名工具)主题。
在文件资源管理器中,右键单击你的目录文件,单击“属性”,然后单击“数字签名”****选项卡以确保目录文件的数字签名是准确的。
将目录文件复制到 C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE} 并测试该文件。
注意 为了进行测试,可以手动将你的文件复制到此位置。但是,我们建议你使用组策略将目录文件复制到所有设备以进行大规模实现。
排除程序包检查器的故障
如果你在程序包检查器停止时看到“错误 1181”,你将需要增加 USN 日志的大小,并在重新扫描受影响的应用之前,清除所有缓存数据。
你必须确保通过创建和设置新的临时策略来清除缓存。如果你重复使用相同的策略,程序包检查器将会失败。
增加日志大小
打开命令提示符窗口,并键入:
fsutil usn createjournal m=0x8000000 a=0x800000 C:
其中“m”值需要增加。我们建议你将该值至少更改为默认值 m=0x2000000 的四倍。
重新运行失败的应用安装。
清除缓存数据并重新扫描你的应用
从 C:\Windows\System32\CodeIntegrity\ 文件夹中删除 SIPolicy.p7b 文件。
以管理员身份启动 Windows Powershell 并键入以下内容来创建新的临时代码完整性策略以清除所有缓存数据:
mkdir temp cp C:\Windows\System32\PackageInspector.exe .\temp\ New-CIPolicy -l Hash -f .\DenyPackageInspector.xml -s .\temp -u -deny ConvertFrom-CIPolicy .\DenyPackageInspector.xml .\DenyPackageInspector.bin cp .\DenyPackageInspector.bin C:\Windows\System32\SIPolicy.p7b
重新启动你的设备,并按照为未签名应用创建目录文件部分的步骤。