安全性

使用软件限制策略锁定应用程序

Chris Corio and Durga Prasad Sayana

 

概览:

  • 软件限制策略运行方式
  • 清点环境中的应用程序
  • 创建和实施策略

当 IT 专业人员希望降低其台式计算机的总体拥有成本(简称 TCO)时,可以考虑采用两种关键策略。第一种是将台式计算机

用户的帐户移出 Administrators 组。第二种是限制用户可运行的应用程序。在企业环境中解决这些问题非常困难,但 Windows Vista® 提供了一些技术,可帮助您实现这些目标。

Windows Vista 及其用户帐户控制 (UAC) 功能在帮助 IT 专业人员以 Users 组成员(标准用户)身份运行其企业用户方面迈出了很大一步。UAC 将所有应用程序的默认安全上下文更改为属于 User,而不是 Administrator。迁移至 Users 组任务也非常艰巨,但随着该行业逐渐适应这种新方式,此项任务也会渐渐变得越来越容易。

在仔细分析将用户移至 Users 组(或有时在此过程中)可能会遇到哪些困难后,许多管理员记录下其用户需要运行的应用程序,并考虑需要执行哪些步骤才能仅允许运行这些应用程序。软件限制策略功能正是为帮助 IT 专业人员完成上述任务而设计的。

您只需指定允许运行的应用程序,然后使用组策略部署该策略即可。在整个企业范围内实施这一策略可降低总体拥有成本,因为此锁定可避免产生与不受支持的应用程序相关的问题。(您还可以一些有趣和特定的方式使用软件限制策略,在侧栏“基本软件限制策略”中将进行介绍。)

软件限制策略运行方式

软件限制策略旨在准确控制用户在 Windows Vista 计算机上可执行的代码。作为管理员,您可以创建一个策略,用于定义在您的环境中可以(或无法)运行哪些应用程序。无论何时何地,只要可能执行代码,就会评估此策略。这包括创建处理期间、调用 ShellExecute 过程中以及脚本运行时。(稍后,我们将更加详细地介绍此策略。)

如果确定允许运行某一应用程序,则该应用程序可以启动。但是,如果确定不允许运行某一应用程序,则会阻止该应用程序并向用户发出通知。例如,如果您尝试从“开始”菜单运行 Solitaire,但该应用程序不允许运行,则您会收到一个对话框,如图 1 所示。

图 1 应用程序被阻止时出现一个对话框

图 1** 应用程序被阻止时出现一个对话框 **(单击该图像获得较大视图)

组策略对象编辑器 (GPOE) 中将显示用于定义软件限制策略的用户界面,可在其中编写锁定策略。可使用多种方法来定义可以(和无法)运行的代码。完成并测试策略后,即可对其进行部署。

定义软件限制策略

第一个要做的重大决策是选择默认规则类型,该决策将显著影响软件限制策略在您的环境中的运行方式。部署软件限制策略可以采用以下两种模式之一:允许列表或拒绝列表。实际上,您需要选择是希望创建描述允许在您的环境中运行的各个应用程序的策略,还是创建用于定义无法运行的各个应用程序的策略。

在“允许列表”模式中,策略中的默认规则是“受限制”,将阻止所有未显式允许运行的应用程序。在“拒绝列表”模式中,默认规则是“不受限制”,将仅限制您已显式列出的应用程序。

您可能会猜到,如果希望通过应用程序锁定来大幅降低总体拥有成本并提高安全性效果,使用“拒绝列表”模式是不切实际的。创建能够阻止所有恶意软件及其他存在问题的应用程序的广泛列表并进行维护几乎不可能实现;因此,我们建议以“允许列表”模式实施软件限制策略,即采用默认规则“受限制”。

清点环境中的应用程序

如果打算设计一个指定可以运行的应用程序的策略,则您需要准确确定用户需要哪些应用程序。软件限制策略功能通过一个非常简单的策略提供了一项高级日志记录功能,以便确切了解您的环境中正在运行哪些应用程序。

在您环境中的一组示例计算机上,部署默认规则设置为“不受限制”的软件限制策略并确保删除所有其他规则。将启动软件限制策略,但不允许它限制应用程序,而是仅用它来监视正在运行的应用程序。

接下来,创建以下注册表值,以便启用高级日志记录功能,并设置写入日志文件的路径:

"HKLM\SOFTWARE\Policies\Microsoft\Windows\Safer\
CodeIdentifiers"
String Value: LogFileName, <path to a log file>

现在,当运行应用程序和评估软件限制策略(即使它允许运行所有应用程序,也会对其进行评估)时,将在日志文件中写入一个条目。

