Windows Server XP Service Pack 2(SP2)和 Windows Server 2003 Service Pack 1(SP1)引入了分布式组件对象模型(DCOM)的增强的默认安全设置。 具体而言,它们引入了更精细的权限,使管理员能够独立控制启动、激活和访问 COM 服务器的本地和远程权限。
DCOM 的作用是什么?
Microsoft组件对象模型(COM)是一个独立于平台的分布式面向对象的系统,用于创建可交互的二进制软件组件。 分布式组件对象模型(DCOM)允许应用程序分布在对你和应用程序最有意义的位置。 DCOM 线路协议透明地为 COM 组件之间的可靠、安全且高效的通信提供支持。
此功能适用于谁?
如果仅对进程内 COM 组件使用 COM,则此功能不适用于你。
如果 COM 服务器应用程序满足以下条件之一,则此功能适用于你:
- 应用程序的访问权限比启动权限更严格,这是运行应用程序所必需的。
- 应用程序通常由远程 COM 客户端激活,而无需使用管理帐户。
- 应用程序仅用于本地使用。 这意味着可以限制 COM 服务器应用程序,使其不可远程访问。
Windows XP Service Pack 2 和 Windows Server 2003 Service Pack 1 中向此功能添加了哪些新功能?
计算机范围限制
COM 中已进行更改,以提供计算机范围的访问控制,用于控制对计算机上的所有呼叫、激活或启动请求的访问。 考虑这些访问控制的最简单方法是,作为对计算机范围的访问控制列表(ACL)进行的其他 AccessCheck 调用(ACL),每次调用、激活或在计算机上启动任何 COM 服务器。 如果 AccessCheck 失败,将拒绝调用、激活或启动请求。 这除了针对特定于服务器的 ACL 运行的任何 AccessCheck 之外。 实际上,它提供必须传递的最低授权标准才能访问计算机上的任何 COM 服务器。 有一个计算机范围的 ACL 用于启动权限,用于涵盖激活和启动权限,以及用于访问权限的计算机范围的 ACL,以涵盖呼叫权限。 这些可以通过组件服务Microsoft管理控制台(MMC)进行配置。
这些计算机范围的 ACL 提供了一种通过 CoInitializeSecurity 或特定于应用程序的安全设置替代特定应用程序指定的弱安全设置的方法。 这提供了必须传递的最低安全标准,而不考虑特定服务器的设置。
当访问 RPCSS 公开的接口时,将检查这些 ACL。 这提供了一种方法来控制对此系统服务的访问。
这些 ACL 提供了一个集中位置,管理员可以设置适用于计算机上的所有 COM 服务器的常规授权策略。
注意
更改计算机范围的安全设置将影响所有 COM 服务器应用程序,并可能阻止它们正常工作。 如果 COM 服务器应用程序具有比计算机范围限制更严格的限制,则减少计算机范围的限制可能会使这些应用程序暴露为不需要的访问。 相反,如果增加计算机范围的限制,某些 COM 服务器应用程序可能无法再通过调用应用程序来访问。
默认情况下,Windows XP SP2 计算机限制设置为:
许可 | 管理员 | 每个人 都 | 匿名 |
---|---|---|---|
发射 |
本地启动 本地激活 远程启动 远程激活 |
本地启动 本地激活 |
|
访问 |
本地访问 远程访问 |
本地访问 |
默认情况下,Windows Server 2003 SP 1 计算机限制设置如下所示。
许可 | 管理员 | 分布式 COM 用户(内置组) | 每个人 都 | 匿名 |
---|---|---|---|---|
发射 |
本地启动 本地激活 远程启动 远程激活 |
本地启动 本地激活 远程启动 远程激活 |
本地启动 本地激活 |
N/A |
访问 |
N/A |
本地访问 远程访问 |
本地访问 远程访问 |
本地访问 远程访问 |
注意
分布式 COM 用户是 Windows Server 2003 SP1 附带的新内置组,可加快将用户添加到 DCOM 计算机限制设置的过程。 此组是 MachineAccessRestriction 和 MachineLaunchRestriction 设置使用的 ACL 的一部分,因此从此组中删除用户会影响这些设置。
为什么此更改很重要? 它有助于缓解哪些威胁?
许多 COM 应用程序包括一些特定于安全的代码(例如,调用 CoInitializeSecurity),但使用弱设置,通常允许未经身份验证地访问进程。 管理员目前无法替代这些设置,以在早期版本的 Windows 中强制增强安全性。
COM 基础结构包括 RPCSS,一个系统服务,在系统启动期间运行,始终在系统启动之后运行。 它管理 COM 对象的激活和正在运行的对象表,并为 DCOM 远程处理提供帮助程序服务。 它公开可远程调用的 RPC 接口。 由于某些 COM 服务器允许未经身份验证的远程访问,因此任何人都可以调用这些接口,包括未经身份验证的用户。 因此,远程未经身份验证的计算机上的恶意用户可能会攻击 RPCSS。
在早期版本的 Windows 中,管理员无法了解计算机上的 COM 服务器的公开级别。 管理员通过系统地检查计算机上所有已注册 COM 应用程序的配置安全设置来了解暴露级别,但是,鉴于 Windows 的默认安装中约有 150 个 COM 服务器,该任务令人生畏。 没有办法查看包含软件安全性的服务器的设置,而无需查看该软件的源代码。
DCOM 计算机范围的限制可缓解这三个问题。 它还使管理员能够禁用传入的 DCOM 激活、启动和调用。
哪些工作方式不同?
默认情况下,“每个人”组被授予本地启动、本地激活和本地访问调用权限。 这样,所有本地方案都可以在不修改软件或作系统的情况下工作。
默认情况下,在 Windows XP SP2 中,“每个人”组被授予远程访问呼叫权限。 在 Windows Server 2003 SP1 中,“每个人”和“匿名”组都被授予远程访问权限。 这可实现大多数 COM 客户端方案,包括 COM 客户端向远程服务器传递本地引用的常见情况,实际上会将客户端转换为服务器。 在 Windows XP SP2 中,这可能禁用需要未经身份验证的远程访问调用的方案。
此外,默认情况下,仅向管理员组的成员授予远程激活和启动权限。 这会禁用非管理员对已安装 COM 服务器的远程激活。
如何解决这些问题?
如果实现 COM 服务器并期望支持非管理 COM 客户端的远程激活,则应考虑与启用此过程相关的风险是可接受的,还是应将实现修改为不需要非管理 COM 客户端或远程未经身份验证的调用进行远程激活。
如果风险是可接受的,并且你想要通过非管理 COM 客户端或远程未经身份验证的调用启用远程激活,则必须更改此功能的默认配置。
注意
更改计算机范围的安全设置将影响所有 COM 服务器应用程序,并可能阻止它们正常工作。 如果 COM 服务器应用程序具有比计算机范围限制更严格的限制,则减少计算机范围的限制可能会将这些应用程序公开给不需要的访问。 相反,如果增加计算机范围的限制,某些 COM 服务器应用程序可能无法再通过调用应用程序来访问。
可以使用组件服务Microsoft管理控制台(MMC)或 Windows 注册表更改配置设置。
如果使用组件服务 MMC 管理单元,则可以在所管理计算机的“属性”对话框 COM 安全性 选项卡上配置这些设置。 访问权限 区域已修改,使除了 COM 服务器的标准默认设置之外,还可以设置计算机范围的限制。 此外,还可以在限制和默认值下为本地和远程访问提供单独的 ACL 设置。
在 启动和激活权限 区域中,可以控制本地和远程权限以及计算机范围的限制和默认值。 可以单独指定本地和远程激活和启动权限。
或者,可以使用注册表配置这些 ACL 设置。
这些 ACL 存储在注册表中的以下位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\MachineAccessRestriction=ACL
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\MachineLaunchRestriction=ACL
这些是类型REG_BINARY的命名值,其中包含描述可以访问计算机上的任何 COM 类或 COM 对象的主体 ACL 的数据。 ACL 中的访问权限包括:
COM_RIGHTS_EXECUTE 1
COM_RIGHTS_EXECUTE_LOCAL 2
COM_RIGHTS_EXECUTE_REMOTE 4
COM_RIGHTS_ACTIVATE_LOCAL 8
COM_RIGHTS_ACTIVATE_REMOTE 16
可以使用正常的安全功能创建这些 ACL。
注意
为了提供向后兼容性,ACL 可以存在于 Windows XP SP2 和 Windows Server 2003 SP1 之前使用的格式,该格式仅使用访问权限COM_RIGHTS_EXECUTE,也可以存在于 Windows XP SP2 和 Windows Server 2003 SP1 中使用的新格式中,该格式使用COM_RIGHTS_EXECUTE和COM_RIGHTS_EXECUTE_LOCAL的组合, COM_RIGHTS_EXECUTE_REMOTE、COM_RIGHTS_ACTIVATE_LOCAL和COM_RIGHTS_ACTIVATE_REMOTE。 请注意,COM_RIGHTS_EXECUTE>必须始终存在;缺少此权限将生成无效的安全描述符。 另请注意,不得在单个 ACL 中混合使用旧格式和新格式;所有访问控制项(ACE)必须仅授予COM_RIGHTS_EXECUTE访问权限,或者它们都必须授予COM_RIGHTS_EXECUTE以及COM_RIGHTS_EXECUTE_LOCAL、COM_RIGHTS_EXECUTE_REMOTE、COM_RIGHTS_ACTIVATE_LOCAL和COM_RIGHTS_ACTIVATE_REMOTE的组合。
注意
只有具有管理员权限的用户才能修改这些设置。
Windows XP Service Pack 2 和 Windows Server 2003 Service Pack 1 中的哪些现有功能正在更改?
RPCSS 作为网络服务运行
RPCSS 是 RPC 终结点映射器和 DCOM 基础结构的关键服务。 此服务在早期版本的 Windows 中作为本地系统运行。 为了减少 Windows 的攻击面并提供深度防御,RPCSS 服务功能被拆分为两个服务。 具有所有不需要本地系统特权的原始功能的 RPCSS 服务现在在网络服务帐户下运行。 新的 DCOMLaunch 服务,其中包含需要本地系统特权的功能在“本地系统”帐户下运行。
为什么此更改很重要?
此更改可减少攻击面,并为 RPCSS 服务提供深度防御,因为 RPCSS 服务中的特权提升现在仅限于网络服务特权。
哪些工作方式不同?
此更改对于用户而言应该是透明的,因为 RPCSS 和 DCOMLaunch 服务的组合等同于在早期版本的 Windows 中提供的以前的 RPCSS 服务。
更具体的 COM 权限
COM 服务器应用程序具有两种类型的权限:启动权限和访问权限。 启动权限控制授权,以在 COM 激活期间启动 COM 服务器(如果服务器尚未运行)。 这些权限定义为在注册表设置中指定的安全描述符。 访问权限控制调用正在运行的 COM 服务器的授权。 这些权限定义为通过 CoInitializeSecurity API 或使用注册表设置提供给 COM 基础结构的安全描述符。 启动和访问权限都允许或拒绝基于主体的访问,并且不区分调用方是服务器还是远程调用方。
第一项更改根据距离区分 COM 访问权限。 定义的两个距离是“本地”和“远程”。 本地 COM 消息通过本地远程过程调用(LRPC)协议到达,而远程 COM 消息通过远程过程调用(RPC)主机协议(例如传输控制协议(TCP)到达。
COM 激活是通过调用 CoCreateInstance 或其变体之一在客户端上获取 COM 接口代理的行为。 作为此激活过程的副作用,有时必须启动 COM 服务器才能满足客户端的请求。 启动权限 ACL 断言允许谁启动 COM 服务器。 访问权限 ACL 断言,一旦 COM 服务器已运行,允许激活 COM 对象或调用该对象。
第二个更改是调用和激活权限分开,以反映两个不同的作,并将激活权限从访问权限 ACL 移动到启动权限 ACL。 由于激活和启动都与获取接口指针相关,因此激活和启动访问权限在逻辑上属于一个 ACL。 而且,由于始终通过配置指定启动权限(与通常以编程方式指定的访问权限相比),因此在启动权限 ACL 中放置激活权限为管理员提供对激活的控制。
启动权限访问控制条目(ACE)分为四个访问权限:
- 本地启动 (LL)
- 远程启动 (RL)
- 本地激活 (LA)
- 远程激活 (RA)
访问权限安全描述符拆分为两种访问权限:
- 本地访问呼叫 (LC)
- 远程访问呼叫 (RC)
这允许管理员应用非常具体的安全配置。 例如,可以配置 COM 服务器,以便它接受来自每个人的本地访问呼叫,同时仅接受来自管理员的远程访问呼叫。 可以通过对 COM 权限安全描述符的更改来指定这些区别。
为什么此更改很重要? 它有助于缓解哪些威胁?
早期版本的 COM 服务器应用程序无法限制应用程序,因此它只能在本地使用,而无需通过 DCOM 在网络上公开应用程序。 当用户有权访问 COM 服务器应用程序时,他们有权访问本地和远程使用。
COM 服务器应用程序可能会向未经身份验证的用户公开自己以实现 COM 回调方案。 在此方案中,应用程序还必须将其激活公开给未经身份验证的用户,这可能不理想。
精确的 COM 权限使管理员能够灵活地控制计算机的 COM 权限策略。 这些权限为描述的方案启用安全性。
哪些工作方式不同? 是否存在任何依赖项?
为了提供向后兼容性,将解释现有的 COM 安全描述符,以同时允许或拒绝本地和远程访问。 也就是说,访问控制项(ACE)既允许本地又允许远程,要么拒绝本地和远程。
调用或启动权限没有向后兼容性问题。 但是,存在激活权限兼容性问题。 如果在 COM 服务器的现有安全描述符中,配置的启动权限比访问权限更严格,并且比客户端激活方案所需的限制性更严格,则必须修改启动权限 ACL 才能为授权客户端提供适当的激活权限。
对于使用默认安全设置的 COM 应用程序,没有兼容性问题。 对于使用 COM 激活动态启动的应用程序,大多数应用程序没有兼容性问题,因为启动权限必须已包含能够激活对象的任何人。 否则,即使在应用 Windows XP SP2 或 Windows Server 2003 SP1 之前,此类应用程序也会生成激活失败,当调用方没有启动权限的情况下尝试激活对象并且 COM 服务器尚未运行。
最关心兼容性问题的应用程序是已由某些其他机制(如 Windows 资源管理器或服务控制管理器)启动的 COM 应用程序。 还可以通过以前的 COM 激活来启动这些应用程序,该激活会替代默认访问和启动权限,并指定比调用权限更严格的启动权限。 有关解决此兼容性问题的更多详细信息,请参阅下一部分中的“如何解决这些问题?”
如果将升级到 Windows XP SP2 或 Windows Server 2003 SP1 的系统回滚到早期状态,则已编辑以允许本地访问、远程访问或同时进行访问的任何 ACE 解释为允许本地和远程访问。 编辑为拒绝本地访问、远程访问或同时拒绝两者的任何 ACE 都解释为拒绝本地访问和远程访问。 每当卸载 Service Pack 时,都应确保没有新设置的 ACE 导致应用程序停止工作。
如何解决这些问题?
如果实现 COM 服务器并覆盖默认安全设置,请确认特定于应用程序的启动权限 ACL 向相应用户授予激活权限。 如果没有,则必须更改应用程序特定的启动权限 ACL,以授予适当的用户激活权限,以便使用 DCOM 的应用程序和 Windows 组件不会失败。 这些特定于应用程序的启动权限存储在注册表中。
可以使用正常的安全功能创建或修改 COM ACL。
在 Windows XP Service Pack 2 中添加或更改了哪些设置?
谨慎
使用这些设置不当可能会导致使用 DCOM 的应用程序和 Windows 组件失败。
下表使用了这些缩写:
LL - 本地启动
LA - 本地激活
RL - 远程启动
RA - 远程激活
LC - 本地访问调用
RC - 远程访问调用
ACL - 访问控制列表
设置名称 | 位置 | 以前的默认值 | 默认值 | 可能的值 |
---|---|---|---|---|
MachineLaunchRestriction |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
每个人 - LL、LA、RL、RA 匿名- LL、LA、RL、RA (这是一个新的注册表项。根据现有行为,这些是有效值。 |
管理员:LL、LA、RL、RA |
ACL |
MachineAccessRestriction |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
每个人 - LC、RC 匿名 - LC、RC (这是一个新的注册表项。根据现有行为,这些是有效值。 |
每个人:LC、RC 匿名:LC |
ACL |
CallFailureLoggingLevel |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
不適用。 |
此注册表项不存在;但是,缺少的键或值被解释为 2。 默认情况下不会记录此事件。 如果将此值更改为 1 以开始记录此信息以帮助排查问题,请务必监视事件日志的大小,因为这是可以生成大量条目的事件。 |
1 - 在 COM 服务器进程中调用期间始终记录事件日志失败。 2 - 从不记录调用服务器进程中调用期间的事件日志失败。 |
InvalidSecurityDescriptorLoggingLevel |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
不適用。 |
此注册表项不存在;但是,缺少的键或值被解释为 1。 默认情况下会记录此事件。 它很少发生。 |
1 - 当 COM 基础结构找到无效的安全描述符时,始终记录事件日志失败。 2 - 当 COM 基础结构找到无效的安全描述符时,从不记录事件日志失败。 |
安全描述符定义语言 (SDDL) 语法中的 DCOM:计算机启动限制 |
(组策略对象)计算机配置 \Windows 设置\本地策略 \安全选项 |
不適用。 |
未定义 |
SDDL 格式的访问控制列表。 此策略的存在会替代以前 MachineLaunchRestriction 中的值。 |
安全描述符定义语言 (SDDL) 语法中的 DCOM:计算机访问限制 |
(组策略对象)计算机配置 \Windows 设置 \本地策略 \安全选项 |
不適用。 |
未定义 |
SDDL 格式的访问控制列表。 此策略的存在会替代以前 MachineAccessRestriction 中的值。 |
在 Windows Server 2003 Service Pack 1 中添加或更改了哪些设置?
注意
使用这些设置不当可能会导致使用 DCOM 的应用程序和 Windows 组件失败。
下表使用了这些缩写:
LL - 本地启动
LA - 本地激活
RL - 远程启动
RA - 远程激活
LC - 本地访问调用
RC - 远程访问调用
ACL - 访问控制列表
设置名称 | 位置 | 以前的默认值 | 默认值 | 可能的值 |
---|---|---|---|---|
MachineLaunchRestriction |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
每个人:LL、LA、RL、RA 匿名:LL、LA、RL、RA (这是一个新的注册表项。根据现有行为,这些是有效值。 |
管理员:LL、LA、RL、RA 每个人:LL、LA 分布式 COM 用户:LL、LA、RL、RA |
ACL |
MachineAccessRestriction |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
每个人:LC、RC 匿名:LC、RC (这是一个新的注册表项。根据现有行为,这些是有效值。 |
每个人:LC、RC 匿名:LC、RC |
ACL |
CallFailureLoggingLevel |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
不適用。 |
此注册表项不存在;但是,缺少的键或值被解释为 2。 默认情况下不会记录此事件。 如果将此值更改为 1 以开始记录此信息以帮助排查问题,请务必监视事件日志的大小,因为这是可以生成大量条目的事件。 |
1 - 当 COM 基础结构找到无效的安全描述符时,始终记录事件日志失败。 2 - 当 COM 基础结构找到无效的安全描述符时,从不记录事件日志失败。 |
InvalidSecurityDescriptorLoggingLevel |
HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Ole |
不適用。 |
此注册表项不存在;但是,缺少的键或值被解释为 1。 默认情况下会记录此事件。 它很少发生。 |
1 - 当 COM 基础结构发现无效的安全描述符时,始终记录事件日志失败。 2 - 当 COM 基础结构找到无效的安全描述符时,从不记录事件日志失败。 |
安全描述符定义语言 (SDDL) 语法中的 DCOM:计算机启动限制 |
(组策略对象)计算机配置 \Windows 设置 \本地策略 \安全选项 |
不適用。 |
未定义。 |
SDDL 格式的访问控制列表。 此策略的存在会替代以前 MachineLaunchRestriction 中的值。 |
安全描述符定义语言 (SDDL) 语法中的 DCOM:计算机访问限制 |
(组策略对象)计算机配置 \Windows 设置 \本地策略 \安全选项 |
不適用。 |
未定义。 |
SDDL 格式的访问控制列表。 此策略的存在会替代以前 MachineAccessRestriction 中的值。 |
相关主题
-
COM 中的 安全性