Notification Services 的安全注意事项
Notification Services 使用数据库角色和受限制的数据库用户帐户实现安全性。本主题说明了通知安全模型以及用于提高 Notification Services 应用程序的安全性的建议做法。
Notification Services 安全模型
Notification Services 具有一个运行宿主事件提供程序、生成器和分发服务器的引擎。它还具有提交事件或管理订阅的客户端应用程序。
引擎和客户端应用程序使用的登录帐户使用 Windows 身份验证或 SQL Server 身份验证来访问 SQL Server;它们通过数据库用户帐户获得数据库访问权限,然后通过 Notification Services 数据库角色中的成员身份获得对实例和应用程序数据库的必要权限。
下面的内容说明了为每个引擎组件、非宿主事件提供程序以及订阅管理界面提供所需权限的数据库角色。
数据库权限分配给数据库角色。各个组件的数据库用户通过正确角色中的成员身份获得所需的权限:
- 事件提供程序使用的帐户通过 NSEventProvider 数据库角色中的成员身份获得权限。事件提供程序宿主运行宿主事件提供程序。非宿主事件提供程序是独立的应用程序。
- 生成器使用的帐户通过 NSGenerator 数据库角色中的成员身份获得权限。
- 分发服务器使用的帐户通过 NSDistributor 数据库角色中的成员身份获得权限。
- 订阅管理界面使用的帐户通过 NSSubscriberAdmin 数据库角色中的成员身份获得权限。
如果引擎运行宿主事件提供程序、生成器和分发服务器,则其帐户可以通过 NSRunService 数据库角色获得所有必需权限。
有关实现 Notification Services 的安全性的信息,请参阅保护 Notification Services 的安全。
条件操作的其他帐户
在 Microsoft SQL Server 2005 中,Notification Services 具有新的订阅规则特性。事件驱动的规则和预定的规则现在可以使用条件操作,这样可使订阅方使用用户定义查询子句定义更丰富的订阅。
因为基于条件操作的订阅允许使用用户定义查询子句,所以应限制可用于查询的数据。出于这一原因,您必须定义运行条件操作的数据库用户。应该只允许数据库用户查询包含输入数据的表和视图。
生成器触发包含条件操作的规则。不过,条件操作查询被指定的数据库用户进一步约束。您在定义 Notification Services 应用程序时指定数据库用户。
有关条件操作的详细信息,请参阅定义条件操作。
Windows 权限
除了数据库权限,某些组件还需要其他的 Windows 权限:
- 用于运行 Notification Services 引擎的帐户必须是 SQLServer2005NotificationServicesUser$ComputerName Windows 组的成员。这样便可提供对用于运行服务的 Notification Services 二进制文件的访问权限。如果使用 NS$instanceName Windows 服务运行引擎,则 Notification Services 会在注册实例时将服务帐户添加到 SQLServer2005NotificationServicesUser$ComputerName 组中。
任何需要访问 Notification Services 二进制文件的任何其他组件,也需要具有 SQLServer2005NotificationServicesUser$ComputerName 组的成员身份。Notification Services 程序集和资源位于全局程序集缓存 (GAC) 中,不需要上述组成员身份也可以访问这些程序集和资源。 - 有时,事件提供程序需要对文件夹和其他数据库的权限。例如,文件系统观察器事件提供程序需要对描述事件架构的 XML 架构定义 (XSD) 文件的读取权限,以及对放置事件文件的文件夹的读取权限和修改权限。SQL Server 事件提供程序需要对用作事件源的数据库表或视图的访问权限。
- 分发服务器需要将通知传递到传递服务(如简单邮件传输协议 (SMTP) 服务器、短消息服务 (SMS)、Web 服务器或文件系统)的权限。使用 XSL 转换 (XSLT) 内容格式化程序的分发服务器还需要对 XSLT 文件的访问权限。
安全建议
以下部分的内容提供了保护 Notification Services 引擎、订阅管理界面、自定义事件提供程序、自定义传递协议和其他自定义应用程序的建议。
Notification Services 引擎
当您部署 Notification Services 实例时,请考虑以下针对 Notification Services 引擎的安全建议:
- 将引擎配置为使用 Windows 身份验证进行数据库访问。
- 使用低特权域或本地帐户运行引擎。不要使用本地系统、本地服务或网络服务帐户,也不要使用 Administrators 组中的任何帐户。
不过,传递协议可能需要运行服务的帐户具有其他特权。例如,如果您使用本地 Internet 信息服务 (IIS) SMTP 服务发送通知,则运行引擎的帐户必须是本地 Administrators 组的成员。(通过远程计算机上的 SMTP 服务发送通知时,不需要具有管理员特权。) - 部署 Notification Services 实例时,请确保每个引擎只具有必要的权限。
对于单台服务器,引擎运行实例的所有宿主事件提供程序、生成器和分发服务器。引擎使用的帐户应该通过 NSRunService 数据库角色中的成员身份获得所需的数据库权限。
对于向外扩展的部署,请限制各个引擎的权限。例如,如果引擎只运行事件提供程序,则应采用以下方式限制对该引擎帐户授予的数据库权限:使帐户成为 NSEventProvider 数据库角色的成员,但是并不对其授予其他数据库或服务器的权限。不要使用 NSRunService 角色,除非引擎运行所有引擎组件。注意: 通过在定义应用程序时为每个宿主事件提供程序、生成器和分发服务器指定系统名称,可配置每个引擎运行的组件。 - 如果 Notification Services 引擎组件和 SQL Server 数据库引擎位于不同的服务器上,请确保为数据库引擎启用了 TCP/IP 或命名管道。为了有助于提高数据库引擎的安全性,默认情况下,大多数网络协议处于关闭状态。
- 确保登录帐户使用强密码。有关强密码的详细信息,请参阅 Microsoft Windows 文档中的“创建强密码”。
- 确保引擎运行的所有代码(例如,自定义事件提供程序、内容格式化程序和协议)来自受信任的源。Notification Services 假设实例配置和应用程序定义中列出的用于创建和更新 Notification Services 实例的代码来自受信任的源。定义应用程序时,使用完全限定程序集名称来确保加载正确的程序集。
- Notification Services 无法验证协议头字段。因此,如果您的应用程序使用订阅方、订阅方设备或协议字段中的订阅信息,则验证用户输入或使用应用程序定义值(不是用户定义值)。有关恶意用户数据的示例,请参阅 SQL 注入。
- 确保所有包含配置文件或应用程序数据的文件夹的安全性。有关保护文件和文件夹的安全的详细信息,请参阅保护文件和文件夹的安全。
承载 Notification Services 引擎
通常,Notification Services 引擎是在注册 Notification Services 实例时创建的 NS$instanceName Windows 服务。不过,您可以在自己的应用程序中承载引擎,而不是使用 Windows 服务。
引擎登录到数据库引擎并运行 Notification Services 实例。如果承载 Notification Services 引擎,请确保源文件和二进制文件的安全。
有关承载引擎的详细信息,请参阅宿主 Notification Services 引擎。
订阅管理界面
通过订阅管理界面,用户可以订阅通知应用程序并创建订阅。订阅管理界面通过 NSSubscriberAdmin 数据库角色中的成员身份获得对实例和应用程序数据库的数据库权限。
当您开发订阅管理界面时,请考虑以下安全建议:
- 在添加、删除或修改订阅方和订阅数据之前,请验证订阅方的标识,然后将该标识与订阅方 ID 进行匹配。
- 任何用户或应用程序,如果其帐户具有 NSSubscriberAdmin 数据库角色中的成员身份(或更高的有效权限),均可修改订阅方和订阅数据。不要授予不必要的权限,并保护订阅管理界面使用的用户名和密码。
- 不要以纯文本格式存储敏感信息,例如,用于应用程序的数据库连接的用户名和密码。使用数据保护应用程序编程接口 (DPAPI) 来加密敏感信息,然后将该信息存储在注册表中。
- 如果您的应用程序必须使用用户标识的敏感信息,如身份证号码,则您可能需要向用户提供非敏感的用户 ID,然后使用数据库中的查找表来匹配该敏感信息。
订阅管理界面通常是 Web 应用程序。有关 ASP.NET 应用程序安全选项的信息,请参阅部署订阅管理界面。
自定义事件提供程序
事件提供程序将事件数据提交到 Notification Services 应用程序。您可以为应用程序开发宿主的或者非宿主的自定义事件提供程序。当您开发自定义事件提供程序时,请考虑以下安全建议:
- 确保事件提供程序使用 NSEventProvider 数据库角色来提交事件。
- 任何用户或应用程序,只要具有有效事件提供程序名称并且其帐户在您的应用程序数据库中具有 NSEventProvider 数据库角色中的成员身份(或者其帐户具有更高的有效权限),均可提交事件。不要授予不必要的权限,保护非宿主事件提供程序使用的用户名和密码。
- 不要以纯文本格式存储敏感信息,例如,用户名和密码。使用 DPAPI 加密敏感信息,然后将该信息存储在注册表中。
- 确保所有自定义组件源文件和二进制文件的安全。
自定义宿主事件提供程序在事件提供程序宿主的上下文中提交事件;您无需在宿主事件提供程序代码中提供任何安全凭据来提交事件。以下建议尤其适用于宿主事件提供程序:
- 创建应用程序时,在应用程序定义中提供有关自定义宿主事件提供程序的信息。Notification Services 信任应用程序定义中的所有信息。使用完全限定程序集名称来确保加载正确的程序集。
非宿主事件提供程序运行在 Notification Services 应用程序的上下文之外。以下建议尤其适用于非宿主事件提供程序:
- 非宿主事件提供程序不被 Notification Services 显式信任。您必须在非宿主事件提供程序代码中提供安全凭据。指定的帐户必须能登录到数据库引擎实例,且相关联的数据库用户帐户必须是每个实例和应用程序数据库中的 NSEventProvider 数据库角色的成员。
自定义传递协议
自定义传递协议运行在 Notification Services 引擎的上下文中。与所有自定义组件的情况一样,请确保您的源文件和二进制文件的安全,以保护任何敏感信息。
Notification Services 管理对象
如果您使用 Notification Services 管理对象 (NMO) 来配置 Notification Services 实例,定义应用程序或开发管理应用程序,请确保源文件和二进制文件的安全。包含实例和应用程序数据库的文件可以包含诸如服务器名称、用户名和密码这样的敏感信息。
有关实例和应用程序元数据以及其他文件的详细信息,请参阅保护文件和文件夹的安全。
请参阅
概念
其他资源
SQL Server 安全注意事项
部署 Notification Services