每个日志条目都包括软件限制策略的调用方、调用进程的进程 ID (PID)、评估目标、选用的软件限制策略规则的类型以及规则标识符。以下是用户双击 notepad.exe 时写入的条目示例:

explorer.exe (PID = 3268) identified
C:\Windows\system32\notepad.exe as Unrestricted using
path rule, Guid =
{191cd7fa-f240-4a17-8986-94d480a6c8ca}

此日志文件提供了启用软件限制策略并将其设置为阻止应用程序时,将检查的所有可执行代码。也就是说,您必须确定允许列表中是否要包括日志文件中的所有条目。请注意,您会看到几个正在检查的二进制文件,这些文件是 Windows® 的一部分,同时也是系统运行的必需文件。

我们在此介绍的日志记录技术为您提供了一种简便方法,使您能够确切了解软件限制策略将在您的环境中遇到哪些应用程序。但它并不是完成此项任务的唯一方法。

Inventory Collector 是 Microsoft® 应用程序兼容性工具包 5.0 的一部分,可使您能够清点环境中正在使用的应用程序。此工具为您提供了多种不同的方法来了解环境中安装了哪些应用程序,并可将结果合并到中心数据库中。

编写其他规则

现在,您拥有一个您的环境中必须允许运行的应用程序列表,并且已准备好创建允许这些应用程序运行的实际规则。软件限制策略功能使用两种方式来标识策略:一种方式基于应用程序的加密属性(如,它的哈希);另一种方式可定义受信任的路径或受信任应用程序所在的文件夹。

图 2 显示了添加规则的位置,这些规则允许应用程序在 GPOE (gpedit.msc) 的“软件限制策略”节点中运行。在您的环境中定义应用程序的最简单方法是,为在日志记录过程中遇到的每个二进制文件创建哈希规则。

图 2 使用 gpedit.msc 编写软件限制策略

图 2** 使用 gpedit.msc 编写软件限制策略 **(单击该图像获得较大视图)

由于一组特定位返回的哈希值是唯一的,因此策略中每个二进制文件的哈希值将各不相同。此方法非常安全,并且将仅允许运行策略中特定的二进制文件。

当然,此方法也存在一些美中不足之处。例如,您的环境很可能包含数千个二进制文件。在软件限制策略用户界面中编写所有这些规则非常困难,并且由于规则数目庞大,还可能会影响性能。此外,更新环境中的每个应用程序都需要在该环境中部署一个或多个新的哈希规则。更新应用程序时更新如此大的策略,可能会造成巨大的负担。

幸运的是,可以通过其他两种标识规则的方法来避免此项负担,以便更加轻松地在您的环境中使用软件限制策略。通过深入研究加密安全路由,您可以创建一个规则来允许运行由特定证书签名的任何二进制文件。

执行这一操作有助于简化策略列表维护,因为更新某一应用程序后,新的二进制文件通常将由先前二进制文件签名的同一证书签名。不过,如果您不希望在您的环境中运行先前版本的二进制文件,可以添加一个“受限制”哈希规则来阻止允许文件运行。

默认情况下,软件限制策略将禁用证书规则评估。必须禁用证书规则评估有两个原因。

第一个原因是,软件限制策略中的证书规则由系统的“受信任的发行者”存储所包含的内容定义。因为“受信任的发行者”存储不仅用于软件限制策略规则,还有许多其他用途,因此在用于软件限制策略功能时需要花费更多时间,并且需要考虑其他注意事项。

第二个原因是,为了确定文件签名是否有效,您必须获得该文件的哈希并将其与签名信息比较。对文件进行哈希处理成本很高 - 必须从磁盘上读取整个文件并对其进行处理以计算此哈希。

为了启用证书规则,请导航至“软件限制策略”节点并在结果窗格中选择“实施对象”。然后,双击以打开其属性对话框并选中实施证书规则单选选项。

标识代码的其他常用方法是使用本地计算机上的代码路径。这项技术非常实际且相当有效,但它有一个缺点 — 必须非常谨慎才能确保正确设置该文件夹的安全设置。

如果添加了特定的路径规则,并且此路径允许用户在该位置写入文件(例如,写入到桌面),则通过在该文件夹中放入可执行文件,即可执行用户希望执行的任何操作。但是,如果您的用户不是 Administrators 组成员,则通常无法修改“程序文件”或 Windows 目录中的任何内容。也就是说,如果您所有的应用程序都位于“程序文件”目录且您的用户不是 Administrators 组成员,则应该查看路径规则以编写一个非常简单且有效的策略。

路径规则提供了部分其他功能,以使其更适用于某些环境。它允许使用通配符并允许您使用环境变量,以便更轻松地定义适用于您的环境的规则 — 毕竟,对于每个用户来说,%systemdrive% 并不一定都是 c:\。

