探讨 SQL Server 2005 的安全策略

 

一、简介

  SQL Server 2005 是继 SQL Server 2000 之后的又一次重大成功。单从安全方面看,它在认证和授权方面比以往都有了大幅度的提高;同时,它还提供了本机加密支持—能够实现比以往其它版本更安全的数据库应用程序设计和实现。

“自古以来”,软件安全是一个相当重要的问题。 Windows 2003 Server 是微软第一个“缺省安全”产品。缺省情况下,整个服务器是被锁定的,所以,你必须自己去激活每个你想要使用的服务。因此,一个攻击者必须花费相当的代价才能攻破该系统。

与此相同的策略被应用到 SQL Server 2005 中。缺省地,整个数据库服务器也被锁定,这样每个服务和特性必须通过手工激活才能使用。由于这个原因, SQL Server 与 SQL Server 表面区域配置工具一同发行—通过这个配置工具,你可以定义在 SQL Server 的安装过程中哪些服务和特性将被激活。

本文我们主要分析一下在新版的 SQL Server 2005 中,其在安全方面作出的重大改进。

二、   认证

  认证是你成功存取 SQL Server 的第一步。下图 1 展示了这种安全概念背后的相应模型。

探讨SQL Server 2005的安全策略(图一) 

图 1.SQL Server 的安全概念

  就象以前的版本一样, SQL Server 2005 也支持 Windows 和混合的认证方式。由于安全原因,微软特别推荐使用 Windows 认证方式。在这种方式下,安全检查是针对于活动目录进行的;但是,这样的缺点是,用户和数据库服务器必须驻留在相同的活动目录域内。

  当你使用 SQL Server 混合认证方式时,由 SQL Server 负责处理登录委任状。这种配置在有些时候非常重要;但是,随之而来的缺限是你无法使用诸如活动目录等所提供的底层安全架构。

  SQL Server 2005 新增的一项功能就是,当你使用 Windows 认证模式时,它能够对认证过程的口令字和注销策略进行管理。你可以管理帐户约束、如强口令字或终止日期等。然而必须注意,只有在 SQL Server 2005 安装到 Windows 2003 Server 上时你才能使用这些特性。 另外,这些功能相应的 API 在其它 Windows 平台上是无法使用的。

  在你为一个帐户设置口令时,可以使用下列限制:

口令的长度必须是至少 6 个字符( SQL Server 支持从 1 到 128 个字符的口令长度)。

口令必须使用不同类型的字符(大写,小写,数字,特殊的符号等等)。

口令中不能包含象“ Admin ”,“ Administrator ”,“ Password ”,“ sa ”或者“ sysadmin ”这样的短语。

  除这些限制以外,一个口令字不能为空。

  当你建立一个新的登录时,你可以通过 T-SQL 语句 CREATE LOGIN 使用扩展的 CHECK_EXPIRATION 和 CHECK_POLICY 来实现。 CHECK_EXPIRATION 能够控制登录的终止日期,而 CHECK_POLICY 用于激活上面描述的口令策略机制。新的选项 MUST_CHANGE 能够让用户在第一次登录时可以改变他 / 她的口令( SQL Server 2005 Beta 2 版不支持这个特征)。列表 1 展示了使用这些新选项的部分代码:

列表 1

CREATE LOGIN Paul   WITH PASSWORD='P@ssw0rd1' MUST_CHANGE, CHECK_EXPIRATION = ON, CHECK_POLICY = ON

  SQL Server 2005 也支持终点认证以确保 SQL Server 在通过 Windows Server 2003 平台上的 http.sys 对外提供 XML Web 服务时进行安全的通讯。

三、   授权

  在一个用户被 SQL Server 成功地认证后,接下来进行的是授权过程以决定该用户在数据库上有哪些权限。在这一方面, SQL Server 2005 又增加了两个新特性:

用户与模式分离开来

执行上下文

•  用户和模式的分离

•  模式是一个容器—你可以在其中对数据库对象(表,存储过程,视图,等等。)进行逻辑分组。这与 .NET 框架基类库中的命名空间是一样的。因为 SQL Server 中的一个模式也可能有一个所有者,因此你可以指令在一个给定模式中的每个对象都拥有一个相同的所有者。 SQL Server 2000 的实现模式并不很好:模式的名字与用户的名字是相同的。因此,在模式和数据库对象的所有者之间存在一个直接的关系(见图 2 )。

探讨SQL Server 2005的安全策略(图二)

图 2. 原来在 SQL Server 2000 中的用户和模式关系

  SQL Server 2000 中的最大问题在于在一给定模式中的对象必须使用完全限定名( schema.objectname );但是,当你从数据库中删除一个表时,该对象的完全限定名会发生改变。因此,你对数据库所作的改变将也会不幸地发生到客户端的查询中,而且有时这样的改变将付出昂贵的代价。而在 SQL Server 2005 中,模式成为数据库中一个单独的拥有名字和所有者的本机对象。这样的模式与用户不再存在关系(见图 3 )。

探讨SQL Server 2005的安全策略(图三)

图 3. 在 SQL Server 2005 中用户和模式分离开来

  现在,你能在数据库中删除和添加新用户而不用修改软件(客户端和数据库端都不用)。而且,你能把权限赋给一个模式以实现对该模式中对象的存取。列表 2 展示了 SQL Server 2005 中的模式用法。

列表 2

