1.导言

  随着网络越来越多的连接到一起,安全就变得更为重要。必须保护你的公司的设备,特别是它的数据库,它包含了你公司的非常重要的信息。安全是一个数据库引擎的重要特性之一,它保护企业免受众多威胁。Microsoft? SQL Server? 2008的安全特性是设计用来使它更加安全并使得对于那些有责任保护数据安全的人们来说安全是触手可及和容易理解的。

  在过去的几年,人们已经对什么是基于计算机的系统的安全开发了一套非常成熟的理念。Microsoft 站在这个开发的最前沿,而SQL Server 是第一代完全贯彻了这个理念的服务器产品中的一个。它采用了最小权限的重要原则,所以你不需求为用户授予比他们执行他们的工作所需的更多的权限。它为防范提供了深入***工具,以便你可以实施措施来阻止最具技巧的***者。

  讨论了许多关于Microsoft指导公司里所有软件部署的可信赖计算计划(Trustworthy Computing initiative)。要获得更多的信息,请查看可信赖计算网站(http: //www.microsoft.com/mscorp/twc/default.mspx).

  这个计划的四个重要组成部分是:

  · 设计安全。软件需要一个安全的设计作为抵制***者和保护数据的基础。

  · 缺省安全。系统管理员应该不需要花费时间去做一个新的安装安全;它应该可以按缺省来完成。

  · 部署安全。软件应该帮助保持它自己的最新安全补丁包的更新和协助维护。

  · 通信。传达最佳方法和威胁信息,以便管理员可以预先保护他们的系统。

  在SQL Server 2008中体现了这些指导原则,它提供了你需要保护你的数据库所需的所有工具。

  这篇白皮书探讨了对于系统和数据库管理员来说最重要的安全特性。它从讲述SQL Server 2008是怎样简单而安全地进行安装和配置。它探讨了验证和授权特性,这些控制对服务器的访问和决定一个用户一旦通过了验证他可以做什么。它最后讲述了一个管理员所需要了解的数据库安全特性,以便能够为数据库和访问这些数据库的应用程序提供一个安全的环境。

  2.安全配置

  一个安全的SQL Server 安装的第一个要求就是要有一个安全的环境。一个运行SQL Server 2008的服务器的外部安全要求没有什么改变。你需要保护服务器和定时地备份数据,如果它连接到网络上那么将它放到一个或多个防火墙后面,避免在一个装有其它服务器应用程序的计算机上安装SQL Server,并只使用所要求的最少的网络协议。在一个Microsoft Windows Server? 2003或Microsoft Windows Server? 2008计算机上安装SQL Server,以便它可以充分利用操作系统级别的安全保护。进一步的,在一个或多个NTFS分区上的安装是最安全的。

  确保环境是安全的之后,安全地安装SQL Server 2008是极为重要的。这个安装过程执行所有常规的安全工作,并有一个System Configuration Checker 会通知你所有可能会引起问题的漏洞。安装SQL Server 2008默认情况下不使用所有的特性。而是安装核心关键的和广泛使用的特性。其它可能在生产环境中不需要的特性会被默认的关闭。你可以使用所支持的工具将你需要的特性打开。

  这是可信赖计算安全所默认的所有要求。它意味着SQL Server 2008在你安装的时候是安全的,默认设置也是安全的。一个基本的数据库服务器所不需要的特性没有被安装,旨在降低外围应用。因为按默认的情况下不是系统中所有的特性都可用,这在系统安装图象方面推出了一个异构。因为这样限制了具有易受潜在***的特性的系统的数目,所以它帮助防范大范围的***或是蠕虫。

  2.1 Windows更新

  你在企业中部署了SQL Server 之后就很容易发现新的威胁和漏洞。Windows 更新是设计用来确保及时下载可以显著减少特殊的安全问题的应用程序补丁包。你可以使用Windows 更新来自动地应用SQL Server 2008补丁包,从而减少由已知的软件漏洞所引起的威胁。在大多数企业环境中,你应该使用Windows Server Update Service (WSUS)来管理补丁包的发送和在整个企业中进行更新。

  2.2 外围应用配置

  SQL Server 2008具有许多特性,其中许多是以关闭状态安装的。例如,CLR集成、数据库镜像、调试、Service Broker 和邮件功能都安装了,但是没有运行也不可用,除非你明确地将它们打开或是配置它们。这个设计与SQL server所默认的安全中的外围应用范例的缩减是一致的,它导致降低了***外围应用。如果一个特性不可用或没有开启,那么一个***者是不能利用它的。

  要权衡的是,要跟踪所有开启特性的Transact-SQL语句是很耗时的。甚至当你发现sp_configure system存储过程做了许多你所需要的,但仍然需要编写非原有的代码,如下所示:


  有许多配置选项要花费时间来编写这种代码——特别是当你在企业中部署了多个SQL server实例的时候。SQL Server 2008包含一个基于政策的管理技术,叫做声明式管理框架(Declarative Management Framework,DMF)。DMF提供了一些配置分面,其中每一个都定义了一组相关的配置设置或属性。你可以使用这些分面来创建指定想要的配置选项的设置的条件,并将这些条件作为政策实施到企业中的SQL Server实例上。

  在SQL Server 2008中所包含的分面的其中之一是Surface Area 分面,你可以使用这个分面来定义一个控制许多SQL Server 2008特性的状态的政策。通过创建一个定义你想要的用于你的服务器的surface area设置的政策,你可以很容易地在你公司里的所有SQL Server实例上实施最小限度的surface area,并且可以降低恶意***的可能性。

  3. 验证

  Microsoft部署SQL Server 2000时是当数据和服务器要求保护但不需要抵挡如今在网络上所看到的***的时候。基本的验证问题仍然相同,“你是谁、你怎样证明?”但是SQL Server 2008提供更多强大的验证特性,它们提供了更好的支持,在服务器的安全防卫上让好人通过,把坏人阻挡在外。

  SQL Server 验证提供了对不是基于Windows的客户端或应用程序的验证,它使用一个简单的连接字符串,其中包含用户ID和密码。尽管这个登陆易于使用并在应用程序开发人员中很流行,但是它不像Windows 验证一样安全,是不建议使用的验证机制。

  SQL Server 2008改进了SQL Server验证的选项。首先,它支持默认情况下通过使用SQL产生的证书进行路线加密。管理员不需要获得和安装一个有效的SSL证书来确保SQL证书流程的路线是安全的。有了SQL Server 2008 自动生成这些证书,当传送登陆包时它在默认情况下自动加密路线。这发生在客户端是SQL Server 2005级别或以上的情况下。

  注意 当***者在网络上搜寻时,SQL Server产生的本地证书防止被动的中间人***。为了更有效地保护你的系统免受中间人***,你应该部署和使用客户端信任的证书。

  SQL Server 2008进一步地加强了SQL Server验证,因为默认情况下,在与Windows 2003 server或以上版本结合使用时,数据库引擎目前采用Windows Group Policy用于密码复杂度、密码期限和在SQL登陆中的账户锁定。这意味着你可以对你的SQL Server帐户实施Windows密码政策。

  3.1 实施密码政策

  对于SQL Server 2008,密码政策的实施是内嵌到服务器中的。使用NetValidatePasswordPolicy()API,它是Windows Server 2003上的NetAPI32 库的一部分,SQL Server 在验证期间和按照Windows对于密码强度、期限和帐户锁定的政策进行密码的设置和重置期间进行密码验证。表3列出了这个政策的组成部分。


  3.2 终端验证

  SQL Server 2008支持传统的用于客户端访问数据的二进制表格数据流(Tabular Data Stream),还支持本地的使用HTTP的XML Web service 访问。允许通过HTTP来访问的主要好处是了解Web service的任何客户端软件和开发工具都可以访问存储在SQL Server中的数据。这意味着SQL Server 2008可以提供独立的Web service 方法,并且是服务面向架构(SOA)中的一个完整的终端。

  使用SQL Server 2008作为一个Web service 主机需要两个常规步骤,每一个都有许多可能:定义存储过程和用户定义的提供了Web service方法的功能、定义一个通过HTTP接收方法调用和将它们发送到适合的过程中去的HTTP终端。这篇白皮书专注于相关的安全问题。要查看配置和使用HTTP终端的细节,请查看SQL Server在线书籍的CREATE ENDPOINT(Transact-SQL)。

  因为SQL Server 中的XML Web service使用HTTP和默认情况下的80端口,大多数防火墙允许它通过。然而,一个不受保护的终端对于***者来说是一个潜在的美味,你必须保护它,所以SQL Server 拥有强大的验证和授权能力。默认情况下,SQL Server 没有任何终端,你不得不具有一个高级别的权限来创建、修改和开启HTTP终端。

   SQL Server 2008提供了五个验证类型,和IIS用于网站验证所使用的类似。

  · 基本验证

  基本验证是HTTP 1.1协议的一部分,它将登陆凭证放在基于-64编码的文本中传输。这个凭证必须与一个Windows登陆相匹配,然后SQL Server 使用它来验证对数据库资源的访问。如果你使用基本验证,你不能将PORTS参数设置为CLEAR ,而是必须设置它为SSL,并使用一个SSL的数字证书来加密与客户端软件的通信。

  · 摘要验证

  摘要验证也是HTTP 1.1协议的一部分。它在发送给服务器之前使用MD5哈希了凭证以便它不能通过电线发送它们,甚至是以加密的形式。这个凭证必须匹配一个有效的Windows域帐户;你不能使用本地用户帐户。

  · NTLM验证

  NTLM使用一开始在Microsoft Windows NT?中推出的挑战响应协议,并在之后的所有的Windows客户端和服务器版本中获得支持。它在客户端和服务器都是Windows系统时提供了安全验证,并要求一个有效的域帐户。

  · Kerberos验证

  Kerberos验证在Windows 2000和之后的版本中有效,它基于一个在许多操作系统中可用的行业标准协议。它允许相互验证,其中客户端和服务器都会一定程度上确定另一个的验证,并提供一个非常安全的验证形式。为了在Windows Server 2003上使用Kerberos,你必须使用SetSPN.exe工具用Http.sys注册Kerberos服务主体名称(Service Principal Name,SPN),SetSPN.exe工具是Windows支持工具的一部分。

  · 集成验证

  集成验证提供了最好的NTLM和Kerberos 验证。服务器使用客户端所要求的这两个验证类型之一,允许客户端支持最安全的验证,同时使得服务可用于Windows的之前版本。你可以在Windows 2003中配置Http.sys以决定它应该使用哪个协议。

  这个用于终端的验证方法使用CREATE或ALTER ENDPOINT语句的AUTHENTICATION属性来设置。例如,下面的代码创建了一个使用Kerberos来验证的终端:


  SQL Server 2008支持监听HTTP和在TCP上的用户定义的端口的终端。你还可以使用许多格式来格式化请求:SOAP、Transact-SQL 、专用于Service Broker 的格式、和另一个用于数据库镜像的格式。当使用SOAP时,你可以利用Web服务安全性(WS-Security)头来验证SQL Server 登陆。

  Microsoft 实行Web Service 终端验证来支持极广泛的协议和规格,本篇白皮书描述了其中的一部分。你将需要打开你的验证选项并确保客户端可以提供所需的凭证类型。一旦SQL Server 验证通过了客户端,你就可以授予这个登陆被授权可以访问的资源,如下一节所描述的。

  4. 授权

  在验证之后,该考虑验证过的登陆可以做些什么了。在这个领域,SQL Server 2008和SQL Server 2005比之前的版本更加灵活。现在的权限更加细粒度了,因此你可以授予所要求的专门的权限,而不是授权给具有一个固定角色的成员,这很可能会承载比它所需的权限更多的权限。你现在具有更多的要保护的实体,你可以对它们分配更细粒度的权限。

  除了加强用户数据的保护,关于一个细粒度的要保护的结构信息和元数据现在只可用于具有权限访问这要保护的信息的主体。

  此完,还可以使用一个机制创建定制权限集合,这个机制允许一个人定义安全上下文,存储过程可以运行在这个上下文之下。

  此外,SQL Agent 使用灵活的代理scheme 来允许工作步骤运行和访问所要求的资源。所有这些特性使得SQL Server更加复杂但是更加安全。

  4.1 细粒度权限

  SQL Server 2008和SQL Server 2005在许多方面比之前的版本更加安全,其中之一就是改进的细粒度权限。之前,一个管理员需要给一个在固定的服务器角色或固定的数据库角色中的用户成员授予权限,以执行特定的操作,但是通常情况是,这些角色具有比执行这些简单工作所需的权限多很多的权限。这个最小权限的原则要求一个用户只有要做这个工作的最少的权限,所以分配给用户广泛的角色以执行很少的工作违反了这个原则。

  固定服务器和数据库角色的集合从SQL Server 2000以来没有怎么改变,所以你仍然可以在用户或应用程序要求所有或大部分定义的权限时利用这些预定义的权限集。可能最大的改变就是添加了一个 public服务器角色。然而,最小权限的原则要求你不使用一个不是正好适用于这个原则做这个工作所需要的角色。尽管它要求更多的工作来发现和指派某原则所需的权限,但是它可以生成一个更加安全的数据库环境。

  4.2 主体和可得到的

  在SQL Server 2008中,一个主体是任何单独的、可以要求访问受保护的资源并可被授予权限来访问它的个体、组或过程。在SQL Server的之前版本中,你可以定义一个Windows中的主体或者你将它基于一个SQL Server登陆而不和Windows主体关联。下面的列表显示了SQL Server 2008主体的层次,不包括固定服务器和数据库角色,以及你可以怎样匹配登陆和数据库用户来保护对象。这个主体的影响范围取决于它的定义的范围,因此一个 Windows级别的主体比一个SQL Server级别的主体范围更广。每一个数据库用户会自动地属于固定的公共(public)角色。

  Windows级别主体

  · Windows域登陆

  · Windows本地登陆

  · Windows组

  SQL Server级别主体

  · SQL Server登陆

  · 与一个Windows 登陆相匹配的SQL Server登陆

  · 与一个证书相匹配的SQL Server登陆

  · 与一个非对称密钥相匹配的SQL Server登陆

  数据库级别的主体

  · 数据库用户

  · 与一个SQL Server登陆相匹配的数据库用户

  · 与一个Windows 登陆相匹配的数据库用户

  · 与一个证书相匹配的数据库用户

  · 与一个非对称密钥相匹配的数据库用户

  · 数据库角色

  · 应用程序角色

  · 公共角色

  授权的另一个部分是你可以通过授予或拒绝授予权限来保护的对象。图4列出了SQL Server 2008中可保护的对象的层次。在服务器级别,你可以保护网络终端来控制通信路线进出服务器,还有数据库、绑定和角色以及登陆。在数据库和schema级别,事实上你可以创建的每一个对象都是可得到的,包括那些存在于schema之中的。