就性能和维护方面而言,这很可能是最简单的代码标识方法。路径规则确实是值得考虑的一方面,但还需要注意其他安全事项。

网络区域规则

软件限制策略还包括一种名为网络区域规则的规则类型,尽管此类型的规则正逐渐被淘汰。这些规则的初始意图基于以下构想:如果特定可执行代码的源代码可识别并且受信任,则允许该代码运行。遗憾的是,这项任务非常难以实现,并且效果也不尽人意。目前,软件限制策略入口点的大部分位置都没有实施此类规则。

如果大多数应用程序都安装在 %Program Files% 目录,但有一些其他可执行文件安装到了其他位置并已使用特定证书进行签名,则可以使用不同类型的规则。使用一些哈希规则和一些路径规则,您会发现它们非常适合自己的策略。

请记住,规则按顺序进行处理(如图 3 所示)。证书规则最具体,哈希规则次之,之后是路径规则,最后是包含通配符的路径规则。因此,如果一段代码同时由哈希规则和路径规则标识,则哈希规则的安全级别较优先。

图 3 规则处理顺序

图 3** 规则处理顺序 **(单击该图像获得较大视图)

策略实施

软件限制策略功能对目标系统提供了广泛的保护。也就是说,应将可在其中执行代码的位置范围与软件限制策略集成起来;同样,也应检查该策略以确定是否允许运行可执行代码。

虽然可在多处检查软件限制策略,但最直接的入口点是 CreateProcess。在 CreateProcess 中,对策略进行检查以确定是否允许执行代表该应用程序的二进制文件。此项策略检查由 SaferIdentifyLevel API 完成,这在公开的资料中有说明。图 4 中描述了常规过程。(稍后,我们将更加详细地讨论 SaferIdentifyLevel。)

图 4 使用 SaferIdentifyLevel 确定二进制文件是否可执行

图 4** 使用 SaferIdentifyLevel 确定二进制文件是否可执行 **(单击该图像获得较大视图)

ShellExecute 也是实施软件限制策略最常用的 API 之一,仅次于 CreateProcess。当用户单击“开始”菜单中的某一应用程序或双击桌面某处时,将调用此 API。

可对多种不同格式的文件调用 ShellExecute。例如,对 .txt 文件调用 ShellExecute 实际上并不会导致执行该文件。当然,从技术上讲,确实打开了该文件。为此,软件限制策略包含一个可执行文件类型的列表,以便控制调用 ShellExecute 时要检查的文件类型。在软件限制策略用户界面中,可自定义此可执行文件类型列表。

除 CreateProcess 和 ShellExecute 之外,还有两个其他关键集成点:LoadLibrary 和脚本宿主。很显然,LoadLibrary 是检查可执行代码的一个重要位置,但遗憾的是,LoadLibrary 存在一些特殊约束。

大多数应用程序包含一个可执行文件和多个加载的 DLL,并且系统上通常会运行许多应用程序。这就意味着 LoadLibrary 将需要检查大量策略。根据您用于标识代码的策略,这个入口点的实施成本可能非常昂贵 — 想象一下,检查系统上加载的每个 DLL 的哈希,包括对二进制文件进行哈希处理,然后将其与列表上可能成千上万个哈希比较。

默认情况下,此功能处于禁用状态,但可以手动启用它。要执行此操作,请导航至 gpedit.msc 中的“软件限制策略”节点,并双击“实施”。然后,选择“所有软件文件”单选按钮。

我们在前文中提到过,软件限制策略已与系统中的大多数脚本宿主集成,其中包括 cmd、VBScript、Cscript 和 JScript®。这些入口点以及其他入口点均使用主软件限制策略实施 API:SaferIdentifyLevel。

SaferIdentifyLevel API 通过查看相关软件限制策略中的标识信息,来确定是否应允许运行指定的可执行文件。这是公开记录的 API。第三方脚本宿主和可执行环境可以并应该使用该 API 与软件限制策略实现集成,以便该策略能够确定是否应允许运行可执行代码。

以标准用户身份运行

软件限制策略还可以在某些应用程序启动时筛选它们的权限,但这一功能鲜为人知。在 Windows XP 中已引入此功能,但直到 Windows Vista,才在软件限制策略用户界面中予以显示。

从这方面讲,它可谓是 Windows Vista UAC 的先驱者,因为即使该用户是 Administrators 组的成员,您也可以通过此功能以标准用户身份运行应用程序。当您创建一个规则,然后在其他规则用户界面中将其安全级别设置为“普通用户”时,就会发生这种情况。