USE master GO 建立数据库登录 CREATE LOGIN Paul WITH PASSWORD='p@ssw0rd1' CREATE LOGIN Mary WITH PASSWORD='p@ssw0rd1' USE TestDatabase GO CREATE USER Paul FOR LOGIN Paul CREATE USER Mary FOR LOGIN Mary --创建一新模式 CREATE SCHEMA SalesData 在模式“ SalesData”中创建一新表 CREATE TABLE SalesData.SalesPromotion ( ID int,   [Name] varchar(255)) GRANT ALL ON SalesData TO Paul ALTER USER Paul WITH DEFAULT SCHEMA = SalesData GRANT SELECT ON SCHEMA::SalesData TO MARY

( 二 )  执行上下文

  SQL Server 2005 的另外一个新特征是允许你改变一个存储过程的执行上下文。你可以通过用 EXECUTE AS 语句来改变执行上下文进而控制这些数据库对象是以哪些用户身份执行的。 EXECUTE AS 语句支持下列选项 :

EXECUTE AS CALLER

EXECUTE AS USER='user name'

EXECUTE AS SELF

EXECUTE AS OWNER

EXECUTE AS CALLER 是默认选项,这时一个存储过程是以调用用户的身份执行的。使用 EXECUTE AS USER 选项时,存储过程则用你指定的用户身份执行。当你使用 EXECUTE AS SELF 时,存储过程用创建者的身份执行。最后,你可以使用 EXECUTE AS OWNER 来执行存储过程,其身份是该对象的所有者。

四、   密码学技术

  当你在某一应用程序中使用密码学技术时,你必须设法对密钥(或是一非对称算法的私人密钥或是一对称算法的共享密钥)进行管理。 SQL Server 2005 提供了两个选项来管理用户密钥:

用户自己管理密钥

由 SQL Server 为你管理密钥

  当你自己管理密钥时, SQL Server 用存在于数据库中的一给定口令字来存储对称密钥,这时你必须把该口令字保存在一个秘密的地方。而当由 SQL Server 来替你管理密钥时,它使用服务主键和数据库主键技术。图 4 展示了这一概念背后的思想。

探讨SQL Server 2005的安全策略(图四)

图 4.SQL Server 2005 中的服务和数据库主键

  正如你所见,这个服务主键处于服务器级别上。该键在 SQL Server 安装过程中被创建并且通过数据保护 API ( DPAPI )保护起来。用几个 T-SQL 语句,你就能把服务主键复制到一个文件中并能够从文件中恢复回去。

  数据库主键处于数据库级上并且必须通过 administrator 来显式地创建。可以通过口令或服务主键来对该主键进行加密。列表 3 说明了如何创建数据库主键:

列表 3

CREATE MASTER KEY ENCRYPTION BY PASSWORD='p@ssw0rd1'

一旦你创建了数据库主键,你就拥有了下列选项 :

用对称密钥加密

用非对称密钥加密

用证书加密

  你可以用 T-SQL 语句“ CREATE SYMMETRIC KEY ”来创建一对称密钥。这样的加密是通过一存储在表 sys.symmetric_keys 中的口令字或数据库主键进行的。为了使用一对称密钥,你必须先用语句 OPEN KEY (见图 5 )打开它(这包括密钥的解密),之后,你就可以把该密钥用于你自己的加密目的。

探讨SQL Server 2005的安全策略(图五) 

图 5. 用对称密钥进行加密

  对称密钥的优点在于它的高性能—它大约比同样的非对称密钥快 1 , 000 到 10 , 000 倍。缺点是加密和解密都使用一把密钥,而且双方都必须知道该密钥。你可以用语句“ CREATE ASYMMETRIC KEY ”来创建一非对称密钥。这样的密钥还可以通过一口令字或数据库主键来加密。列表 4 告诉你如何创建一非对称密钥:

列表 4

--用口令加密 CREATE ASYMMETRIC KEY MyKeyName AUTHORIZATION User1 WITH ALGORITHM = RSA_512 ENCRYPTED BY PASSWORD = 'p@ssw0rd1' --用数据库主键加密 CREATE ASYMMETRIC KEY MyKeyName AUTHORIZATION User1 WITH ALGORITHM = RSA_512

一非对称密钥总是被存储在表 sys.asymmetric_keys 中。在你创建该密钥后,你能使用函数 EncryptByAsmKey 来加密数据而用 DecryptByAsmKey 来解密被加密的数据。列表 5 展示了这两个函数的使用:

列表 5

DECLARE @EncryptedStuff varchar(1000) SELECT @EncryptedStuff = EncryptByAsmKey(AsymKey_ID('MyKeyName'), 'My secret message') SELECT @EncrytedStuff SELECT CAST(DecryptByAsmKey(AsymKey_ID('MyKeyName'), EncryptedStuff) AS VARCHAR)

  最后,你还可以使用证书来加密数据,或者是一个现有证书—把它导入进数据库服务器中即可或是一个通过 T-SQL 语句“ CREATE CERTIFICATE ”创建的新证书。一个证书本身也能通过一口令字或通过数据库主键被加密。列表 6 显示出这两种可能性:

-- 用口令加密 CREATE CERTIFICATE MyCertificateName AUTHORIZATION User1 WITH Subject 'My Subject', EXPIRY_DATE = '12/31/2006', ENCRYPTION_PASSWORD = 'p@ssw0rd1' -- 用数据库主键加密 CREATE CERTIFICATE MyCertificateName AUTHORIZATION User1 WITH Subject 'My Subject'

五、   小结

  本文通过一些片断示例,分析了 SQL Server 2005 在安全方面提供的新功能。尤其应注意到,它在密码功能上作了很大改进。 SQL Server 2005 将更加成熟起来并在大型企业开发领域发挥重要作用。