UAC 的令牌筛选功能和软件限制策略的正常用户均使用底层 API,该 API 可与 CreateRestrictedToken API 实现相同的行为。不过,整体架构在技术方面相差悬殊。UAC 与软件限制策略存在以下几个主要区别。

首先,在启用了 UAC 的 Windows Vista 中,默认情况下每个应用程序都使用类似于 Users 组成员的安全令牌启动,即使该用户是 Administrator。这可以通过软件限制策略实现,但无法以用户的实际 Administrator 令牌来启动应用程序。例如,当用户需要安装应用程序时。UAC 的主要优点是可以更改默认安全上下文,以及可轻松访问用户的完整管理员令牌。

第二个区别在于,以可执行文件为例,代码本身可提供正常运行所需的权限级别。这是一项重要区别,因为独立软件供应商 (ISV) 和开发人员都了解其代码的需求。例如,如果控制面板应用程序需要编辑某些需要管理员权限的内容,它可以在其指令清单中指定该项需求。因此,ISV 可以描述应用程序所需的权限,而不能将某一权限级别强加给它以致无法更改此级别。

目前来说,除非您确实了解正常用户规则的运行方式,否则最好避免使用它。UAC 是帮助将台式计算机用户移出 Administrators 组的很好方法,但您应认真考虑是否仅在企业环境中保留 UAC。

当今使用的软件限制策略

使用软件限制策略时,还应考虑许多可变因素。但与您想象的并不完全相同,事实上,您可能现已在使用软件限制策略,而自己却没有意识到。例如,如果您在 Windows Vista 系统上运行“家长控制”,则此时您就是在使用软件限制策略控制应用程序的执行。

当软件限制策略最初被引入 Windows XP 中时,它可谓是一项重要的技术开发,而应用程序锁定却是此时才开始受到 IT 专业人员关注。

Windows Vista 中的软件限制策略功能仍有一些方面需要改进,但很清楚的是,管理员希望能够借此增强对其环境中所运行的应用程序的控制。对于我们所有人而言幸运的是,此项技术将会不断改进,并使 IT 专业人员能够更轻松地管理他们的系统并降低运行 Microsoft Windows 环境的成本。

基本软件限制策略

软件限制策略的一种应用是创建将 Windows 锁定到展台模式的策略。Microsoft 实际上推出了一个名为 SteadyState™ 的工具包,用于创建此展台。不过,如果您只是想锁定可以运行的应用程序,则可以很轻松地实现。

要只允许少量必需的应用程序登录到 Windows Vista,请创建允许从 %windir%\system32 运行 logonui.exe 和 userinit.exe 的策略。大多数用户可能还需要允许下列应用程序运行:

dllhost.exe, rundll32.exe, control.exe (also under %windir%\system32)....

如果需要使用默认的 Windows 外壳,则可能还需要添加 %windir%\explorer.exe。

或者,您可以选择直接开机进入应用程序,如 Internet Explorer ®。在这种情况下,有必要列出 iexplore.exe 而不是 explorer.exe。

这种基本策略的另一方面是,您的用户不应位于 Administrators 组。这点很重要,如此一来,他们就无法跳过此策略。不过,由于用户只能执行一组非常基本的应用程序,而且没有 Administrator 的权限,所以他们将无权安装应用程序或维护系统。

对于这些计算机,您需要使用其他方式完成上述操作。如果您打算使用 Administrator 帐户本地登录来更新和维护这些计算机,则应选择将软件限制策略应用到所有用户(本地管理员除外)的单选按钮。该策略还应包括 consent.exe 和 cmd.exe。这将允许 Administrator 从 Administrator 命令提示符下启动任何管理选项。

请注意,UAC 在默认情况下会限制用户的安全令牌权限,以致使其看起来不像是 Administrators 组成员的令牌。即使您将上述设置设为不将策略应用于 Administrators,它还是会应用于用户。只有亲身经历了 UAC 提升体验,Administrators 才会真正获得完整的管理员权限,也才不会应用软件限制策略。

Chris CorioChris Corio 曾在 Microsoft 的 Windows 安全团队工作过五年多。他在 Microsoft 主要负责开发应用程序安全技术和管理技术以确保 Windows 安全。您可通过 winsecurity@chriscorio.com 与 Chris 联系。

Durga Prasad SayanaDurga Prasad Sayana 是 Windows 核心安全团队的软件设计工程师兼软件测试工程师。他主要关注安全技术和软件测试。您可通过 durgas@microsoft.com 与 Durga 联系。

© 2008 Microsoft Corporation 和 CMP Media, LLC。保留所有权利;未经允许不得复制本文的部分或全部内容.